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;
