Merge branch 'cassandra-3.0' into cassandra-3.11

# Conflicts:
#	src/java/org/apache/cassandra/cql3/Maps.java
This commit is contained in:
Andrés de la Peña 2020-07-23 12:45:20 +01:00
commit 7451cf083c
5 changed files with 447 additions and 85 deletions

View File

@ -2,6 +2,8 @@
* Frozen RawTuple is not annotated with frozen in the toString method (CASSANDRA-15857)
Merged from 3.0:
* Fix empty/null json string representation (CASSANDRA-15896)
Merged from 2.2:
* Fix CQL parsing of collections when the column type is reversed (CASSANDRA-15814)
3.11.7

View File

@ -34,6 +34,7 @@ import org.apache.cassandra.db.rows.*;
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.Int32Type;
import org.apache.cassandra.db.marshal.ListType;
import org.apache.cassandra.db.marshal.ReversedType;
import org.apache.cassandra.exceptions.InvalidRequestException;
import org.apache.cassandra.serializers.CollectionSerializer;
import org.apache.cassandra.serializers.MarshalException;
@ -55,7 +56,17 @@ public abstract class Lists
public static ColumnSpecification valueSpecOf(ColumnSpecification column)
{
return new ColumnSpecification(column.ksName, column.cfName, new ColumnIdentifier("value(" + column.name + ")", true), ((ListType)column.type).getElementsType());
return new ColumnSpecification(column.ksName, column.cfName, new ColumnIdentifier("value(" + column.name + ")", true), elementsType(column.type));
}
private static AbstractType<?> unwrap(AbstractType<?> type)
{
return type.isReversed() ? unwrap(((ReversedType<?>) type).baseType) : type;
}
private static AbstractType<?> elementsType(AbstractType<?> type)
{
return ((ListType) unwrap(type)).getElementsType();
}
public static class Literal extends Term.Raw
@ -92,7 +103,9 @@ public abstract class Lists
private void validateAssignableTo(String keyspace, ColumnSpecification receiver) throws InvalidRequestException
{
if (!(receiver.type instanceof ListType))
AbstractType<?> type = unwrap(receiver.type);
if (!(type instanceof ListType))
throw new InvalidRequestException(String.format("Invalid list literal for %s of type %s", receiver.name, receiver.type.asCQL3Type()));
ColumnSpecification valueSpec = Lists.valueSpecOf(receiver);

View File

@ -44,12 +44,27 @@ public abstract class Maps
public static ColumnSpecification keySpecOf(ColumnSpecification column)
{
return new ColumnSpecification(column.ksName, column.cfName, new ColumnIdentifier("key(" + column.name + ")", true), ((MapType)column.type).getKeysType());
return new ColumnSpecification(column.ksName, column.cfName, new ColumnIdentifier("key(" + column.name + ")", true), keysType(column.type));
}
public static ColumnSpecification valueSpecOf(ColumnSpecification column)
{
return new ColumnSpecification(column.ksName, column.cfName, new ColumnIdentifier("value(" + column.name + ")", true), ((MapType)column.type).getValuesType());
return new ColumnSpecification(column.ksName, column.cfName, new ColumnIdentifier("value(" + column.name + ")", true), valuesType(column.type));
}
private static AbstractType<?> unwrap(AbstractType<?> type)
{
return type.isReversed() ? unwrap(((ReversedType<?>) type).baseType) : type;
}
private static AbstractType<?> keysType(AbstractType<?> type)
{
return ((MapType) unwrap(type)).getKeysType();
}
private static AbstractType<?> valuesType(AbstractType<?> type)
{
return ((MapType) unwrap(type)).getValuesType();
}
public static class Literal extends Term.Raw
@ -82,13 +97,15 @@ public abstract class Maps
values.put(k, v);
}
DelayedValue value = new DelayedValue(((MapType)receiver.type).getKeysType(), values);
DelayedValue value = new DelayedValue(keysType(receiver.type), values);
return allTerminal ? value.bind(QueryOptions.DEFAULT) : value;
}
private void validateAssignableTo(String keyspace, ColumnSpecification receiver) throws InvalidRequestException
{
if (!(receiver.type instanceof MapType))
AbstractType<?> type = unwrap(receiver.type);
if (!(type instanceof MapType))
throw new InvalidRequestException(String.format("Invalid map literal for %s of type %s", receiver.name, receiver.type.asCQL3Type()));
ColumnSpecification keySpec = Maps.keySpecOf(receiver);

View File

@ -43,7 +43,17 @@ public abstract class Sets
public static ColumnSpecification valueSpecOf(ColumnSpecification column)
{
return new ColumnSpecification(column.ksName, column.cfName, new ColumnIdentifier("value(" + column.name + ")", true), ((SetType)column.type).getElementsType());
return new ColumnSpecification(column.ksName, column.cfName, new ColumnIdentifier("value(" + column.name + ")", true), elementsType(column.type));
}
private static AbstractType<?> unwrap(AbstractType<?> type)
{
return type.isReversed() ? unwrap(((ReversedType<?>) type).baseType) : type;
}
private static AbstractType<?> elementsType(AbstractType<?> type)
{
return ((SetType) unwrap(type)).getElementsType();
}
public static class Literal extends Term.Raw
@ -79,17 +89,19 @@ public abstract class Sets
values.add(t);
}
DelayedValue value = new DelayedValue(((SetType)receiver.type).getElementsType(), values);
DelayedValue value = new DelayedValue(elementsType(receiver.type), values);
return allTerminal ? value.bind(QueryOptions.DEFAULT) : value;
}
private void validateAssignableTo(String keyspace, ColumnSpecification receiver) throws InvalidRequestException
{
if (!(receiver.type instanceof SetType))
AbstractType<?> type = unwrap(receiver.type);
if (!(type instanceof SetType))
{
// We've parsed empty maps as a set literal to break the ambiguity so
// handle that case now
if ((receiver.type instanceof MapType) && elements.isEmpty())
if ((type instanceof MapType) && elements.isEmpty())
return;
throw new InvalidRequestException(String.format("Invalid set literal for %s of type %s", receiver.name, receiver.type.asCQL3Type()));

View File

@ -50,63 +50,92 @@ public class FrozenCollectionsTest extends CQLTester
}
@Test
public void testPartitionKeyUsage() throws Throwable
public void testPartitionKeyUsageSet() throws Throwable
{
createTable("CREATE TABLE %s (k frozen<set<int>> PRIMARY KEY, v int)");
testPartitionKeyUsage("set<int>",
set(),
set(1, 2, 3),
set(4, 5, 6),
set(7, 8, 9));
}
execute("INSERT INTO %s (k, v) VALUES (?, ?)", set(), 1);
execute("INSERT INTO %s (k, v) VALUES (?, ?)", set(1, 2, 3), 1);
execute("INSERT INTO %s (k, v) VALUES (?, ?)", set(4, 5, 6), 0);
execute("INSERT INTO %s (k, v) VALUES (?, ?)", set(7, 8, 9), 0);
@Test
public void testPartitionKeyUsageList() throws Throwable
{
testPartitionKeyUsage("list<int>",
list(),
list(1, 2, 3),
list(4, 5, 6),
list(7, 8, 9));
}
@Test
public void testPartitionKeyUsageMap() throws Throwable
{
testPartitionKeyUsage("map<int, int>",
map(),
map(1, 10, 2, 20, 3, 30),
map(4, 40, 5, 50, 6, 60),
map(7, 70, 8, 80, 9, 90));
}
private void testPartitionKeyUsage(String type, Object v1, Object v2, Object v3, Object v4) throws Throwable
{
createTable("CREATE TABLE %s (k frozen<" + type + "> PRIMARY KEY, v int)");
execute("INSERT INTO %s (k, v) VALUES (?, ?)", v1, 1);
execute("INSERT INTO %s (k, v) VALUES (?, ?)", v2, 1);
execute("INSERT INTO %s (k, v) VALUES (?, ?)", v3, 0);
execute("INSERT INTO %s (k, v) VALUES (?, ?)", v4, 0);
// overwrite with an update
execute("UPDATE %s SET v=? WHERE k=?", 0, set());
execute("UPDATE %s SET v=? WHERE k=?", 0, set(1, 2, 3));
execute("UPDATE %s SET v=? WHERE k=?", 0, v1);
execute("UPDATE %s SET v=? WHERE k=?", 0, v2);
assertRows(execute("SELECT * FROM %s"),
row(set(), 0),
row(set(1, 2, 3), 0),
row(set(4, 5, 6), 0),
row(set(7, 8, 9), 0)
row(v1, 0),
row(v2, 0),
row(v3, 0),
row(v4, 0)
);
assertRows(execute("SELECT k FROM %s"),
row(set()),
row(set(1, 2, 3)),
row(set(4, 5, 6)),
row(set(7, 8, 9))
row(v1),
row(v2),
row(v3),
row(v4)
);
assertRows(execute("SELECT * FROM %s LIMIT 2"),
row(set(), 0),
row(set(1, 2, 3), 0)
row(v1, 0),
row(v2, 0)
);
assertRows(execute("SELECT * FROM %s WHERE k=?", set(4, 5, 6)),
row(set(4, 5, 6), 0)
assertRows(execute("SELECT * FROM %s WHERE k=?", v3),
row(v3, 0)
);
assertRows(execute("SELECT * FROM %s WHERE k=?", set()),
row(set(), 0)
assertRows(execute("SELECT * FROM %s WHERE k=?", v1),
row(v1, 0)
);
assertRows(execute("SELECT * FROM %s WHERE k IN ?", list(set(4, 5, 6), set())),
row(set(), 0),
row(set(4, 5, 6), 0)
assertRows(execute("SELECT * FROM %s WHERE k IN ?", list(v3, v1)),
row(v1, 0),
row(v3, 0)
);
assertRows(execute("SELECT * FROM %s WHERE token(k) >= token(?)", set(4, 5, 6)),
row(set(4, 5, 6), 0),
row(set(7, 8, 9), 0)
assertRows(execute("SELECT * FROM %s WHERE token(k) >= token(?)", v3),
row(v3, 0),
row(v4, 0)
);
assertInvalid("INSERT INTO %s (k, v) VALUES (null, 0)");
execute("DELETE FROM %s WHERE k=?", set());
execute("DELETE FROM %s WHERE k=?", set(4, 5, 6));
execute("DELETE FROM %s WHERE k=?", v1);
execute("DELETE FROM %s WHERE k=?", v3);
assertRows(execute("SELECT * FROM %s"),
row(set(1, 2, 3), 0),
row(set(7, 8, 9), 0)
row(v2, 0),
row(v4, 0)
);
}
@ -181,82 +210,223 @@ public class FrozenCollectionsTest extends CQLTester
}
@Test
public void testClusteringKeyUsage() throws Throwable
public void testClusteringKeyUsageSet() throws Throwable
{
testClusteringKeyUsage("set<int>",
set(),
set(1, 2, 3),
set(4, 5, 6),
set(7, 8, 9));
}
@Test
public void testClusteringKeyUsageList() throws Throwable
{
testClusteringKeyUsage("list<int>",
list(),
list(1, 2, 3),
list(4, 5, 6),
list(7, 8, 9));
}
@Test
public void testClusteringKeyUsageMap() throws Throwable
{
testClusteringKeyUsage("map<int, int>",
map(),
map(1, 10, 2, 20, 3, 30),
map(4, 40, 5, 50, 6, 60),
map(7, 70, 8, 80, 9, 90));
}
private void testClusteringKeyUsage(String type, Object v1, Object v2, Object v3, Object v4) throws Throwable
{
for (String option : Arrays.asList("", " WITH COMPACT STORAGE"))
{
createTable("CREATE TABLE %s (a int, b frozen<set<int>>, c int, PRIMARY KEY (a, b))" + option);
createTable(String.format("CREATE TABLE %%s (a int, b frozen<%s>, c int, PRIMARY KEY (a, b)) %s",
type, option));
execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, set(), 1);
execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, set(1, 2, 3), 1);
execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, set(4, 5, 6), 0);
execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, set(7, 8, 9), 0);
execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v1, 1);
execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v2, 1);
execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v3, 0);
execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v4, 0);
// overwrite with an update
execute("UPDATE %s SET c=? WHERE a=? AND b=?", 0, 0, set());
execute("UPDATE %s SET c=? WHERE a=? AND b=?", 0, 0, set(1, 2, 3));
execute("UPDATE %s SET c=? WHERE a=? AND b=?", 0, 0, v1);
execute("UPDATE %s SET c=? WHERE a=? AND b=?", 0, 0, v2);
assertRows(execute("SELECT * FROM %s"),
row(0, set(), 0),
row(0, set(1, 2, 3), 0),
row(0, set(4, 5, 6), 0),
row(0, set(7, 8, 9), 0)
row(0, v1, 0),
row(0, v2, 0),
row(0, v3, 0),
row(0, v4, 0)
);
assertRows(execute("SELECT b FROM %s"),
row(set()),
row(set(1, 2, 3)),
row(set(4, 5, 6)),
row(set(7, 8, 9))
row(v1),
row(v2),
row(v3),
row(v4)
);
assertRows(execute("SELECT * FROM %s LIMIT 2"),
row(0, set(), 0),
row(0, set(1, 2, 3), 0)
row(0, v1, 0),
row(0, v2, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, set(4, 5, 6)),
row(0, set(4, 5, 6), 0)
assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, v3),
row(0, v3, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, set()),
row(0, set(), 0)
assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, v1),
row(0, v1, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b IN ?", 0, list(set(4, 5, 6), set())),
row(0, set(), 0),
row(0, set(4, 5, 6), 0)
assertRows(execute("SELECT * FROM %s WHERE a=? AND b IN ?", 0, list(v3, v1)),
row(0, v1, 0),
row(0, v3, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ?", 0, set(4, 5, 6)),
row(0, set(7, 8, 9), 0)
assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ?", 0, v3),
row(0, v4, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b >= ?", 0, set(4, 5, 6)),
row(0, set(4, 5, 6), 0),
row(0, set(7, 8, 9), 0)
assertRows(execute("SELECT * FROM %s WHERE a=? AND b >= ?", 0, v3),
row(0, v3, 0),
row(0, v4, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b < ?", 0, set(4, 5, 6)),
row(0, set(), 0),
row(0, set(1, 2, 3), 0)
assertRows(execute("SELECT * FROM %s WHERE a=? AND b < ?", 0, v3),
row(0, v1, 0),
row(0, v2, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b <= ?", 0, set(4, 5, 6)),
row(0, set(), 0),
row(0, set(1, 2, 3), 0),
row(0, set(4, 5, 6), 0)
assertRows(execute("SELECT * FROM %s WHERE a=? AND b <= ?", 0, v3),
row(0, v1, 0),
row(0, v2, 0),
row(0, v3, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ? AND b <= ?", 0, set(1, 2, 3), set(4, 5, 6)),
row(0, set(4, 5, 6), 0)
assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ? AND b <= ?", 0, v2, v3),
row(0, v3, 0)
);
execute("DELETE FROM %s WHERE a=? AND b=?", 0, set());
execute("DELETE FROM %s WHERE a=? AND b=?", 0, set(4, 5, 6));
execute("DELETE FROM %s WHERE a=? AND b=?", 0, v1);
execute("DELETE FROM %s WHERE a=? AND b=?", 0, v3);
assertRows(execute("SELECT * FROM %s"),
row(0, set(1, 2, 3), 0),
row(0, set(7, 8, 9), 0)
row(0, v2, 0),
row(0, v4, 0)
);
}
}
@Test
public void testClusteringKeyUsageWithReverseOrderSet() throws Throwable
{
testClusteringKeyUsageWithReverseOrder("set<int>",
set(),
set(1, 2, 3),
set(4, 5, 6),
set(7, 8, 9));
}
@Test
public void testClusteringKeyUsageWithReverseOrderList() throws Throwable
{
testClusteringKeyUsageWithReverseOrder("list<int>",
list(),
list(1, 2, 3),
list(4, 5, 6),
list(7, 8, 9));
}
@Test
public void testClusteringKeyUsageWithReverseOrderMap() throws Throwable
{
testClusteringKeyUsageWithReverseOrder("map<int, int>",
map(),
map(1, 10, 2, 20, 3, 30),
map(4, 40, 5, 50, 6, 60),
map(7, 70, 8, 80, 9, 90));
}
private void testClusteringKeyUsageWithReverseOrder(String type, Object v1, Object v2, Object v3, Object v4) throws Throwable
{
for (String option : Arrays.asList("", " AND COMPACT STORAGE"))
{
createTable(String.format("CREATE TABLE %%s (a int, b frozen<%s>, c int, PRIMARY KEY (a, b)) " +
"WITH CLUSTERING ORDER BY (b DESC) %s", type, option));
execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v1, 1);
execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v2, 1);
execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v3, 0);
execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v4, 0);
// overwrite with an update
execute("UPDATE %s SET c=? WHERE a=? AND b=?", 0, 0, v1);
execute("UPDATE %s SET c=? WHERE a=? AND b=?", 0, 0, v2);
assertRows(execute("SELECT * FROM %s"),
row(0, v4, 0),
row(0, v3, 0),
row(0, v2, 0),
row(0, v1, 0)
);
assertRows(execute("SELECT b FROM %s"),
row(v4),
row(v3),
row(v2),
row(v1)
);
assertRows(execute("SELECT * FROM %s LIMIT 2"),
row(0, v4, 0),
row(0, v3, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, v3),
row(0, v3, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, v1),
row(0, v1, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b IN ?", 0, list(v3, v1)),
row(0, v3, 0),
row(0, v1, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ?", 0, v3),
row(0, v4, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b >= ?", 0, v3),
row(0, v4, 0),
row(0, v3, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b < ?", 0, v3),
row(0, v2, 0),
row(0, v1, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b <= ?", 0, v3),
row(0, v3, 0),
row(0, v2, 0),
row(0, v1, 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ? AND b <= ?", 0, v2, v3),
row(0, v3, 0)
);
execute("DELETE FROM %s WHERE a=? AND b=?", 0, v1);
execute("DELETE FROM %s WHERE a=? AND b=?", 0, v3);
assertRows(execute("SELECT * FROM %s"),
row(0, v4, 0),
row(0, v2, 0)
);
}
}
@ -375,6 +545,121 @@ public class FrozenCollectionsTest extends CQLTester
}
}
@Test
public void testNestedClusteringKeyUsageWithReverseOrder() throws Throwable
{
for (String option : Arrays.asList("", " AND COMPACT STORAGE"))
{
createTable("CREATE TABLE %s (a int, b frozen<map<set<int>, list<int>>>, c frozen<set<int>>, d int, " +
"PRIMARY KEY (a, b, c)) WITH CLUSTERING ORDER BY (b DESC)" + option);
execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(), set(), 0);
execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(), list(1, 2, 3)), set(), 0);
execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0);
execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0);
execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0);
assertRows(execute("SELECT * FROM %s"),
row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
row(0, map(set(), list(1, 2, 3)), set(), 0),
row(0, map(), set(), 0)
);
assertRows(execute("SELECT b FROM %s"),
row(map(set(7, 8, 9), list(1, 2, 3))),
row(map(set(4, 5, 6), list(1, 2, 3))),
row(map(set(1, 2, 3), list(1, 2, 3))),
row(map(set(), list(1, 2, 3))),
row(map())
);
assertRows(execute("SELECT c FROM %s"),
row(set(1, 2, 3)),
row(set(1, 2, 3)),
row(set(1, 2, 3)),
row(set()),
row(set())
);
assertRows(execute("SELECT * FROM %s LIMIT 3"),
row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=0 ORDER BY b DESC LIMIT 4"),
row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
row(0, map(set(), list(1, 2, 3)), set(), 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map()),
row(0, map(), set(), 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map(set(), list(1, 2, 3))),
row(0, map(set(), list(1, 2, 3)), set(), 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map(set(1, 2, 3), list(1, 2, 3))),
row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set()),
row(0, map(set(), list(1, 2, 3)), set(), 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND (b, c) IN ?", 0, list(tuple(map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3)),
tuple(map(), set()))),
row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
row(0, map(), set(), 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b >= ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b < ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
row(0, map(set(), list(1, 2, 3)), set(), 0),
row(0, map(), set(), 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b <= ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
row(0, map(set(), list(1, 2, 3)), set(), 0),
row(0, map(), set(), 0)
);
assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ? AND b <= ?", 0, map(set(1, 2, 3), list(1, 2, 3)), map(set(4, 5, 6), list(1, 2, 3))),
row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0)
);
execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(), set());
assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(), set()));
execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set());
assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set()));
execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3));
assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3)));
assertRows(execute("SELECT * FROM %s"),
row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
);
}
}
@Test
public void testNormalColumnUsage() throws Throwable
{
@ -1042,6 +1327,39 @@ public class FrozenCollectionsTest extends CQLTester
);
}
/**
* Test parsing of literal lists when the column type is reversed (CASSANDRA-15814)
*/
@Test
public void testLiteralReversedList() throws Throwable
{
createTable("CREATE TABLE %s (k int, c frozen<list<int>>, PRIMARY KEY (k, c)) WITH CLUSTERING ORDER BY (c DESC)");
execute("INSERT INTO %s (k, c) VALUES (0, [1, 2])");
assertRows(execute("SELECT c FROM %s WHERE k=0 AND c=[1, 2]"), row(list(1, 2)));
}
/**
* Test parsing of literal sets when the column type is reversed (CASSANDRA-15814)
*/
@Test
public void testLiteralReversedSet() throws Throwable
{
createTable("CREATE TABLE %s (k int, c frozen<set<int>>, PRIMARY KEY (k, c)) WITH CLUSTERING ORDER BY (c DESC)");
execute("INSERT INTO %s (k, c) VALUES (0, {1, 2})");
assertRows(execute("SELECT c FROM %s WHERE k=0 AND c={1, 2}"), row(set(1, 2)));
}
/**
* Test parsing of literal maps when the column type is reversed (CASSANDRA-15814)
*/
@Test
public void testLiteralReversedMap() throws Throwable
{
createTable("CREATE TABLE %s (k int, c frozen<map<int,int>>, PRIMARY KEY (k, c)) WITH CLUSTERING ORDER BY (c DESC)");
execute("INSERT INTO %s (k, c) VALUES (0, {1:2, 3:4})");
assertRows(execute("SELECT c FROM %s WHERE k=0 AND c={1:2, 3:4}"), row(map(1, 2, 3, 4)));
}
private static String clean(String classname)
{
return StringUtils.remove(classname, "org.apache.cassandra.db.marshal.");