Repository: cassandra Updated Branches: refs/heads/trunk a7b5df6b4 -> 61e063b04
Fix NPE when deleting/setting by index on null list collection Patch by Jeff Jirsa; reviewed by Benjamin Lerer for CASSANDRA-9077 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/cc672f36 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/cc672f36 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/cc672f36 Branch: refs/heads/trunk Commit: cc672f36158c2dee3abad1fa6f51488f14ffb902 Parents: 28af4fa Author: Jeff Jirsa <j...@jeffjirsa.net> Authored: Wed Apr 1 12:13:52 2015 -0500 Committer: Tyler Hobbs <ty...@datastax.com> Committed: Wed Apr 1 12:13:52 2015 -0500 ---------------------------------------------------------------------- CHANGES.txt | 2 + src/java/org/apache/cassandra/cql3/Lists.java | 6 +++ .../apache/cassandra/cql3/CollectionsTest.java | 44 +++++++++----------- 3 files changed, 28 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/cc672f36/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 913b570..6137e00 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,6 @@ 2.1.5 + * Fix NullPointerException when deleting or setting an element by index on + a null list collection (CASSANDRA-9077) * Buffer bloom filter serialization (CASSANDRA-9066) * Fix anti-compaction target bloom filter size (CASSANDRA-9060) * Make FROZEN and TUPLE unreserved keywords in CQL (CASSANDRA-9047) http://git-wip-us.apache.org/repos/asf/cassandra/blob/cc672f36/src/java/org/apache/cassandra/cql3/Lists.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/Lists.java b/src/java/org/apache/cassandra/cql3/Lists.java index fc81900..6ca495b 100644 --- a/src/java/org/apache/cassandra/cql3/Lists.java +++ b/src/java/org/apache/cassandra/cql3/Lists.java @@ -342,6 +342,8 @@ public abstract class Lists List<Cell> existingList = params.getPrefetchedList(rowKey, column.name); int idx = ByteBufferUtil.toInt(index); + if (existingList == null) + throw new InvalidRequestException("Attempted to set an element on a list which is null"); if (idx < 0 || idx >= existingList.size()) throw new InvalidRequestException(String.format("List index %d out of bound, list has size %d", idx, existingList.size())); @@ -453,6 +455,8 @@ public abstract class Lists // We want to call bind before possibly returning to reject queries where the value provided is not a list. Term.Terminal value = t.bind(params.options); + if (existingList == null) + throw new InvalidRequestException("Attempted to delete an element from a list which is null"); if (existingList.isEmpty()) return; @@ -496,6 +500,8 @@ public abstract class Lists List<Cell> existingList = params.getPrefetchedList(rowKey, column.name); int idx = ByteBufferUtil.toInt(index.get(params.options)); + if (existingList == null) + throw new InvalidRequestException("Attempted to delete an element from a list which is null"); if (idx < 0 || idx >= existingList.size()) throw new InvalidRequestException(String.format("List index %d out of bound, list has size %d", idx, existingList.size())); http://git-wip-us.apache.org/repos/asf/cassandra/blob/cc672f36/test/unit/org/apache/cassandra/cql3/CollectionsTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/CollectionsTest.java b/test/unit/org/apache/cassandra/cql3/CollectionsTest.java index 3d41ad6..3d266b7 100644 --- a/test/unit/org/apache/cassandra/cql3/CollectionsTest.java +++ b/test/unit/org/apache/cassandra/cql3/CollectionsTest.java @@ -166,51 +166,47 @@ public class CollectionsTest extends CQLTester execute("INSERT INTO %s(k, l) VALUES (0, ?)", list("v1", "v2", "v3")); - assertRows(execute("SELECT l FROM %s WHERE k = 0"), - row(list("v1", "v2", "v3")) - ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), row(list("v1", "v2", "v3"))); execute("DELETE l[?] FROM %s WHERE k = 0", 1); - assertRows(execute("SELECT l FROM %s WHERE k = 0"), - row(list("v1", "v3")) - ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), row(list("v1", "v3"))); execute("UPDATE %s SET l[?] = ? WHERE k = 0", 1, "v4"); - assertRows(execute("SELECT l FROM %s WHERE k = 0"), - row(list("v1", "v4")) - ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), row(list("v1", "v4"))); // Full overwrite execute("UPDATE %s SET l = ? WHERE k = 0", list("v6", "v5")); - assertRows(execute("SELECT l FROM %s WHERE k = 0"), - row(list("v6", "v5")) - ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), row(list("v6", "v5"))); execute("UPDATE %s SET l = l + ? WHERE k = 0", list("v7", "v8")); - assertRows(execute("SELECT l FROM %s WHERE k = 0"), - row(list("v6", "v5", "v7", "v8")) - ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), row(list("v6", "v5", "v7", "v8"))); execute("UPDATE %s SET l = ? + l WHERE k = 0", list("v9")); - assertRows(execute("SELECT l FROM %s WHERE k = 0"), - row(list("v9", "v6", "v5", "v7", "v8")) - ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), row(list("v9", "v6", "v5", "v7", "v8"))); execute("UPDATE %s SET l = l - ? WHERE k = 0", list("v5", "v8")); - assertRows(execute("SELECT l FROM %s WHERE k = 0"), - row(list("v9", "v6", "v7")) - ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), row(list("v9", "v6", "v7"))); execute("DELETE l FROM %s WHERE k = 0"); - assertRows(execute("SELECT l FROM %s WHERE k = 0"), - row((Object)null) - ); + assertRows(execute("SELECT l FROM %s WHERE k = 0"), row((Object) null)); + + assertInvalidMessage("Attempted to delete an element from a list which is null", + "DELETE l[0] FROM %s WHERE k=0 "); + + assertInvalidMessage("Attempted to set an element on a list which is null", + "UPDATE %s SET l[0] = ? WHERE k=0", list("v10")); + + assertInvalidMessage("Attempted to delete an element from a list which is null", + "UPDATE %s SET l = l - ? WHERE k=0 ", + list("v11")); + + assertRows(execute("SELECT l FROM %s WHERE k = 0"), row((Object) null)); } }