[ 
https://issues.apache.org/jira/browse/CASSANDRA-10415?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14948574#comment-14948574
 ] 

Stefania commented on CASSANDRA-10415:
--------------------------------------

[~thobbs] I would like to see if you have any ideas (without spending too much 
time) about this problem. Basically since we removed the {{K_XXX}} rules, we no 
longer complete correctly {{IF NOT EXIST}}. For example if we type {{CREATE 
TABLE IF}} followed by a TAB, with the {{K_XXX}} rules the valid completion was 
{{NOT EXISTS}} whereas now it's {{(    NOT}}

Here is the rule:

{code}
<createColumnFamilyStatement> ::= "CREATE" wat=( "COLUMNFAMILY" | "TABLE" ) 
("IF" "NOT" "EXISTS")?
                                    ( ks=<nonSystemKeyspaceName> dot="." )? 
cf=<cfOrKsName>
                                    "(" ( <singleKeyCfSpec> | 
<compositeKeyCfSpec> ) ")"
                                   ( "WITH" <cfamProperty> ( "AND" 
<cfamProperty> )* )?
                                ;
{code}

And here is the debug information:

{code}
item 'NOT' added by:
  - word_match('NOT').match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:294)
    - <ParseContext matched=(('identifier', 'CREATE', (0, 6)), ('identifier', 
'TABLE', (7, 12)), ('identifier', 'IF', (13, 15))) remainder=() 
prodname='createColumnFamilyStatement' bindings={'wat': 'TABLE', 'partial': '', 
'cassandra_conn': <__main__.Shell instance at 0x7f0273b63ef0>, '*LASTTYPE*': 
'identifier', '*DEBUG*': True, '*SRC*': 'CREATE TABLE
 IF '}>
  - rule_series([word_match('IF'), word_match('NOT'), 
word_match('EXISTS')]).match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:216)
  - one_or_none(rule_series([word_match('IF'), word_match('NOT'), 
word_match('EXISTS')])).match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:179)
  - rule_series([word_match('CREATE'), named_symbol('wat', 
choice([word_match('COLUMNFAMILY'), word_match('TABLE')])), 
one_or_none(rule_series([word_match('IF'), word_match('NOT'), 
word_match('EXISTS')])), one_or_none(rule_series([named_symbol('ks', 
rule_reference('nonSystemKeyspaceName')), named_symbol('dot', 
text_match('.'))])), named_symbol('cf', rule_reference('cfOrKsName')), 
text_match('('), choice([rule_reference('singleKeyCfSpec'), 
rule_reference('compositeKeyCfSpec')]), text_match(')'), 
one_or_none(rule_series([word_match('WITH'), rule_reference('cfamProperty'), 
repeat(rule_series([word_match('AND'), 
rule_reference('cfamProperty')]))]))]).match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:216)
  - rule_reference('createColumnFamilyStatement').match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:205)
  - choice([rule_reference('createKeyspaceStatement'), 
rule_reference('createColumnFamilyStatement'), 
rule_reference('createIndexStatement'), 
rule_reference('createUserTypeStatement'), 
rule_reference('createFunctionStatement'), 
rule_reference('createAggregateStatement'), 
rule_reference('createTriggerStatement'), 
rule_reference('dropKeyspaceStatement'), 
rule_reference('dropColumnFamilyStatement'), 
rule_reference('dropIndexStatement'), rule_reference('dropUserTypeStatement'), 
rule_reference('dropFunctionStatement'), 
rule_reference('dropAggregateStatement'), 
rule_reference('dropTriggerStatement'), rule_reference('alterTableStatement'), 
rule_reference('alterKeyspaceStatement'), 
rule_reference('alterUserTypeStatement')]).match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:171)
  - rule_reference('schemaChangeStatement').match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:205)
  - choice([rule_reference('useStatement'), rule_reference('selectStatement'), 
rule_reference('dataChangeStatement'), rule_reference('schemaChangeStatement'), 
rule_reference('authenticationStatement'), 
rule_reference('authorizationStatement')]).match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:171)
  - rule_reference('statementBody').match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:205)
  - rule_reference('statementBody').match_with_results() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:136)
Trying completer <function completerwrapper_on_create_cf_ks_dot_completer at 
0x7f0273b41488> with <ParseContext matched=(('identifier', 'CREATE', (0, 6)), 
('identifier', 'TABLE', (7, 12)), ('identifier', 'IF', (13, 15))) remainder=() 
prodname='createColumnFamilyStatement' bindings={'ks': 'IF', 'ksname': 'IF', 
'*LASTTYPE*': 'identifier', 'wat': 'TABLE', 'partial': '', 'cassandra_conn': 
<__main__.Shell instance at 0x7f0273b63ef0>, '*DEBUG*': True, '*SRC*': 'CREATE 
TABLE IF '}>
got []

item '(' added by:
  - text_match('(').match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:294)
    - <ParseContext matched=(('identifier', 'CREATE', (0, 6)), ('identifier', 
'TABLE', (7, 12)), ('identifier', 'IF', (13, 15))) remainder=() 
prodname='createColumnFamilyStatement' bindings={'*LASTTYPE*': 'identifier', 
'*SRC*': 'CREATE TABLE IF ', 'partial': '', 'cassandra_conn': <__main__.Shell 
instance at 0x7f0273b63ef0>, '*DEBUG*': True, 'wat': 'TABLE', 'cf': 'IF'}>
  - rule_series([word_match('CREATE'), named_symbol('wat', 
choice([word_match('COLUMNFAMILY'), word_match('TABLE')])), 
one_or_none(rule_series([word_match('IF'), word_match('NOT'), 
word_match('EXISTS')])), one_or_none(rule_series([named_symbol('ks', 
rule_reference('nonSystemKeyspaceName')), named_symbol('dot', 
text_match('.'))])), named_symbol('cf', rule_reference('cfOrKsName')), 
text_match('('), choice([rule_reference('singleKeyCfSpec'), 
rule_reference('compositeKeyCfSpec')]), text_match(')'), 
one_or_none(rule_series([word_match('WITH'), rule_reference('cfamProperty'), 
repeat(rule_series([word_match('AND'), 
rule_reference('cfamProperty')]))]))]).match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:216)
  - rule_reference('createColumnFamilyStatement').match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:205)
  - choice([rule_reference('createKeyspaceStatement'), 
rule_reference('createColumnFamilyStatement'), 
rule_reference('createIndexStatement'), 
rule_reference('createUserTypeStatement'), 
rule_reference('createFunctionStatement'), 
rule_reference('createAggregateStatement'), 
rule_reference('createTriggerStatement'), 
rule_reference('dropKeyspaceStatement'), 
rule_reference('dropColumnFamilyStatement'), 
rule_reference('dropIndexStatement'), rule_reference('dropUserTypeStatement'), 
rule_reference('dropFunctionStatement'), 
rule_reference('dropAggregateStatement'), 
rule_reference('dropTriggerStatement'), rule_reference('alterTableStatement'), 
rule_reference('alterKeyspaceStatement'), 
rule_reference('alterUserTypeStatement')]).match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:171)
  - rule_reference('schemaChangeStatement').match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:205)
  - choice([rule_reference('useStatement'), rule_reference('selectStatement'), 
rule_reference('dataChangeStatement'), rule_reference('schemaChangeStatement'), 
rule_reference('authenticationStatement'), 
rule_reference('authorizationStatement')]).match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:171)
  - rule_reference('statementBody').match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:205)
  - rule_reference('statementBody').match_with_results() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:136)
  - named_collector('statements', rule_reference('statementBody')).match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:249)
  - rule_series([named_collector('statements', 
rule_reference('statementBody')), text_match(';')]).match() 
(/home/stefi/git/cstar/cassandra/bin/../pylib/cqlshlib/pylexotron.py:216)
{code}

It looks like {{IF}} is treated as a valid table name because it doesn't know 
it is a reserved keyword. We need to somehow treat reserved keywords in a 
special way, the {{identifier}} rule seems too generic. Do you have any ideas? 
Would adding all reserved keywords to a very long {{(aaa|bbb|........)}} rule 
work?

> Fix cqlsh bugs
> --------------
>
>                 Key: CASSANDRA-10415
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-10415
>             Project: Cassandra
>          Issue Type: Sub-task
>            Reporter: Jim Witschey
>            Assignee: Stefania
>              Labels: cqlsh
>             Fix For: 3.0.0 rc2
>
>
> This is followup to CASSANDRA-10289
> The tests currently failing should be:
> * 
> {{cqlshlib.test.test_cqlsh_completion.TestCqlshCompletion.test_complete_in_create_columnfamily}}
> ** uses {{create_columnfamily_table_template}}. Stefania says "the {{(}} 
> after {{CREATE ... IF}} does not look valid to me."
> * 
> {{cqlshlib.test.test_cqlsh_completion.TestCqlshCompletion.test_complete_in_create_table}}
> ** uses {{create_columnfamily_table_template}}, see above.
> * 
> {{cqlshlib.test.test_cqlsh_completion.TestCqlshCompletion.test_complete_in_delete}}
> ** Stefania says: "I don't think keyspaces are a valid completion after 
> {{DELETE a [}} and after {{DELETE FROM twenty_rows_composite_table USING 
> TIMESTAMP 0 WHERE TOKEN(a) >=}}. From a quick analysis of {{cqlhandling.py}} 
> I think it comes from {{<term>}}, which picks up {{<functionName>}}, which 
> was changed to include {{ks.}} by CASSANDRA-7556.
> * 
> {{cqlshlib.test.test_cqlsh_completion.TestCqlshCompletion.test_complete_in_drop_keyspace}}
> ** Stefania says: "the {{;}} after {{DROP KEYSPACE IF}} is not valid.
> * {{cqlshlib.test.test_cqlsh_output.TestCqlshOutput.test_timestamp_output}}
> ** already documented with CASSANDRA-10313 and CASSANDRA-10397
> I'm happy to break these out into separate tickets if necessary. 
> To run the tests locally, I cd to {{cassandra/pylib/cqlshlib}} and run the 
> following:
> {code}
> ccm create -n 1 --install-dir=../.. test
> ccm start --wait-for-binary-proto
> nosetests test 2>&1
> ccm remove
> {code}
> This requires nose and ccm. Until CASSANDRA-10289 is resolved, you'll have to 
> use my branch here: https://github.com/mambocab/cassandra/tree/fix-cqlsh-tests
> Tests for this branch are run (non-continuously) here:
> http://cassci.datastax.com/job/scratch_mambocab-fix_cqlsh/
> Assigning [~Stefania] for now, since she's already looked at 10289, but feel 
> free to reassign.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to