Updated Branches: refs/heads/trunk effdb08b3 -> 207cdf301
cqlsh: Remove ASSUME command patch by Aleksey Yeschenko; reviewed by Brandon Williams for CASSANDRA-5331 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/207cdf30 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/207cdf30 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/207cdf30 Branch: refs/heads/trunk Commit: 207cdf30133a77b09942c3e7d4df9bc5b2161137 Parents: effdb08 Author: Aleksey Yeschenko <[email protected]> Authored: Fri Mar 22 00:20:13 2013 +0300 Committer: Aleksey Yeschenko <[email protected]> Committed: Fri Mar 22 00:20:13 2013 +0300 ---------------------------------------------------------------------- CHANGES.txt | 1 + NEWS.txt | 3 + bin/cqlsh | 171 +-------------------- pylib/cqlshlib/test/test_cqlsh_commands.py | 3 - pylib/cqlshlib/test/test_cqlsh_completion.py | 4 +- pylib/cqlshlib/test/test_cqlsh_output.py | 22 --- 6 files changed, 10 insertions(+), 194 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/207cdf30/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index b7b0e42..fb96cbd 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -18,6 +18,7 @@ * Allow custom configuration loader (CASSANDRA-5045) * Remove memory emergency pressure valve logic (CASSANDRA-3534) * Reduce request latency with eager retry (CASSANDRA-4705) + * cqlsh: Remove ASSUME command (CASSANDRA-5331) 1.2.4 http://git-wip-us.apache.org/repos/asf/cassandra/blob/207cdf30/NEWS.txt ---------------------------------------------------------------------- diff --git a/NEWS.txt b/NEWS.txt index d796d39..6b94011 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -22,6 +22,9 @@ Upgrading Use CacheServiceMBean.set{Key,Row}CacheCapacityInMB() instead. - authority option in cassandra.yaml has been deprecated since 1.2.0, but it has been completely removed in 2.0. Please use 'authorizer' option. + - ASSUME command has been removed from cqlsh. Use CQL3 blobAsType() and + typeAsBlob() conversion functions instead. + See https://cassandra.apache.org/doc/cql3/CQL.html#blobFun for details. Operations ---------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/207cdf30/bin/cqlsh ---------------------------------------------------------------------- diff --git a/bin/cqlsh b/bin/cqlsh index 2456009..8875ff9 100755 --- a/bin/cqlsh +++ b/bin/cqlsh @@ -38,7 +38,6 @@ from StringIO import StringIO from itertools import groupby from contextlib import contextmanager, closing from glob import glob -from functools import partial from uuid import UUID import cmd @@ -102,8 +101,7 @@ except ImportError, e: import cql.decoders from cql.cursor import _VOID_DESCRIPTION -from cql.cqltypes import (cql_types, cql_typename, lookup_casstype, lookup_cqltype, - CassandraType) +from cql.cqltypes import (cql_types, cql_typename, lookup_casstype, CassandraType) # cqlsh should run correctly when run out of a Cassandra source tree, # out of an unpacked Cassandra tarball, and after a proper package install. @@ -183,7 +181,6 @@ my_commands_ending_with_newline = ( 'describe', 'desc', 'show', - 'assume', 'source', 'capture', 'debug', @@ -207,7 +204,6 @@ cqlsh_extra_syntax_rules = r''' <specialCommand> ::= <describeCommand> | <consistencyCommand> | <showCommand> - | <assumeCommand> | <sourceCommand> | <captureCommand> | <copyCommand> @@ -239,18 +235,9 @@ cqlsh_extra_syntax_rules = r''' | "EACH_QUORUM" ; -<showCommand> ::= "SHOW" what=( "VERSION" | "HOST" | "ASSUMPTIONS" ) +<showCommand> ::= "SHOW" what=( "VERSION" | "HOST" ) ; -<assumeCommand> ::= "ASSUME" cf=<columnFamilyName> <assumeTypeDef> - ( "," <assumeTypeDef> )* - ; - -<assumeTypeDef> ::= "NAMES" "ARE" names=<storageType> - | "VALUES" "ARE" values=<storageType> - | "(" colname=<colname> ")" "VALUES" "ARE" colvalues=<storageType> - ; - <sourceCommand> ::= "SOURCE" fname=<stringLiteral> ; @@ -291,16 +278,6 @@ cqlsh_extra_syntax_rules = r''' def complete_help(ctxt, cqlsh): return sorted([ t.upper() for t in cqldocs.get_help_topics() + cqlsh.get_help_topics() ]) -@cqlsh_syntax_completer('assumeTypeDef', 'colname') -def complete_assume_col(ctxt, cqlsh): - ks = ctxt.get_binding('ks', None) - ks = cqlsh.cql_unprotect_name(ks) if ks is not None else None - cf = cqlsh.cql_unprotect_name(ctxt.get_binding('cf')) - cfdef = cqlsh.get_columnfamily(cf, ksname=ks) - cols = [cm.name for cm in cfdef.column_metadata] - cols.append(cfdef.key_alias or 'KEY') - return cqlsh.cql_protect_names(cols) - def complete_source_quoted_filename(ctxt, cqlsh): partial = ctxt.get_binding('partial', '') head, tail = os.path.split(partial) @@ -512,7 +489,6 @@ class Shell(cmd.Cmd): self.statement = StringIO() self.lineno = 1 self.in_comment = False - self.schema_overrides = {} self.prompt = '' if stdin is None: @@ -575,32 +551,6 @@ class Shell(cmd.Cmd): vers['cql'] = self.cql_version print "[cqlsh %(shver)s | Cassandra %(build)s | CQL spec %(cql)s | Thrift protocol %(thrift)s]" % vers - def show_assumptions(self): - all_overrides = self.schema_overrides.items() - all_overrides.sort() - if all_overrides: - print - else: - print 'No overrides.' - return - for keyspace, ksoverrides in groupby(all_overrides, key=lambda x:x[0][0]): - keyspace = self.cql_protect_name(keyspace) - print 'USE %s;' % keyspace - print - for (ks, cf), override in ksoverrides: - cf = self.cql_protect_name(cf) - if override.default_name_type: - print 'ASSUME %s NAMES ARE %s;' \ - % (cf, cql_typename(override.default_name_type)) - if override.default_value_type: - print 'ASSUME %s VALUES ARE %s;' \ - % (cf, cql_typename(override.default_value_type)) - for colname, vtype in override.value_types.items(): - colname = self.cql_protect_name(colname) - print 'ASSUME %s(%s) VALUES ARE %s;' \ - % (cf, colname, cql_typename(vtype)) - print - def get_connection_versions(self): try: self.cursor.execute("select * from system.local where key = 'local'") @@ -969,13 +919,12 @@ class Shell(cmd.Cmd): if ksname is not None: ksname = self.cql_unprotect_name(ksname) cfname = self.cql_unprotect_name(parsed.get_binding('cfname')) - decoder = self.determine_decoder_for(cfname, ksname=ksname) statement = parsed.extract_orig() with_default_limit = parsed.get_binding('limit') is None if with_default_limit: statement = "%s LIMIT %d;" % (statement[:-1], DEFAULT_SELECT_LIMIT) self.perform_statement(statement, - decoder=decoder, + decoder=ErrorHandlingSchemaDecoder, with_default_limit=with_default_limit) def perform_statement(self, statement, decoder=None, with_default_limit=False): @@ -1042,15 +991,6 @@ class Shell(cmd.Cmd): def parseable_as_cql2(self, statement): return cqlhandling.CqlRuleSet.lex_and_whole_match(statement) is not None - def determine_decoder_for(self, cfname, ksname=None): - decoder = ErrorHandlingSchemaDecoder - if ksname is None: - ksname = self.current_keyspace - overrides = self.schema_overrides.get((ksname, cfname), None) - if overrides: - decoder = partial(decoder, overrides=overrides) - return decoder - def get_nametype(self, cursor, num): """ Determine the Cassandra type of a column name from the current row of @@ -1748,11 +1688,6 @@ class Shell(cmd.Cmd): SHOW HOST Shows where cqlsh is currently connected. - - SHOW ASSUMPTIONS - - Outputs the current list of type assumptions as specified by the - user. See the help for the ASSUME command for more information. """ showwhat = parsed.get_binding('what').lower() if showwhat == 'version': @@ -1760,73 +1695,9 @@ class Shell(cmd.Cmd): self.show_version() elif showwhat == 'host': self.show_host() - elif showwhat == 'assumptions': - self.show_assumptions() else: self.printerr('Wait, how do I show %r?' % (showwhat,)) - def do_assume(self, parsed): - """ - ASSUME [cqlsh only] - - Instruct cqlsh to consider certain column names or values to be of a - specified type, even if that type information is not specified in - the table's metadata. Data will be deserialized according to the - given type, and displayed appropriately when retrieved. - - Use thus: - - ASSUME [<keyspace>.]<tablename> NAMES ARE <type>; - - Treat all column names in the given table as being of the - given type. - - ASSUME [<keyspace>.]<tablename> VALUES ARE <type>; - - Treat all column values in the given table as being of the - given type, unless there is more information about the specific - column being deserialized. That is, a column-specific ASSUME will - take precedence here, as will column-specific metadata in the - table's definition. - - ASSUME [<keyspace>.]<tablename>(<colname>) VALUES ARE <type>; - - Treat all values in the given column in the given table as - being of the specified type. This overrides any other information - about the type of a value. - - Assign multiple overrides at once for the same table by - separating with commas: - - ASSUME ks.table NAMES ARE uuid, VALUES ARE int, (col) VALUES ARE ascii - - See HELP TYPES for information on the supported data storage types. - """ - ks = self.cql_unprotect_name(parsed.get_binding('ksname', None)) - cf = self.cql_unprotect_name(parsed.get_binding('cfname')) - colname = self.cql_unprotect_name(parsed.get_binding('colname', None)) - - params = {} - for paramname in ('names', 'values', 'colvalues'): - val = parsed.get_binding(paramname, None) - params[paramname] = self.cql_unprotect_value(val) - if ks is None: - if self.current_keyspace is None: - self.printerr('Error: not in any keyspace.') - return - ks = self.current_keyspace - - for overridetype in ('names', 'values', 'colvalues'): - cqltype = params[overridetype] - if cqltype is None: - continue - try: - validator_class = lookup_cqltype(cqltype).cass_parameterized_type() - except KeyError: - self.printerr('Error: validator type %s not found.' % cqltype) - else: - self.add_assumption(ks, cf, colname, overridetype, validator_class) - def do_source(self, parsed): """ SOURCE [cqlsh only] @@ -2067,41 +1938,7 @@ class Shell(cmd.Cmd): text = '%s:%d:%s' % (self.stdin.name, self.lineno, text) self.writeresult(text, color, newline=newline, out=sys.stderr) - def add_assumption(self, ksname, cfname, colname, valtype, valclass): - try: - v_info = self.schema_overrides[(ksname, cfname)] - except KeyError: - v_info = self.schema_overrides[(ksname, cfname)] = FakeCqlMetadata() - if valtype == 'names': - v_info.default_name_type = valclass - elif valtype == 'values': - v_info.default_value_type = valclass - elif valtype == 'colvalues': - v_info.value_types[colname] = valclass - -class FakeCqlMetadata: - def __init__(self): - self.name_types = {} - self.value_types = {} - self.default_name_type = None - self.default_value_type = None - -class OverrideableSchemaDecoder(cql.decoders.SchemaDecoder): - def __init__(self, schema, overrides=None): - cql.decoders.SchemaDecoder.__init__(self, schema) - self.apply_schema_overrides(overrides) - - def apply_schema_overrides(self, overrides): - if overrides is None: - return - if overrides.default_name_type is not None: - self.schema.default_name_type = overrides.default_name_type - if overrides.default_value_type is not None: - self.schema.default_value_type = overrides.default_value_type - self.schema.name_types.update(overrides.name_types) - self.schema.value_types.update(overrides.value_types) - -class ErrorHandlingSchemaDecoder(OverrideableSchemaDecoder): +class ErrorHandlingSchemaDecoder(cql.decoders.SchemaDecoder): def name_decode_error(self, err, namebytes, expectedtype): return DecodeError(namebytes, err, expectedtype) http://git-wip-us.apache.org/repos/asf/cassandra/blob/207cdf30/pylib/cqlshlib/test/test_cqlsh_commands.py ---------------------------------------------------------------------- diff --git a/pylib/cqlshlib/test/test_cqlsh_commands.py b/pylib/cqlshlib/test/test_cqlsh_commands.py index b8dd6f7..0b12882 100644 --- a/pylib/cqlshlib/test/test_cqlsh_commands.py +++ b/pylib/cqlshlib/test/test_cqlsh_commands.py @@ -26,9 +26,6 @@ class TestCqlshCommands(BaseTestCase): def tearDown(self): pass - def test_assume(self): - pass - def test_show(self): pass http://git-wip-us.apache.org/repos/asf/cassandra/blob/207cdf30/pylib/cqlshlib/test/test_cqlsh_completion.py ---------------------------------------------------------------------- diff --git a/pylib/cqlshlib/test/test_cqlsh_completion.py b/pylib/cqlshlib/test/test_cqlsh_completion.py index edb2b51..321ee5f 100644 --- a/pylib/cqlshlib/test/test_cqlsh_completion.py +++ b/pylib/cqlshlib/test/test_cqlsh_completion.py @@ -95,7 +95,7 @@ class TestCqlshCompletion_CQL2(CqlshCompletionCase): module = cqlsh.cqlhandling def test_complete_on_empty_string(self): - self.trycompletions('', choices=('?', 'ALTER', 'ASSUME', 'BEGIN', 'CAPTURE', 'CONSISTENCY', + self.trycompletions('', choices=('?', 'ALTER', 'BEGIN', 'CAPTURE', 'CONSISTENCY', 'COPY', 'CREATE', 'DEBUG', 'DELETE', 'DESC', 'DESCRIBE', 'DROP', 'HELP', 'INSERT', 'SELECT', 'SHOW', 'SOURCE', 'TRACING', 'TRUNCATE', 'UPDATE', 'USE', 'exit', 'quit')) @@ -178,7 +178,7 @@ class TestCqlshCompletion_CQL3final(TestCqlshCompletion_CQL2): module = cqlsh.cql3handling def test_complete_on_empty_string(self): - self.trycompletions('', choices=('?', 'ALTER', 'ASSUME', 'BEGIN', 'CAPTURE', 'CONSISTENCY', + self.trycompletions('', choices=('?', 'ALTER', 'BEGIN', 'CAPTURE', 'CONSISTENCY', 'COPY', 'CREATE', 'DEBUG', 'DELETE', 'DESC', 'DESCRIBE', 'DROP', 'GRANT', 'HELP', 'INSERT', 'LIST', 'REVOKE', 'SELECT', 'SHOW', 'SOURCE', 'TRACING', 'TRUNCATE', 'UPDATE', http://git-wip-us.apache.org/repos/asf/cassandra/blob/207cdf30/pylib/cqlshlib/test/test_cqlsh_output.py ---------------------------------------------------------------------- diff --git a/pylib/cqlshlib/test/test_cqlsh_output.py b/pylib/cqlshlib/test/test_cqlsh_output.py index 8127adf..f603e82 100644 --- a/pylib/cqlshlib/test/test_cqlsh_output.py +++ b/pylib/cqlshlib/test/test_cqlsh_output.py @@ -894,28 +894,6 @@ class TestCqlshOutput(BaseTestCase): self.assertRegexpMatches(output, '^Connected to .* at %s:%d\.$' % (re.escape(TEST_HOST), TEST_PORT)) - def test_show_assumptions_output(self): - expected_output = '\nUSE %s;\n\n' % quote_name('', get_test_keyspace()) - - with testrun_cqlsh(tty=True) as c: - output = c.cmd_and_response('show assumptions') - self.assertEqual(output, 'No overrides.\n') - - c.cmd_and_response('assume dynamic_values VALUES aRe uuid;') - expected_output += 'ASSUME dynamic_values VALUES ARE uuid;\n' - output = c.cmd_and_response('show assumptions') - self.assertEqual(output, expected_output + '\n') - - c.cmd_and_response('Assume has_all_types names arE float;') - expected_output += 'ASSUME has_all_types NAMES ARE float;\n' - output = c.cmd_and_response('show assumptions') - self.assertEqual(output, expected_output + '\n') - - c.cmd_and_response('assume twenty_rows_table ( b ) values are decimal;') - expected_output += 'ASSUME twenty_rows_table(b) VALUES ARE decimal;\n' - output = c.cmd_and_response('show assumptions') - self.assertEqual(output, expected_output + '\n') - def test_eof_prints_newline(self): with testrun_cqlsh(tty=True) as c: c.send(CONTROL_D)
