Repository: cassandra
Updated Branches:
  refs/heads/cassandra-3.X 075539a5b -> 8b3de2f49


http://git-wip-us.apache.org/repos/asf/cassandra/blob/8b3de2f4/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java 
b/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java
index ece2d1d..975eb8e 100644
--- 
a/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java
+++ 
b/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java
@@ -39,6 +39,7 @@ import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static java.util.Arrays.asList;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -102,6 +103,14 @@ public class SelectionColumnMappingTest extends CQLTester
         testMixedColumnTypes();
         testMultipleUnaliasedSelectionOfSameColumn();
         testUserDefinedAggregate();
+        testListLitteral();
+        testEmptyListLitteral();
+        testSetLitteral();
+        testEmptySetLitteral();
+        testMapLitteral();
+        testEmptyMapLitteral();
+        testUDTLitteral();
+        testTupleLitteral();
     }
 
     @Test
@@ -407,6 +416,91 @@ public class SelectionColumnMappingTest extends CQLTester
         verify(expected, "SELECT v1, v1 FROM %s");
     }
 
+    private void testListLitteral() throws Throwable
+    {
+        ColumnSpecification listSpec = columnSpecification("[k, v1]", 
ListType.getInstance(Int32Type.instance, false));
+        SelectionColumnMapping expected = SelectionColumnMapping.newMapping()
+                                                                
.addMapping(listSpec, asList(columnDefinition("k"),
+                                                                               
              columnDefinition("v1")));
+
+        verify(expected, "SELECT [k, v1] FROM %s");
+    }
+
+    private void testEmptyListLitteral() throws Throwable
+    {
+        ColumnSpecification listSpec = columnSpecification("(list<int>)[]", 
ListType.getInstance(Int32Type.instance, false));
+        SelectionColumnMapping expected = SelectionColumnMapping.newMapping()
+                                                                
.addMapping(listSpec, (ColumnDefinition) null);
+
+        verify(expected, "SELECT (list<int>)[] FROM %s");
+    }
+
+    private void testSetLitteral() throws Throwable
+    {
+        ColumnSpecification setSpec = columnSpecification("{k, v1}", 
SetType.getInstance(Int32Type.instance, false));
+        SelectionColumnMapping expected = SelectionColumnMapping.newMapping()
+                                                                
.addMapping(setSpec, asList(columnDefinition("k"),
+                                                                               
              columnDefinition("v1")));
+
+        verify(expected, "SELECT {k, v1} FROM %s");
+    }
+
+    private void testEmptySetLitteral() throws Throwable
+    {
+        ColumnSpecification setSpec = columnSpecification("(set<int>){}", 
SetType.getInstance(Int32Type.instance, false));
+        SelectionColumnMapping expected = SelectionColumnMapping.newMapping()
+                                                                
.addMapping(setSpec, (ColumnDefinition) null);
+
+        verify(expected, "SELECT (set<int>){} FROM %s");
+    }
+
+    private void testMapLitteral() throws Throwable
+    {
+        ColumnSpecification mapSpec = columnSpecification("(map<text, 
int>){'min': system.min(v1), 'max': system.max(v1)}", 
MapType.getInstance(UTF8Type.instance, Int32Type.instance, false));
+        SelectionColumnMapping expected = SelectionColumnMapping.newMapping()
+                                                                
.addMapping(mapSpec, asList(columnDefinition("v1")));
+
+        verify(expected, "SELECT (map<text, int>){'min': min(v1), 'max': 
max(v1)} FROM %s");
+    }
+
+    private void testEmptyMapLitteral() throws Throwable
+    {
+        ColumnSpecification mapSpec = columnSpecification("(map<text, 
int>){}", MapType.getInstance(UTF8Type.instance, Int32Type.instance, false));
+        SelectionColumnMapping expected = SelectionColumnMapping.newMapping()
+                                                                
.addMapping(mapSpec, (ColumnDefinition) null);
+
+        verify(expected, "SELECT (map<text, int>){} FROM %s");
+    }
+
+    private void testUDTLitteral() throws Throwable
+    {
+        UserType type = new UserType(KEYSPACE, ByteBufferUtil.bytes(typeName),
+                                      asList(FieldIdentifier.forUnquoted("f1"),
+                                             
FieldIdentifier.forUnquoted("f2")),
+                                      asList(Int32Type.instance,
+                                             UTF8Type.instance),
+                                      false);
+
+        ColumnSpecification spec = columnSpecification("(" + KEYSPACE + "." + 
typeName + "){f1: v1, f2: v2}", type);
+        SelectionColumnMapping expected = SelectionColumnMapping.newMapping()
+                                                                
.addMapping(spec, asList(columnDefinition("v1"),
+                                                                               
          columnDefinition("v2")));
+
+        verify(expected, "SELECT ("+ typeName + "){f1: v1, f2: v2} FROM %s");
+    }
+
+    private void testTupleLitteral() throws Throwable
+    {
+        TupleType type = new TupleType(asList(Int32Type.instance, 
UTF8Type.instance));
+
+        ColumnSpecification setSpec = columnSpecification("(tuple<int, 
text>)(v1, v2)", type);
+        SelectionColumnMapping expected = SelectionColumnMapping.newMapping()
+                                                                
.addMapping(setSpec, asList(columnDefinition("v1"),
+                                                                               
             columnDefinition("v2")));
+
+        verify(expected, "SELECT (tuple<int, text>)(v1, v2) FROM %s");
+    }
+
     private void testMixedColumnTypes() throws Throwable
     {
         ColumnSpecification kSpec = columnSpecification("k_alias", 
Int32Type.instance);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8b3de2f4/test/unit/org/apache/cassandra/cql3/selection/TermSelectionTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/selection/TermSelectionTest.java 
b/test/unit/org/apache/cassandra/cql3/selection/TermSelectionTest.java
index a07f8f9..fb46809 100644
--- a/test/unit/org/apache/cassandra/cql3/selection/TermSelectionTest.java
+++ b/test/unit/org/apache/cassandra/cql3/selection/TermSelectionTest.java
@@ -43,20 +43,26 @@ public class TermSelectionTest extends CQLTester
     @Test
     public void testSelectLiteral() throws Throwable
     {
+        long timestampInMicros = System.currentTimeMillis() * 1000;
         createTable("CREATE TABLE %s (pk int, ck int, t text, PRIMARY KEY (pk, 
ck) )");
-        execute("INSERT INTO %s (pk, ck, t) VALUES (1, 1, 'one')");
-        execute("INSERT INTO %s (pk, ck, t) VALUES (1, 2, 'two')");
-        execute("INSERT INTO %s (pk, ck, t) VALUES (1, 3, 'three')");
+        execute("INSERT INTO %s (pk, ck, t) VALUES (?, ?, ?) USING TIMESTAMP 
?", 1, 1, "one", timestampInMicros);
+        execute("INSERT INTO %s (pk, ck, t) VALUES (?, ?, ?) USING TIMESTAMP 
?", 1, 2, "two", timestampInMicros);
+        execute("INSERT INTO %s (pk, ck, t) VALUES (?, ?, ?) USING TIMESTAMP 
?", 1, 3, "three", timestampInMicros);
 
         assertInvalidMessage("Cannot infer type for term", "SELECT ck, t, 'a 
const' FROM %s");
         assertConstantResult(execute("SELECT ck, t, (text)'a const' FROM %s"), 
"a const");
 
         assertInvalidMessage("Cannot infer type for term", "SELECT ck, t, 42 
FROM %s");
-        assertConstantResult(execute("SELECT ck, t, (int)42 FROM %s"), 42);
+        assertConstantResult(execute("SELECT ck, t, (smallint)42 FROM %s"), 
(short) 42);
 
         assertInvalidMessage("Cannot infer type for term", "SELECT ck, t, (1, 
'foo') FROM %s");
         assertConstantResult(execute("SELECT ck, t, (tuple<int, text>)(1, 
'foo') FROM %s"), tuple(1, "foo"));
 
+        assertInvalidMessage("Cannot infer type for term ((1)) in selection 
clause", "SELECT ck, t, ((1)) FROM %s");
+        // We cannot differentiate a tuple containing a tuple from a tuple 
between parentheses.
+        assertInvalidMessage("Cannot infer type for term ((tuple<int>)(1))", 
"SELECT ck, t, ((tuple<int>)(1)) FROM %s");
+        assertConstantResult(execute("SELECT ck, t, (tuple<tuple<int>>)((1)) 
FROM %s"), tuple(tuple(1)));
+
         assertInvalidMessage("Cannot infer type for term", "SELECT ck, t, [1, 
2, 3] FROM %s");
         assertConstantResult(execute("SELECT ck, t, (list<int>)[1, 2, 3] FROM 
%s"), list(1, 2, 3));
 
@@ -66,11 +72,343 @@ public class TermSelectionTest extends CQLTester
         assertInvalidMessage("Cannot infer type for term", "SELECT ck, t, {1: 
'foo', 2: 'bar', 3: 'baz'} FROM %s");
         assertConstantResult(execute("SELECT ck, t, (map<int, text>){1: 'foo', 
2: 'bar', 3: 'baz'} FROM %s"), map(1, "foo", 2, "bar", 3, "baz"));
 
+        assertInvalidMessage("Cannot infer type for term", "SELECT ck, t, {} 
FROM %s");
+        assertConstantResult(execute("SELECT ck, t, (map<int, text>){} FROM 
%s"), map());
+        assertConstantResult(execute("SELECT ck, t, (set<int>){} FROM %s"), 
set());
+
         assertColumnNames(execute("SELECT ck, t, (int)42, (int)43 FROM %s"), 
"ck", "t", "(int)42", "(int)43");
         assertRows(execute("SELECT ck, t, (int) 42, (int) 43 FROM %s"),
                    row(1, "one", 42, 43),
                    row(2, "two", 42, 43),
                    row(3, "three", 42, 43));
+
+        assertRows(execute("SELECT min(ck), max(ck), [min(ck), max(ck)] FROM 
%s"), row(1, 3, list(1, 3)));
+        assertRows(execute("SELECT [min(ck), max(ck)] FROM %s"), row(list(1, 
3)));
+        assertRows(execute("SELECT {min(ck), max(ck)} FROM %s"), row(set(1, 
3)));
+
+        // We need to use a cast to differentiate between a map and an UDT
+        assertInvalidMessage("Cannot infer type for term {'min': 
system.min(ck), 'max': system.max(ck)}",
+                             "SELECT {'min' : min(ck), 'max' : max(ck)} FROM 
%s");
+        assertRows(execute("SELECT (map<text, int>){'min' : min(ck), 'max' : 
max(ck)} FROM %s"), row(map("min", 1, "max", 3)));
+
+        assertRows(execute("SELECT [1, min(ck), max(ck)] FROM %s"), 
row(list(1, 1, 3)));
+        assertRows(execute("SELECT {1, min(ck), max(ck)} FROM %s"), row(set(1, 
1, 3)));
+        assertRows(execute("SELECT (map<text, int>) {'litteral' : 1, 'min' : 
min(ck), 'max' : max(ck)} FROM %s"), row(map("litteral", 1, "min", 1, "max", 
3)));
+
+        // Test List nested within Lists
+        assertRows(execute("SELECT [[], [min(ck), max(ck)]] FROM %s"),
+                   row(list(list(), list(1, 3))));
+        assertRows(execute("SELECT [[], [CAST(pk AS BIGINT), CAST(ck AS 
BIGINT), WRITETIME(t)]] FROM %s"),
+                   row(list(list(), list(1L, 1L, timestampInMicros))),
+                   row(list(list(), list(1L, 2L, timestampInMicros))),
+                   row(list(list(), list(1L, 3L, timestampInMicros))));
+        assertRows(execute("SELECT [[min(ck)], [max(ck)]] FROM %s"),
+                   row(list(list(1), list(3))));
+        assertRows(execute("SELECT [[min(ck)], ([max(ck)])] FROM %s"),
+                   row(list(list(1), list(3))));
+        assertRows(execute("SELECT [[pk], [ck]] FROM %s"),
+                   row(list(list(1), list(1))),
+                   row(list(list(1), list(2))),
+                   row(list(list(1), list(3))));
+        assertRows(execute("SELECT [[pk], [ck]] FROM %s WHERE pk = 1 ORDER BY 
ck DESC"),
+                   row(list(list(1), list(3))),
+                   row(list(list(1), list(2))),
+                   row(list(list(1), list(1))));
+
+        // Test Sets nested within Lists
+        assertRows(execute("SELECT [{}, {min(ck), max(ck)}] FROM %s"),
+                   row(list(set(), set(1, 3))));
+        assertRows(execute("SELECT [{}, {CAST(pk AS BIGINT), CAST(ck AS 
BIGINT), WRITETIME(t)}] FROM %s"),
+                   row(list(set(), set(1L, 1L, timestampInMicros))),
+                   row(list(set(), set(1L, 2L, timestampInMicros))),
+                   row(list(set(), set(1L, 3L, timestampInMicros))));
+        assertRows(execute("SELECT [{min(ck)}, {max(ck)}] FROM %s"),
+                   row(list(set(1), set(3))));
+        assertRows(execute("SELECT [{min(ck)}, ({max(ck)})] FROM %s"),
+                   row(list(set(1), set(3))));
+        assertRows(execute("SELECT [{pk}, {ck}] FROM %s"),
+                   row(list(set(1), set(1))),
+                   row(list(set(1), set(2))),
+                   row(list(set(1), set(3))));
+        assertRows(execute("SELECT [{pk}, {ck}] FROM %s WHERE pk = 1 ORDER BY 
ck DESC"),
+                   row(list(set(1), set(3))),
+                   row(list(set(1), set(2))),
+                   row(list(set(1), set(1))));
+
+        // Test Maps nested within Lists
+        assertRows(execute("SELECT [{}, (map<text, int>){'min' : min(ck), 
'max' : max(ck)}] FROM %s"),
+                   row(list(map(), map("min", 1, "max", 3))));
+        assertRows(execute("SELECT [{}, (map<text, bigint>){'pk' : CAST(pk AS 
BIGINT), 'ck' : CAST(ck AS BIGINT), 'writetime' : WRITETIME(t)}] FROM %s"),
+                   row(list(map(), map("pk", 1L, "ck", 1L, "writetime", 
timestampInMicros))),
+                   row(list(map(), map("pk", 1L, "ck", 2L, "writetime", 
timestampInMicros))),
+                   row(list(map(), map("pk", 1L, "ck", 3L, "writetime", 
timestampInMicros))));
+        assertRows(execute("SELECT [{}, (map<text, int>){'pk' : pk, 'ck' : 
ck}] FROM %s WHERE pk = 1 ORDER BY ck DESC"),
+                   row(list(map(), map("pk", 1, "ck", 3))),
+                   row(list(map(), map("pk", 1, "ck", 2))),
+                   row(list(map(), map("pk", 1, "ck", 1))));
+
+        // Test Tuples nested within Lists
+        assertRows(execute("SELECT [(pk, ck, WRITETIME(t))] FROM %s"),
+                   row(list(tuple(1, 1, timestampInMicros))),
+                   row(list(tuple(1, 2, timestampInMicros))),
+                   row(list(tuple(1, 3, timestampInMicros))));
+        assertRows(execute("SELECT [(min(ck), max(ck))] FROM %s"),
+                   row(list(tuple(1, 3))));
+        assertRows(execute("SELECT [(CAST(pk AS BIGINT), CAST(ck AS BIGINT)), 
(t, WRITETIME(t))] FROM %s"),
+                   row(list(tuple(1L, 1L), tuple("one", timestampInMicros))),
+                   row(list(tuple(1L, 2L), tuple("two", timestampInMicros))),
+                   row(list(tuple(1L, 3L), tuple("three", 
timestampInMicros))));
+
+        // Test UDTs nested within Lists
+        String type = createType("CREATE TYPE %s(a int, b int, c bigint)");
+        assertRows(execute("SELECT [(" + type + "){a : min(ck), b: max(ck)}] 
FROM %s"),
+                   row(list(userType("a", 1, "b", 3, "c", null))));
+        assertRows(execute("SELECT [(" + type + "){a : pk, b : ck, c : 
WRITETIME(t)}] FROM %s"),
+                   row(list(userType("a", 1, "b", 1, "c", timestampInMicros))),
+                   row(list(userType("a", 1, "b", 2, "c", timestampInMicros))),
+                   row(list(userType("a", 1, "b", 3, "c", 
timestampInMicros))));
+        assertRows(execute("SELECT [(" + type + "){a : pk, b : ck, c : 
WRITETIME(t)}] FROM %s WHERE pk = 1 ORDER BY ck DESC"),
+                   row(list(userType("a", 1, "b", 3, "c", timestampInMicros))),
+                   row(list(userType("a", 1, "b", 2, "c", timestampInMicros))),
+                   row(list(userType("a", 1, "b", 1, "c", 
timestampInMicros))));
+
+        // Test Lists nested within Sets
+        assertRows(execute("SELECT {[], [min(ck), max(ck)]} FROM %s"),
+                   row(set(list(), list(1, 3))));
+        assertRows(execute("SELECT {[], [pk, ck]} FROM %s LIMIT 2"),
+                   row(set(list(), list(1, 1))),
+                   row(set(list(), list(1, 2))));
+        assertRows(execute("SELECT {[], [pk, ck]} FROM %s WHERE pk = 1 ORDER 
BY ck DESC LIMIT 2"),
+                   row(set(list(), list(1, 3))),
+                   row(set(list(), list(1, 2))));
+        assertRows(execute("SELECT {[min(ck)], ([max(ck)])} FROM %s"),
+                   row(set(list(1), list(3))));
+        assertRows(execute("SELECT {[pk], ([ck])} FROM %s"),
+                   row(set(list(1), list(1))),
+                   row(set(list(1), list(2))),
+                   row(set(list(1), list(3))));
+        assertRows(execute("SELECT {([min(ck)]), [max(ck)]} FROM %s"),
+                   row(set(list(1), list(3))));
+
+        // Test Sets nested within Sets
+        assertRows(execute("SELECT {{}, {min(ck), max(ck)}} FROM %s"),
+                   row(set(set(), set(1, 3))));
+        assertRows(execute("SELECT {{}, {pk, ck}} FROM %s LIMIT 2"),
+                   row(set(set(), set(1, 1))),
+                   row(set(set(), set(1, 2))));
+        assertRows(execute("SELECT {{}, {pk, ck}} FROM %s WHERE pk = 1 ORDER 
BY ck DESC LIMIT 2"),
+                   row(set(set(), set(1, 3))),
+                   row(set(set(), set(1, 2))));
+        assertRows(execute("SELECT {{min(ck)}, ({max(ck)})} FROM %s"),
+                   row(set(set(1), set(3))));
+        assertRows(execute("SELECT {{pk}, ({ck})} FROM %s"),
+                   row(set(set(1), set(1))),
+                   row(set(set(1), set(2))),
+                   row(set(set(1), set(3))));
+        assertRows(execute("SELECT {({min(ck)}), {max(ck)}} FROM %s"),
+                   row(set(set(1), set(3))));
+
+        // Test Maps nested within Sets
+        assertRows(execute("SELECT {{}, (map<text, int>){'min' : min(ck), 
'max' : max(ck)}} FROM %s"),
+                   row(set(map(), map("min", 1, "max", 3))));
+        assertRows(execute("SELECT {{}, (map<text, int>){'pk' : pk, 'ck' : 
ck}} FROM %s"),
+                   row(set(map(), map("pk", 1, "ck", 1))),
+                   row(set(map(), map("pk", 1, "ck", 2))),
+                   row(set(map(), map("pk", 1, "ck", 3))));
+
+        // Test Tuples nested within Sets
+        assertRows(execute("SELECT {(pk, ck, WRITETIME(t))} FROM %s"),
+                   row(set(tuple(1, 1, timestampInMicros))),
+                   row(set(tuple(1, 2, timestampInMicros))),
+                   row(set(tuple(1, 3, timestampInMicros))));
+        assertRows(execute("SELECT {(min(ck), max(ck))} FROM %s"),
+                   row(set(tuple(1, 3))));
+
+        // Test UDTs nested within Sets
+        assertRows(execute("SELECT {(" + type + "){a : min(ck), b: max(ck)}} 
FROM %s"),
+                   row(set(userType("a", 1, "b", 3, "c", null))));
+        assertRows(execute("SELECT {(" + type + "){a : pk, b : ck, c : 
WRITETIME(t)}} FROM %s"),
+                   row(set(userType("a", 1, "b", 1, "c", timestampInMicros))),
+                   row(set(userType("a", 1, "b", 2, "c", timestampInMicros))),
+                   row(set(userType("a", 1, "b", 3, "c", timestampInMicros))));
+        assertRows(execute("SELECT {(" + type + "){a : pk, b : ck, c : 
WRITETIME(t)}} FROM %s WHERE pk = 1 ORDER BY ck DESC"),
+                   row(set(userType("a", 1, "b", 3, "c", timestampInMicros))),
+                   row(set(userType("a", 1, "b", 2, "c", timestampInMicros))),
+                   row(set(userType("a", 1, "b", 1, "c", timestampInMicros))));
+
+        // Test Lists nested within Maps
+        assertRows(execute("SELECT (map<frozen<list<int>>, 
frozen<list<int>>>){[min(ck)]:[max(ck)]} FROM %s"),
+                   row(map(list(1), list(3))));
+        assertRows(execute("SELECT (map<frozen<list<int>>, 
frozen<list<int>>>){[pk]: [ck]} FROM %s"),
+                   row(map(list(1), list(1))),
+                   row(map(list(1), list(2))),
+                   row(map(list(1), list(3))));
+
+        // Test Sets nested within Maps
+        assertRows(execute("SELECT (map<frozen<set<int>>, 
frozen<set<int>>>){{min(ck)} : {max(ck)}} FROM %s"),
+                   row(map(set(1), set(3))));
+        assertRows(execute("SELECT (map<frozen<set<int>>, 
frozen<set<int>>>){{pk} : {ck}} FROM %s"),
+                   row(map(set(1), set(1))),
+                   row(map(set(1), set(2))),
+                   row(map(set(1), set(3))));
+
+        // Test Maps nested within Maps
+        assertRows(execute("SELECT (map<frozen<map<text, int>>, 
frozen<map<text, int>>>){{'min' : min(ck)} : {'max' : max(ck)}} FROM %s"),
+                   row(map(map("min", 1), map("max", 3))));
+        assertRows(execute("SELECT (map<frozen<map<text, int>>, 
frozen<map<text, int>>>){{'pk' : pk} : {'ck' : ck}} FROM %s"),
+                   row(map(map("pk", 1), map("ck", 1))),
+                   row(map(map("pk", 1), map("ck", 2))),
+                   row(map(map("pk", 1), map("ck", 3))));
+
+        // Test Tuples nested within Maps
+        assertRows(execute("SELECT (map<frozen<tuple<int, int>>, 
frozen<tuple<bigint>>>){(pk, ck) : (WRITETIME(t))} FROM %s"),
+                   row(map(tuple(1, 1), tuple(timestampInMicros))),
+                   row(map(tuple(1, 2), tuple(timestampInMicros))),
+                   row(map(tuple(1, 3), tuple(timestampInMicros))));
+        assertRows(execute("SELECT (map<frozen<tuple<int>> , 
frozen<tuple<int>>>){(min(ck)) : (max(ck))} FROM %s"),
+                   row(map(tuple(1), tuple(3))));
+
+        // Test UDTs nested within Maps
+        assertRows(execute("SELECT (map<int, frozen<" + type + ">>){ck : {a : 
min(ck), b: max(ck)}} FROM %s"),
+                   row(map(1, userType("a", 1, "b", 3, "c", null))));
+        assertRows(execute("SELECT (map<int, frozen<" + type + ">>){ck : {a : 
pk, b : ck, c : WRITETIME(t)}} FROM %s"),
+                   row(map(1, userType("a", 1, "b", 1, "c", 
timestampInMicros))),
+                   row(map(2, userType("a", 1, "b", 2, "c", 
timestampInMicros))),
+                   row(map(3, userType("a", 1, "b", 3, "c", 
timestampInMicros))));
+        assertRows(execute("SELECT (map<int, frozen<" + type + ">>){ck : {a : 
pk, b : ck, c : WRITETIME(t)}} FROM %s WHERE pk = 1 ORDER BY ck DESC"),
+                   row(map(3, userType("a", 1, "b", 3, "c", 
timestampInMicros))),
+                   row(map(2, userType("a", 1, "b", 2, "c", 
timestampInMicros))),
+                   row(map(1, userType("a", 1, "b", 1, "c", 
timestampInMicros))));
+
+        // Test Lists nested within Tuples
+        assertRows(execute("SELECT ([min(ck)], [max(ck)]) FROM %s"),
+                   row(tuple(list(1), list(3))));
+        assertRows(execute("SELECT ([pk], [ck]) FROM %s"),
+                   row(tuple(list(1), list(1))),
+                   row(tuple(list(1), list(2))),
+                   row(tuple(list(1), list(3))));
+
+        // Test Sets nested within Tuples
+        assertRows(execute("SELECT ({min(ck)}, {max(ck)}) FROM %s"),
+                   row(tuple(set(1), set(3))));
+        assertRows(execute("SELECT ({pk}, {ck}) FROM %s"),
+                   row(tuple(set(1), set(1))),
+                   row(tuple(set(1), set(2))),
+                   row(tuple(set(1), set(3))));
+
+        // Test Maps nested within Tuples
+        assertRows(execute("SELECT ((map<text, int>){'min' : min(ck)}, 
(map<text, int>){'max' : max(ck)}) FROM %s"),
+                   row(tuple(map("min", 1), map("max", 3))));
+        assertRows(execute("SELECT ((map<text, int>){'pk' : pk}, (map<text, 
int>){'ck' : ck}) FROM %s"),
+                   row(tuple(map("pk", 1), map("ck", 1))),
+                   row(tuple(map("pk", 1), map("ck", 2))),
+                   row(tuple(map("pk", 1), map("ck", 3))));
+
+        // Test Tuples nested within Tuples
+        assertRows(execute("SELECT (tuple<tuple<int, int, bigint>>)((pk, ck, 
WRITETIME(t))) FROM %s"),
+                   row(tuple(tuple(1, 1, timestampInMicros))),
+                   row(tuple(tuple(1, 2, timestampInMicros))),
+                   row(tuple(tuple(1, 3, timestampInMicros))));
+        assertRows(execute("SELECT (tuple<tuple<int, int, bigint>>)((min(ck), 
max(ck))) FROM %s"),
+                   row(tuple(tuple(1, 3))));
+
+        assertRows(execute("SELECT ((t, WRITETIME(t)), (CAST(pk AS BIGINT), 
CAST(ck AS BIGINT))) FROM %s"),
+                   row(tuple(tuple("one", timestampInMicros), tuple(1L, 1L))),
+                   row(tuple(tuple("two", timestampInMicros), tuple(1L, 2L))),
+                   row(tuple(tuple("three", timestampInMicros), tuple(1L, 
3L))));
+
+        // Test UDTs nested within Tuples
+        assertRows(execute("SELECT (tuple<" + type + ">)({a : min(ck), b: 
max(ck)}) FROM %s"),
+                   row(tuple(userType("a", 1, "b", 3, "c", null))));
+        assertRows(execute("SELECT (tuple<" + type + ">)({a : pk, b : ck, c : 
WRITETIME(t)}) FROM %s"),
+                   row(tuple(userType("a", 1, "b", 1, "c", 
timestampInMicros))),
+                   row(tuple(userType("a", 1, "b", 2, "c", 
timestampInMicros))),
+                   row(tuple(userType("a", 1, "b", 3, "c", 
timestampInMicros))));
+        assertRows(execute("SELECT (tuple<" + type + ">)({a : pk, b : ck, c : 
WRITETIME(t)}) FROM %s WHERE pk = 1 ORDER BY ck DESC"),
+                   row(tuple(userType("a", 1, "b", 3, "c", 
timestampInMicros))),
+                   row(tuple(userType("a", 1, "b", 2, "c", 
timestampInMicros))),
+                   row(tuple(userType("a", 1, "b", 1, "c", 
timestampInMicros))));
+
+        // Test Lists nested within UDTs
+        String containerType = createType("CREATE TYPE %s(l list<int>)");
+        assertRows(execute("SELECT (" + containerType + "){l : [min(ck), 
max(ck)]} FROM %s"),
+                   row(userType("l", list(1, 3))));
+        assertRows(execute("SELECT (" + containerType + "){l : [pk, ck]} FROM 
%s"),
+                   row(userType("l", list(1, 1))),
+                   row(userType("l", list(1, 2))),
+                   row(userType("l", list(1, 3))));
+
+        // Test Sets nested within UDTs
+        containerType = createType("CREATE TYPE %s(s set<int>)");
+        assertRows(execute("SELECT (" + containerType + "){s : {min(ck), 
max(ck)}} FROM %s"),
+                   row(userType("s", set(1, 3))));
+        assertRows(execute("SELECT (" + containerType + "){s : {pk, ck}} FROM 
%s"),
+                   row(userType("s", set(1))),
+                   row(userType("s", set(1, 2))),
+                   row(userType("s", set(1, 3))));
+
+        // Test Maps nested within UDTs
+        containerType = createType("CREATE TYPE %s(m map<text, int>)");
+        assertRows(execute("SELECT (" + containerType + "){m : {'min' : 
min(ck), 'max' : max(ck)}} FROM %s"),
+                   row(userType("m", map("min", 1, "max", 3))));
+        assertRows(execute("SELECT (" + containerType + "){m : {'pk' : pk, 
'ck' : ck}} FROM %s"),
+                   row(userType("m", map("pk", 1, "ck", 1))),
+                   row(userType("m", map("pk", 1, "ck", 2))),
+                   row(userType("m", map("pk", 1, "ck", 3))));
+
+        // Test Tuples nested within UDTs
+        containerType = createType("CREATE TYPE %s(t tuple<int, int>, w 
tuple<bigint>)");
+        assertRows(execute("SELECT (" + containerType + "){t : (pk, ck), w : 
(WRITETIME(t))} FROM %s"),
+                   row(userType("t", tuple(1, 1), "w", 
tuple(timestampInMicros))),
+                   row(userType("t", tuple(1, 2), "w", 
tuple(timestampInMicros))),
+                   row(userType("t", tuple(1, 3), "w", 
tuple(timestampInMicros))));
+
+        // Test UDTs nested within Maps
+        containerType = createType("CREATE TYPE %s(t frozen<" + type + ">)");
+        assertRows(execute("SELECT (" + containerType + "){t : {a : min(ck), 
b: max(ck)}} FROM %s"),
+                   row(userType("t", userType("a", 1, "b", 3, "c", null))));
+        assertRows(execute("SELECT (" + containerType + "){t : {a : pk, b : 
ck, c : WRITETIME(t)}} FROM %s"),
+                   row(userType("t", userType("a", 1, "b", 1, "c", 
timestampInMicros))),
+                   row(userType("t", userType("a", 1, "b", 2, "c", 
timestampInMicros))),
+                   row(userType("t", userType("a", 1, "b", 3, "c", 
timestampInMicros))));
+        assertRows(execute("SELECT (" + containerType + "){t : {a : pk, b : 
ck, c : WRITETIME(t)}} FROM %s WHERE pk = 1 ORDER BY ck DESC"),
+                   row(userType("t", userType("a", 1, "b", 3, "c", 
timestampInMicros))),
+                   row(userType("t", userType("a", 1, "b", 2, "c", 
timestampInMicros))),
+                   row(userType("t", userType("a", 1, "b", 1, "c", 
timestampInMicros))));
+
+
+        // Test Litteral Set with Duration elements
+        assertInvalidMessage("Durations are not allowed inside sets: 
set<duration>",
+                             "SELECT pk, ck, (set<duration>){2d, 1mo} FROM 
%s");
+
+        assertInvalidMessage("Invalid field selection: system.min(ck) of type 
int is not a user type",
+                             "SELECT min(ck).min FROM %s");
+        assertInvalidMessage("Invalid field selection: (map<text, int>){'min': 
system.min(ck), 'max': system.max(ck)} of type frozen<map<text, int>> is not a 
user type",
+                             "SELECT (map<text, int>) {'min' : min(ck), 'max' 
: max(ck)}.min FROM %s");
+    }
+
+    @Test
+    public void testCollectionLiteralsWithDurations() throws Throwable
+    {
+        createTable("CREATE TABLE %s (pk int, ck int, d1 duration, d2 
duration, PRIMARY KEY (pk, ck) )");
+        execute("INSERT INTO %s (pk, ck, d1, d2) VALUES (1, 1, 15h, 13h)");
+        execute("INSERT INTO %s (pk, ck, d1, d2) VALUES (1, 2, 10h, 12h)");
+        execute("INSERT INTO %s (pk, ck, d1, d2) VALUES (1, 3, 11h, 13h)");
+
+        assertRows(execute("SELECT [d1, d2] FROM %s"),
+                   row(list(Duration.from("15h"), Duration.from("13h"))),
+                   row(list(Duration.from("10h"), Duration.from("12h"))),
+                   row(list(Duration.from("11h"), Duration.from("13h"))));
+
+        assertInvalidMessage("Durations are not allowed inside sets: 
frozen<set<duration>>", "SELECT {d1, d2} FROM %s");
+
+        assertRows(execute("SELECT (map<int, duration>){ck : d1} FROM %s"),
+                   row(map(1, Duration.from("15h"))),
+                   row(map(2, Duration.from("10h"))),
+                   row(map(3, Duration.from("11h"))));
+
+        assertInvalidMessage("Durations are not allowed as map keys: 
map<duration, int>",
+                             "SELECT (map<duration, int>){d1 : ck, d2 :ck} 
FROM %s");
     }
 
     @Test
@@ -81,11 +419,41 @@ public class TermSelectionTest extends CQLTester
 
         execute("INSERT INTO %s(k, v) VALUES (?, ?)", 0, userType("a", 3, "b", 
"foo"));
 
-        assertInvalidMessage("Cannot infer type for term", "SELECT k, v, { a: 
4, b: 'bar'} FROM %s");
+        assertInvalidMessage("Cannot infer type for term", "SELECT { a: 4, b: 
'bar'} FROM %s");
 
         assertRows(execute("SELECT k, v, (" + type + "){ a: 4, b: 'bar'} FROM 
%s"),
             row(0, userType("a", 3, "b", "foo"), userType("a", 4, "b", "bar"))
         );
+
+        assertRows(execute("SELECT k, v, (" + type + ")({ a: 4, b: 'bar'}) 
FROM %s"),
+            row(0, userType("a", 3, "b", "foo"), userType("a", 4, "b", "bar"))
+        );
+
+        assertRows(execute("SELECT k, v, ((" + type + "){ a: 4, b: 'bar'}).a 
FROM %s"),
+                   row(0, userType("a", 3, "b", "foo"), 4)
+        );
+
+        assertRows(execute("SELECT k, v, (" + type + "){ a: 4, b: 'bar'}.a 
FROM %s"),
+                   row(0, userType("a", 3, "b", "foo"), 4)
+        );
+
+        assertInvalidMessage("Cannot infer type for term", "SELECT { a: 4} 
FROM %s");
+
+        assertRows(execute("SELECT k, v, (" + type + "){ a: 4} FROM %s"),
+            row(0, userType("a", 3, "b", "foo"), userType("a", 4, "b", null))
+        );
+
+        assertRows(execute("SELECT k, v, (" + type + "){ b: 'bar'} FROM %s"),
+                   row(0, userType("a", 3, "b", "foo"), userType("a", null, 
"b", "bar"))
+        );
+
+        execute("INSERT INTO %s(k, v) VALUES (?, ?)", 1, userType("a", 5, "b", 
"foo"));
+        assertRows(execute("SELECT (" + type + "){ a: max(v.a) , b: 'max'} 
FROM %s"),
+                   row(userType("a", 5, "b", "max"))
+        );
+        assertRows(execute("SELECT (" + type + "){ a: min(v.a) , b: 'min'} 
FROM %s"),
+                   row(userType("a", 3, "b", "min"))
+        );
     }
 
     @Test
@@ -221,11 +589,11 @@ public class TermSelectionTest extends CQLTester
         createFunctionOverload(fAmbiguousFunc1, "int,int",
                                                 "CREATE FUNCTION %s (val1 int, 
val2 int) " +
                                                 "CALLED ON NULL INPUT " +
-                                                "RETURNS bigint " +
+                                                "RETURNS int " +
                                                 "LANGUAGE java\n" +
-                                                "AS 'return 
(long)Math.max(val1, val2);';");
-        assertInvalidMessage("Ambiguous call to function 
cql_test_keyspace.function_",
-                             "SELECT pk, " + fAmbiguousFunc1 + "(valInt, 100) 
FROM %s");
+                                                "AS 'return Math.max(val1, 
val2);';");
+        assertRows(execute("SELECT pk, " + fAmbiguousFunc1 + "(valInt, 100) 
FROM %s"),
+                   row(1, 100));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8b3de2f4/test/unit/org/apache/cassandra/cql3/validation/operations/SelectTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectTest.java 
b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectTest.java
index f167955..23a5a45 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectTest.java
@@ -4478,4 +4478,14 @@ public class SelectTest extends CQLTester
             });
         }
     }
+
+    @Test
+    public void testWithDistinctAndJsonAsColumnName() throws Throwable
+    {
+        createTable("CREATE TABLE %s (distinct int, json int, value int, 
PRIMARY KEY(distinct, json))");
+        execute("INSERT INTO %s (distinct, json, value) VALUES (0, 0, 0)");
+
+        assertRows(execute("SELECT distinct, json FROM %s"), row(0, 0));
+        assertRows(execute("SELECT distinct distinct FROM %s"), row(0));
+    }
 }

Reply via email to