This is an automated email from the ASF dual-hosted git repository. mck pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push: new 1b1b87c Strip comment blocks from cqlsh input before processing statements 1b1b87c is described below commit 1b1b87cfe3a9a93c393d1f3c1e003394260edeb5 Author: Rens Groothuijsen <l.groothuij...@alumni.maastrichtuniversity.nl> AuthorDate: Wed May 20 20:31:14 2020 +0200 Strip comment blocks from cqlsh input before processing statements patch by Rens Groothuijsen; reviewed by Mick Semb Wever for CASSANDRA-15802 --- CHANGES.txt | 1 + bin/cqlsh.py | 19 ++++++++++ pylib/cqlshlib/test/test_cql_parsing.py | 65 +++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) diff --git a/CHANGES.txt b/CHANGES.txt index 3e23053..3272226 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 4.0-beta2 + * Strip comment blocks from cqlsh input before processing statements (CASSANDRA-15802) * Fix unicode chars error input (CASSANDRA-15990) * Improved testability for CacheMetrics and ChunkCacheMetrics (CASSANDRA-15788) * Handle errors in StreamSession#prepare (CASSANDRA-15852) diff --git a/bin/cqlsh.py b/bin/cqlsh.py index 1ef0c91..3f60094 100644 --- a/bin/cqlsh.py +++ b/bin/cqlsh.py @@ -39,6 +39,7 @@ import getpass import optparse import os import platform +import re import sys import traceback import warnings @@ -910,12 +911,30 @@ class Shell(cmd.Cmd): self.reset_statement() print('') + def strip_comment_blocks(self, statementtext): + comment_block_in_literal_string = re.search('["].*[/][*].*[*][/].*["]', statementtext) + if not comment_block_in_literal_string: + result = re.sub('[/][*].*[*][/]', "", statementtext) + if '*/' in result and '/*' not in result and not self.in_comment: + raise SyntaxError("Encountered comment block terminator without being in comment block") + if '/*' in result: + result = re.sub('[/][*].*', "", result) + self.in_comment = True + if '*/' in result: + result = re.sub('.*[*][/]', "", result) + self.in_comment = False + if self.in_comment and not re.findall('[/][*]|[*][/]', statementtext): + result = '' + return result + return statementtext + def onecmd(self, statementtext): """ Returns true if the statement is complete and was handled (meaning it can be reset). """ statementtext = ensure_text(statementtext) + statementtext = self.strip_comment_blocks(statementtext) try: statements, endtoken_escaped = cqlruleset.cql_split_statements(statementtext) except pylexotron.LexingError as e: diff --git a/pylib/cqlshlib/test/test_cql_parsing.py b/pylib/cqlshlib/test/test_cql_parsing.py index 10be99f..8631d7a 100644 --- a/pylib/cqlshlib/test/test_cql_parsing.py +++ b/pylib/cqlshlib/test/test_cql_parsing.py @@ -711,6 +711,71 @@ class TestCqlParsing(TestCase): def test_parse_select_token(self): pass + def test_strip_comment_blocks_from_input(self): + + parsed = parse_cqlsh_statements('SELECT FROM /* comment block */ "MyTable";') + self.assertSequenceEqual(tokens_with_types(parsed), + [('SELECT', 'reserved_identifier'), + ('FROM', 'reserved_identifier'), + ('"MyTable"', 'quotedName'), + (';', 'endtoken')]) + + parsed = parse_cqlsh_statements('SELECT FROM /* \n comment block starts here; \n and continues here \n */ "MyTable";') + self.assertSequenceEqual(tokens_with_types(parsed), + [('SELECT', 'reserved_identifier'), + ('FROM', 'reserved_identifier'), + ('"MyTable"', 'quotedName'), + (';', 'endtoken')]) + + parsed = parse_cqlsh_statements(''' + SELECT FROM /* + comment block starts here; + and continues here + */ "MyTable"; + ''') + self.assertSequenceEqual(tokens_with_types(parsed), + [('SELECT', 'reserved_identifier'), + ('FROM', 'reserved_identifier'), + ('"MyTable"', 'quotedName'), + (';', 'endtoken')]) + + parsed = parse_cqlsh_statements(''' + /* comment block */ + SELECT FROM "MyTable"; + ''') + self.assertSequenceEqual(tokens_with_types(parsed), + [('SELECT', 'reserved_identifier'), + ('FROM', 'reserved_identifier'), + ('"MyTable"', 'quotedName'), + (';', 'endtoken')]) + + parsed = parse_cqlsh_statements(''' + /* comment block */ + /* another comment */ SELECT FROM /* + comment block starts here; + and continues here + */ "MyTable"; + ''') + self.assertSequenceEqual(tokens_with_types(parsed), + [('SELECT', 'reserved_identifier'), + ('FROM', 'reserved_identifier'), + ('"MyTable"', 'quotedName'), + (';', 'endtoken')]) + + parsed = parse_cqlsh_statements(''' + SELECT FROM "/*MyTable*/"; + ''') + self.assertSequenceEqual(tokens_with_types(parsed), + [('SELECT', 'reserved_identifier'), + ('FROM', 'reserved_identifier'), + ('"/*MyTable*/"', 'quotedName'), + (';', 'endtoken')]) + + parse_cqlsh_statements(''' + */ SELECT FROM "MyTable"; + ''') + self.assertRaises(SyntaxError) + def parse_cqlsh_statements(text): ''' --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org