Fix autocompletion for role names/user names

patch by Francisco Guerrero; reviewed by Stefan Miklosovic, Bernardo Botella for CASSANDRA-20175
This commit is contained in:
Francisco Guerrero 2024-12-27 14:12:17 -08:00 committed by Stefan Miklosovic
parent 8e28dd0c17
commit 4f9e474bb1
No known key found for this signature in database
GPG Key ID: 32F35CB2F546D93E
3 changed files with 10 additions and 14 deletions

View File

@ -1,4 +1,5 @@
4.0.17
* Fix autocompletion for role names/user names (CASSANDRA-20175)
4.0.16

View File

@ -1472,9 +1472,9 @@ syntax_rules += r'''
'''
syntax_rules += r'''
<rolename> ::= <identifier>
<rolename> ::= role=( <identifier>
| <quotedName>
| <unreservedKeyword>
| <unreservedKeyword> )
;
<createRoleStatement> ::= "CREATE" "ROLE" <rolename>
@ -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('<username>')]
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('<rolename>')]
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'''

View File

@ -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=['<rolename>'])
self.trycompletions('CREATE USER ', choices=['<username>', 'IF'])