You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ty...@apache.org on 2014/12/12 17:50:24 UTC

cassandra git commit: Fix NPE when writetime() or ttl() are nested inside a fn call

Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.0 ac9cfbd9a -> 3f3d0edba


Fix NPE when writetime() or ttl() are nested inside a fn call

Patch by Tyler Hobbs; reviewed by Benjamin Lerer for CASSANDRA-8451


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

Branch: refs/heads/cassandra-2.0
Commit: 3f3d0edbad6b42f5fc8715ecfa52e2e41bbdcea9
Parents: ac9cfbd
Author: Tyler Hobbs <ty...@datastax.com>
Authored: Fri Dec 12 10:49:32 2014 -0600
Committer: Tyler Hobbs <ty...@datastax.com>
Committed: Fri Dec 12 10:49:32 2014 -0600

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 +
 .../cassandra/cql3/statements/Selection.java    | 50 ++++++++++++++++++--
 2 files changed, 47 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/3f3d0edb/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index c25caf9..cc426bb 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,6 @@
 2.0.12:
+ * Fix NPE when writetime() or ttl() calls are wrapped by
+   another function call (CASSANDRA-8451)
  * Fix NPE after dropping a keyspace (CASSANDRA-8332)
  * Fix error message on read repair timeouts (CASSANDRA-7947)
  * Default DTCS base_time_seconds changed to 60 (CASSANDRA-8417)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/3f3d0edb/src/java/org/apache/cassandra/cql3/statements/Selection.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/Selection.java b/src/java/org/apache/cassandra/cql3/statements/Selection.java
index 407f7d9..223f698 100644
--- a/src/java/org/apache/cassandra/cql3/statements/Selection.java
+++ b/src/java/org/apache/cassandra/cql3/statements/Selection.java
@@ -186,11 +186,8 @@ public abstract class Selection
             {
                 Selector selector = makeSelector(cfDef, rawSelector, names, metadata);
                 selectors.add(selector);
-                if (selector instanceof WritetimeOrTTLSelector)
-                {
-                    collectTimestamps |= ((WritetimeOrTTLSelector)selector).isWritetime;
-                    collectTTLs |= !((WritetimeOrTTLSelector)selector).isWritetime;
-                }
+                collectTimestamps |= selector.usesTimestamps();
+                collectTTLs |= selector.usesTTLs();
             }
             return new SelectionWithProcessing(names, metadata, selectors, collectTimestamps, collectTTLs);
         }
@@ -374,6 +371,12 @@ public abstract class Selection
     private interface Selector extends AssignementTestable
     {
         public ByteBuffer compute(ResultSetBuilder rs) throws InvalidRequestException;
+
+        /** Returns true if the selector acts on a column's timestamp, false otherwise. */
+        public boolean usesTimestamps();
+
+        /** Returns true if the selector acts on a column's TTL, false otherwise. */
+        public boolean usesTTLs();
     }
 
     private static class SimpleSelector implements Selector
@@ -399,6 +402,16 @@ public abstract class Selection
             return receiver.type.isValueCompatibleWith(type);
         }
 
+        public boolean usesTimestamps()
+        {
+            return false;
+        }
+
+        public boolean usesTTLs()
+        {
+            return false;
+        }
+
         @Override
         public String toString()
         {
@@ -431,6 +444,22 @@ public abstract class Selection
             return receiver.type.isValueCompatibleWith(fun.returnType());
         }
 
+        public boolean usesTimestamps()
+        {
+            for (Selector s : argSelectors)
+                if (s.usesTimestamps())
+                    return true;
+            return false;
+        }
+
+        public boolean usesTTLs()
+        {
+            for (Selector s : argSelectors)
+                if (s.usesTTLs())
+                    return true;
+            return false;
+        }
+
         @Override
         public String toString()
         {
@@ -476,6 +505,17 @@ public abstract class Selection
             return receiver.type.isValueCompatibleWith(isWritetime ? LongType.instance : Int32Type.instance);
         }
 
+
+        public boolean usesTimestamps()
+        {
+            return isWritetime;
+        }
+
+        public boolean usesTTLs()
+        {
+            return !isWritetime;
+        }
+
         @Override
         public String toString()
         {