Updated Branches:
  refs/heads/cassandra-1.2 a3dbc3ddc -> 1a45fcbaa

Ninja-return duplicate set values and map keys validation


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

Branch: refs/heads/cassandra-1.2
Commit: 1a45fcbaa331c768edb083f5682b4f559f4de33d
Parents: a3dbc3d
Author: Aleksey Yeschenko <[email protected]>
Authored: Thu Jul 25 20:20:05 2013 +0300
Committer: Aleksey Yeschenko <[email protected]>
Committed: Thu Jul 25 20:20:05 2013 +0300

----------------------------------------------------------------------
 .../org/apache/cassandra/cql3/Constants.java    | 19 ++++++++++++++++
 src/java/org/apache/cassandra/cql3/Maps.java    |  3 ++-
 src/java/org/apache/cassandra/cql3/Sets.java    |  4 ++--
 .../cassandra/cql3/functions/FunctionCall.java  | 23 ++++++++++++++++++++
 4 files changed, 46 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/1a45fcba/src/java/org/apache/cassandra/cql3/Constants.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Constants.java 
b/src/java/org/apache/cassandra/cql3/Constants.java
index 4c9d856..db264c4 100644
--- a/src/java/org/apache/cassandra/cql3/Constants.java
+++ b/src/java/org/apache/cassandra/cql3/Constants.java
@@ -20,6 +20,7 @@ package org.apache.cassandra.cql3;
 import java.nio.ByteBuffer;
 import java.util.List;
 
+import com.google.common.base.Objects;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -264,6 +265,24 @@ public abstract class Constants
         {
             return bytes;
         }
+
+        @Override
+        public int hashCode()
+        {
+            return Objects.hashCode(bytes);
+        }
+
+        @Override
+        public boolean equals(Object o)
+        {
+            if (this == o)
+                return true;
+
+            if (!(o instanceof Value))
+                return false;
+
+            return Objects.equal(this.bytes, ((Value) o).bytes);
+        }
     }
 
     public static class Marker extends AbstractMarker

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1a45fcba/src/java/org/apache/cassandra/cql3/Maps.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Maps.java 
b/src/java/org/apache/cassandra/cql3/Maps.java
index e34e076..6c5efce 100644
--- a/src/java/org/apache/cassandra/cql3/Maps.java
+++ b/src/java/org/apache/cassandra/cql3/Maps.java
@@ -80,7 +80,8 @@ public abstract class Maps
                 if (k instanceof Term.NonTerminal || v instanceof 
Term.NonTerminal)
                     allTerminal = false;
 
-                values.put(k, v);
+                if (values.put(k, v) != null)
+                    throw new InvalidRequestException(String.format("Invalid 
map literal: duplicate entry for key %s", entry.left));
             }
             DelayedValue value = new 
DelayedValue(((MapType)receiver.type).keys, values);
             return allTerminal ? 
value.bind(Collections.<ByteBuffer>emptyList()) : value;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1a45fcba/src/java/org/apache/cassandra/cql3/Sets.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Sets.java 
b/src/java/org/apache/cassandra/cql3/Sets.java
index 748f269..7c0242d 100644
--- a/src/java/org/apache/cassandra/cql3/Sets.java
+++ b/src/java/org/apache/cassandra/cql3/Sets.java
@@ -68,7 +68,6 @@ public abstract class Sets
             if (receiver.type instanceof MapType && elements.isEmpty())
                 return new Maps.Value(Collections.<ByteBuffer, 
ByteBuffer>emptyMap());
 
-
             ColumnSpecification valueSpec = Sets.valueSpecOf(receiver);
             Set<Term> values = new HashSet<Term>(elements.size());
             boolean allTerminal = true;
@@ -82,7 +81,8 @@ public abstract class Sets
                 if (t instanceof Term.NonTerminal)
                     allTerminal = false;
 
-                values.add(t);
+                if (!values.add(t))
+                    throw new InvalidRequestException(String.format("Invalid 
set literal: duplicate value %s", rt));
             }
             DelayedValue value = new 
DelayedValue(((SetType)receiver.type).elements, values);
             return allTerminal ? 
value.bind(Collections.<ByteBuffer>emptyList()) : value;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1a45fcba/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java 
b/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java
index a6b86a2..3a51204 100644
--- a/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java
+++ b/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java
@@ -21,6 +21,8 @@ import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.google.common.base.Objects;
+
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.Constants;
 import org.apache.cassandra.cql3.Lists;
@@ -96,6 +98,27 @@ public class FunctionCall extends Term.NonTerminal
         throw new AssertionError();
     }
 
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+            return true;
+
+        if (!(o instanceof FunctionCall))
+            return false;
+
+        FunctionCall fc = (FunctionCall) o;
+
+        return Objects.equal(this.fun, fc.fun)
+            && Objects.equal(this.terms, fc.terms);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hashCode(fun, terms);
+    }
+
     public static class Raw implements Term.Raw
     {
         private final String functionName;

Reply via email to