diff --git a/CHANGES.txt b/CHANGES.txt index fb82600c97..09a9bee44d 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 4.0.17 + * Fix autocompletion for role names/user names (CASSANDRA-20175) 4.0.16 diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py index 3d1b16386f..a813c345f1 100644 --- a/pylib/cqlshlib/cql3handling.py +++ b/pylib/cqlshlib/cql3handling.py @@ -1472,9 +1472,9 @@ syntax_rules += r''' ''' syntax_rules += r''' - ::= + ::= role=( | - | + | ) ; ::= "CREATE" "ROLE" @@ -1564,32 +1564,22 @@ syntax_rules += r''' @completer_for('username', 'name') def username_name_completer(ctxt, cass): - def maybe_quote(name): - if CqlRuleSet.is_valid_cql3_name(name): - return name - return "'%s'" % name - # disable completion for CREATE USER. if ctxt.matched[0][1].upper() == 'CREATE': return [Hint('')] session = cass.session - return [maybe_quote(list(row.values())[0].replace("'", "''")) for row in session.execute("LIST USERS")] + return map(maybe_escape_name, [row['name'] for row in session.execute("LIST USERS")]) @completer_for('rolename', 'role') def rolename_completer(ctxt, cass): - def maybe_quote(name): - if CqlRuleSet.is_valid_cql3_name(name): - return name - return "'%s'" % name - # disable completion for CREATE ROLE. if ctxt.matched[0][1].upper() == 'CREATE': return [Hint('')] session = cass.session - return [maybe_quote(row[0].replace("'", "''")) for row in session.execute("LIST ROLES")] + return map(maybe_escape_name, [row['role'] for row in session.execute("LIST ROLES")]) syntax_rules += r''' diff --git a/pylib/cqlshlib/test/test_cqlsh_completion.py b/pylib/cqlshlib/test/test_cqlsh_completion.py index 9d902e43b3..8585e3496e 100644 --- a/pylib/cqlshlib/test/test_cqlsh_completion.py +++ b/pylib/cqlshlib/test/test_cqlsh_completion.py @@ -837,3 +837,8 @@ class TestCqlshCompletion(CqlshCompletionCase): self.trycompletions('ALTER KEYSPACE system_trac', "es WITH replication = {'class': '") self.trycompletions("ALTER KEYSPACE system_traces WITH replication = {'class': '", '', choices=['NetworkTopologyStrategy', 'SimpleStrategy']) + + def test_complete_in_create_role(self): + self.trycompletions('CREATE ROLE ', choices=['']) + self.trycompletions('CREATE USER ', choices=['', 'IF']) +