From 83c1f7713bf24ec4873cfa9f76f2efccc8a23278 Mon Sep 17 00:00:00 2001 From: Brad Schoening <5796692+bschoening@users.noreply.github.com> Date: Mon, 3 Oct 2022 10:31:07 +0200 Subject: [PATCH] Fix auto-completing "WITH" when creating a materialized view (CASSANDRA-17879) patch by Brad Schoening; reviewed by Stefan Miklosovic and Brandon Williams for CASSANDRA-17879 --- CHANGES.txt | 1 + pylib/cqlshlib/cql3handling.py | 21 ++++++++++++++++---- pylib/cqlshlib/test/test_cqlsh_completion.py | 11 ++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index d070392755..14efe64814 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.28 + * Fix auto-completing "WITH" when creating a materialized view (CASSANDRA-17879) * Fix scrubber falling into infinite loop when the last partition is broken (CASSANDRA-17862) * Improve libjemalloc resolution in bin/cassandra (CASSANDRA-15767) * Fix missing state resetting on CompressedRandomAccessReader read errors (CASSANDRA-17314) diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py index 231158a055..f8d4e354cd 100644 --- a/pylib/cqlshlib/cql3handling.py +++ b/pylib/cqlshlib/cql3handling.py @@ -358,6 +358,11 @@ completer_for('property', 'propeq')(prop_equals_completer) def prop_name_completer(ctxt, cass): if working_on_keyspace(ctxt): return ks_prop_name_completer(ctxt, cass) + elif 'MATERIALIZED' == ctxt.get_binding('wat', '').upper(): + props = cf_prop_name_completer(ctxt, cass) + props.remove('default_time_to_live') + props.remove('gc_grace_seconds') + return props else: return cf_prop_name_completer(ctxt, cass) @@ -672,7 +677,7 @@ def get_ut_layout(ctxt, cass): def working_on_keyspace(ctxt): - wat = ctxt.get_binding('wat').upper() + wat = ctxt.get_binding('wat', '').upper() if wat in ('KEYSPACE', 'SCHEMA'): return True return False @@ -1182,9 +1187,16 @@ syntax_rules += r''' ( "USING" ( "WITH" "OPTIONS" "=" )? )? ; - ::= "CREATE" "MATERIALIZED" "VIEW" ("IF" "NOT" "EXISTS")? ? - "AS" - "PRIMARY" "KEY" + + ::= "(" ( "," )* ")" + ; + + ::= "CREATE" wat="MATERIALIZED" "VIEW" ("IF" "NOT" "EXISTS")? viewname=? + "AS" "SELECT" + "FROM" cf= + "WHERE" "IS" "NOT" "NULL" ( "AND" "IS" "NOT" "NULL")* + "PRIMARY" "KEY" ( | ( "(" ( "," )* ")" )) + ( "WITH" ( "AND" )* )? ; ::= "CREATE" "TYPE" ( ks= dot="." )? typename= "(" newcol= @@ -1218,6 +1230,7 @@ syntax_rules += r''' ''' explain_completion('createIndexStatement', 'indexname', '') +explain_completion('createMaterializedViewStatement', 'viewname', '') explain_completion('createUserTypeStatement', 'typename', '') explain_completion('createUserTypeStatement', 'newcol', '') diff --git a/pylib/cqlshlib/test/test_cqlsh_completion.py b/pylib/cqlshlib/test/test_cqlsh_completion.py index 87315bcd62..45238c1686 100644 --- a/pylib/cqlshlib/test/test_cqlsh_completion.py +++ b/pylib/cqlshlib/test/test_cqlsh_completion.py @@ -688,6 +688,17 @@ class TestCqlshCompletion(CqlshCompletionCase): self.trycompletions('CREATE CO', immediate='LUMNFAMILY ') self.create_columnfamily_table_template('COLUMNFAMILY') + def test_complete_in_create_materializedview(self): + self.trycompletions('CREATE MAT', immediate='ERIALIZED VIEW ') + self.trycompletions('CREATE MATERIALIZED VIEW AS ', choices=['AS', 'SELECT']) + self.trycompletions('CREATE MATERIALIZED VIEW AS SELECT * ', immediate='FROM ') + self.trycompletions('CREATE MATERIALIZED VIEW AS SELECT * FROM system.peers ', immediate = 'WHERE ') + self.trycompletions('CREATE MATERIALIZED VIEW AS SELECT * FROM system.peers WHERE host_id ', immediate='IS NOT NULL ' ) + self.trycompletions('CREATE MATERIALIZED VIEW AS SELECT * FROM system.peers WHERE host_id IS NOT NULL PR', immediate='IMARY KEY ( ') + self.trycompletions('CREATE MATERIALIZED VIEW AS SELECT * FROM system.peers WHERE host_id IS NOT NULL PRIMARY KEY (host_id) ', choices=[';','WITH']) + self.trycompletions('CREATE MATERIALIZED VIEW AS SELECT * FROM system.peers WHERE host_id IS NOT NULL PRIMARY KEY (a, b) ', choices=[';','WITH']) + self.trycompletions('CREATE MATERIALIZED VIEW AS SELECT * FROM system.peers WHERE host_id IS NOT NULL PRIMARY KEY ((a,b), c) ', choices=[';','WITH']) + def test_complete_in_create_table(self): self.trycompletions('CREATE T', choices=['TRIGGER', 'TABLE', 'TYPE']) self.trycompletions('CREATE TA', immediate='BLE ')