cqlsh: COPY FROM should check that explicit column names are valid patch by Stefania Alborghetti; reviewed by Paulo Motta for CASSANDRA-11333
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/c74df401 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/c74df401 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/c74df401 Branch: refs/heads/cassandra-3.5 Commit: c74df401768fe25eb80f9d328cad974c8ab220ad Parents: b06bcf7 Author: Stefania Alborghetti <stefania.alborghe...@datastax.com> Authored: Wed Mar 16 17:42:54 2016 +0800 Committer: Yuki Morishita <yu...@apache.org> Committed: Tue Mar 22 15:49:20 2016 -0500 ---------------------------------------------------------------------- CHANGES.txt | 1 + pylib/cqlshlib/copyutil.py | 43 +++++++++++++++++++++++++++++++---------- 2 files changed, 34 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/c74df401/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index bcdf189..e4db50e 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.2.6 + * cqlsh: COPY FROM should check that explicit column names are valid (CASSANDRA-11333) * Add -Dcassandra.start_gossip startup option (CASSANDRA-10809) * Fix UTF8Validator.validate() for modified UTF-8 (CASSANDRA-10748) * Clarify that now() function is calculated on the coordinator node in CQL documentation (CASSANDRA-10900) http://git-wip-us.apache.org/repos/asf/cassandra/blob/c74df401/pylib/cqlshlib/copyutil.py ---------------------------------------------------------------------- diff --git a/pylib/cqlshlib/copyutil.py b/pylib/cqlshlib/copyutil.py index 2755dd5..d08a4fd 100644 --- a/pylib/cqlshlib/copyutil.py +++ b/pylib/cqlshlib/copyutil.py @@ -152,6 +152,7 @@ class CopyTask(object): self.shell = shell self.ks = ks self.table = table + self.table_meta = self.shell.get_table_meta(self.ks, self.table) self.local_dc = shell.conn.metadata.get_host(shell.hostname).datacenter self.fname = safe_normpath(fname) self.protocol_version = protocol_version @@ -386,6 +387,20 @@ class CopyTask(object): debug=shell.debug ) + def validate_columns(self): + shell = self.shell + + if not self.columns: + shell.printerr("No column specified") + return False + + for c in self.columns: + if c not in self.table_meta.columns: + shell.printerr('Invalid column name %s' % (c,)) + return False + + return True + def update_params(self, params, i): """ Add the communication channels to the parameters to be passed to the worker process: @@ -515,8 +530,7 @@ class ExportTask(CopyTask): shell.printerr('Unrecognized COPY TO options: %s' % ', '.join(self.options.unrecognized.keys())) return - if not self.columns: - shell.printerr("No column specified") + if not self.validate_columns(): return 0 ranges = self.get_ranges() @@ -987,7 +1001,6 @@ class ImportTask(CopyTask): options = self.options self.skip_columns = [c.strip() for c in self.options.copy['skipcols'].split(',')] self.valid_columns = [c for c in self.columns if c not in self.skip_columns] - self.table_meta = self.shell.get_table_meta(self.ks, self.table) self.receive_meter = RateMeter(log_fcn=self.printmsg, update_interval=options.copy['reportfrequency'], log_file=options.copy['ratefile']) @@ -1001,6 +1014,22 @@ class ImportTask(CopyTask): ret['valid_columns'] = self.valid_columns return ret + def validate_columns(self): + if not CopyTask.validate_columns(self): + return False + + shell = self.shell + if not self.valid_columns: + shell.printerr("No valid column specified") + return False + + for c in self.table_meta.primary_key: + if c.name not in self.valid_columns: + shell.printerr("Primary key column '%s' missing or skipped" % (c.name,)) + return False + + return True + def run(self): shell = self.shell @@ -1008,15 +1037,9 @@ class ImportTask(CopyTask): shell.printerr('Unrecognized COPY FROM options: %s' % ', '.join(self.options.unrecognized.keys())) return - if not self.valid_columns: - shell.printerr("No column specified") + if not self.validate_columns(): return 0 - for c in self.table_meta.primary_key: - if c.name not in self.valid_columns: - shell.printerr("Primary key column '%s' missing or skipped" % (c.name,)) - return 0 - self.printmsg("\nStarting copy of %s.%s with columns %s." % (self.ks, self.table, self.valid_columns)) try: