cqlsh copy: fix missing counter values

patch by Stefania Alborghetti; reviewed by Tyler Hobbs for CASSANDRA-12476


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/b9fc6a5e
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/b9fc6a5e
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/b9fc6a5e

Branch: refs/heads/cassandra-3.9
Commit: b9fc6a5e45d6f53d447839e7567d5184dede03d0
Parents: 23d4822
Author: Stefania Alborghetti <stefania.alborghe...@datastax.com>
Authored: Mon Aug 22 11:29:11 2016 +0800
Committer: Stefania Alborghetti <stefania.alborghe...@datastax.com>
Committed: Thu Aug 25 09:09:07 2016 +0800

----------------------------------------------------------------------
 CHANGES.txt                |  1 +
 pylib/cqlshlib/copyutil.py | 16 +++++++++++++---
 2 files changed, 14 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/b9fc6a5e/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index a3a34c1..001a389 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.2.8
+ * cqlsh copy: fix missing counter values (CASSANDRA-12476)
  * Move migration tasks to non-periodic queue, assure flush executor shutdown 
after non-periodic executor (CASSANDRA-12251)
  * cqlsh copy: fixed possible race in initializing feeding thread 
(CASSANDRA-11701)
  * Only set broadcast_rpc_address on Ec2MultiRegionSnitch if it's not set 
(CASSANDRA-11357)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b9fc6a5e/pylib/cqlshlib/copyutil.py
----------------------------------------------------------------------
diff --git a/pylib/cqlshlib/copyutil.py b/pylib/cqlshlib/copyutil.py
index 460ae6a..aee2920 100644
--- a/pylib/cqlshlib/copyutil.py
+++ b/pylib/cqlshlib/copyutil.py
@@ -1746,6 +1746,7 @@ class ImportConversion(object):
         else:
             self.use_prepared_statements = True
 
+        self.is_counter = parent.is_counter(table_meta)
         self.proto_version = statement.protocol_version
 
         # the cql types and converters for the prepared statement, either the 
full statement or only the primary keys
@@ -1974,7 +1975,14 @@ class ImportConversion(object):
         return converters.get(cql_type.typename, convert_unknown)
 
     def get_null_val(self):
-        return None if self.use_prepared_statements else "NULL"
+        """
+        Return the null value that is inserted for fields that are missing 
from csv files.
+        For counters we should return zero so that the counter value won't be 
incremented.
+        For everything else we return nulls, this means None if we use 
prepared statements
+        or "NULL" otherwise. Note that for counters we never use prepared 
statements, so we
+        only check is_counter when use_prepared_statements is false.
+        """
+        return None if self.use_prepared_statements else ("0" if 
self.is_counter else "NULL")
 
     def convert_row(self, row):
         """
@@ -2177,13 +2185,15 @@ class ImportProcess(ChildProcess):
             self._session.cluster.shutdown()
         ChildProcess.close(self)
 
+    def is_counter(self, table_meta):
+        return "counter" in [table_meta.columns[name].cql_type for name in 
self.valid_columns]
+
     def make_params(self):
         metadata = self.session.cluster.metadata
         table_meta = metadata.keyspaces[self.ks].tables[self.table]
 
         prepared_statement = None
-        is_counter = ("counter" in [table_meta.columns[name].cql_type for name 
in self.valid_columns])
-        if is_counter:
+        if self.is_counter(table_meta):
             query = 'UPDATE %s.%s SET %%s WHERE %%s' % (protect_name(self.ks), 
protect_name(self.table))
             make_statement = 
self.wrap_make_statement(self.make_counter_batch_statement)
         elif self.use_prepared_statements:

Reply via email to