mirror of https://github.com/apache/cassandra
Fix error when trying to assign a tuple to target type not being a tuple
patch by Stefan Miklosovic; reviewed by David Capwell for CASSANDRA-20237
This commit is contained in:
parent
b4bcdfa785
commit
06f0965a08
|
|
@ -1,4 +1,5 @@
|
||||||
5.1
|
5.1
|
||||||
|
* Fix error when trying to assign a tuple to target type not being a tuple (CASSANDRA-20237)
|
||||||
* Fail CREATE TABLE LIKE statement if UDTs in target keyspace do not exist or they have different structure from ones in source keyspace (CASSANDRA-19966)
|
* Fail CREATE TABLE LIKE statement if UDTs in target keyspace do not exist or they have different structure from ones in source keyspace (CASSANDRA-19966)
|
||||||
* Support octet_length and length functions (CASSANDRA-20102)
|
* Support octet_length and length functions (CASSANDRA-20102)
|
||||||
* Make JsonUtils serialize Instant always with the same format (CASSANDRA-20209)
|
* Make JsonUtils serialize Instant always with the same format (CASSANDRA-20209)
|
||||||
|
|
|
||||||
|
|
@ -68,14 +68,14 @@ public final class Tuples
|
||||||
if (elements.size() == 1 && !checkIfTupleType(receiver.type))
|
if (elements.size() == 1 && !checkIfTupleType(receiver.type))
|
||||||
return elements.get(0).prepare(keyspace, receiver);
|
return elements.get(0).prepare(keyspace, receiver);
|
||||||
|
|
||||||
|
validateTupleAssignableTo(receiver, elements);
|
||||||
|
|
||||||
TupleType tupleType = getTupleType(receiver.type);
|
TupleType tupleType = getTupleType(receiver.type);
|
||||||
|
|
||||||
if (elements.size() != tupleType.size())
|
if (elements.size() != tupleType.size())
|
||||||
throw invalidRequest("Expected %d elements in value for tuple %s, but got %d: %s",
|
throw invalidRequest("Expected %d elements in value for tuple %s, but got %d: %s",
|
||||||
tupleType.size(), receiver.name, elements.size(), this);
|
tupleType.size(), receiver.name, elements.size(), this);
|
||||||
|
|
||||||
validateTupleAssignableTo(receiver, elements);
|
|
||||||
|
|
||||||
List<Term> values = new ArrayList<>(elements.size());
|
List<Term> values = new ArrayList<>(elements.size());
|
||||||
boolean allTerminal = true;
|
boolean allTerminal = true;
|
||||||
for (int i = 0; i < elements.size(); i++)
|
for (int i = 0; i < elements.size(); i++)
|
||||||
|
|
|
||||||
|
|
@ -149,7 +149,7 @@ public class TupleTypeTest extends CQLTester
|
||||||
|
|
||||||
assertInvalidSyntax("INSERT INTO %s (k, t) VALUES (0, ())");
|
assertInvalidSyntax("INSERT INTO %s (k, t) VALUES (0, ())");
|
||||||
|
|
||||||
assertInvalidMessage("Expected 3 elements in value for tuple t, but got 4: (2, 'foo', 3.1, 'bar')",
|
assertInvalidMessage("Invalid tuple literal for t: too many elements. Type frozen<tuple<int, text, double>> expects 3 but got 4",
|
||||||
"INSERT INTO %s (k, t) VALUES (0, (2, 'foo', 3.1, 'bar'))");
|
"INSERT INTO %s (k, t) VALUES (0, (2, 'foo', 3.1, 'bar'))");
|
||||||
|
|
||||||
createTable("CREATE TABLE %s (k int PRIMARY KEY, t frozen<tuple<int, tuple<int, text, double>>>)");
|
createTable("CREATE TABLE %s (k int PRIMARY KEY, t frozen<tuple<int, tuple<int, text, double>>>)");
|
||||||
|
|
@ -159,6 +159,9 @@ public class TupleTypeTest extends CQLTester
|
||||||
|
|
||||||
assertInvalidMessage("Invalid tuple literal for t: component 1 is not of type frozen<tuple<int, text, double>>",
|
assertInvalidMessage("Invalid tuple literal for t: component 1 is not of type frozen<tuple<int, text, double>>",
|
||||||
"INSERT INTO %s (k, t) VALUES (0, (1, (1, '1', 1.0, 1)))");
|
"INSERT INTO %s (k, t) VALUES (0, (1, (1, '1', 1.0, 1)))");
|
||||||
|
|
||||||
|
assertInvalidMessage("Invalid tuple type literal for k of type int",
|
||||||
|
"SELECT * FROM %s WHERE k = ('a', 'b')");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ public class SelectMultiColumnRelationTest extends CQLTester
|
||||||
createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c, d))");
|
createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c, d))");
|
||||||
|
|
||||||
assertInvalidSyntax("SELECT * FROM %s WHERE a = 0 AND (b, c) > ()");
|
assertInvalidSyntax("SELECT * FROM %s WHERE a = 0 AND (b, c) > ()");
|
||||||
assertInvalidMessage("Expected 2 elements in value for tuple (b, c), but got 3: (?, ?, ?)",
|
assertInvalidMessage("Invalid tuple literal for (b, c): too many elements. Type frozen<tuple<int, int>> expects 2 but got 3",
|
||||||
"SELECT * FROM %s WHERE a = 0 AND (b, c) > (?, ?, ?)", 1, 2, 3);
|
"SELECT * FROM %s WHERE a = 0 AND (b, c) > (?, ?, ?)", 1, 2, 3);
|
||||||
assertInvalidMessage("Invalid null value for c in tuple (b, c)",
|
assertInvalidMessage("Invalid null value for c in tuple (b, c)",
|
||||||
"SELECT * FROM %s WHERE a = 0 AND (b, c) > (?, ?)", 1, null);
|
"SELECT * FROM %s WHERE a = 0 AND (b, c) > (?, ?)", 1, null);
|
||||||
|
|
@ -72,7 +72,7 @@ public class SelectMultiColumnRelationTest extends CQLTester
|
||||||
// Wrong number of values
|
// Wrong number of values
|
||||||
assertInvalidMessage("Expected 3 elements in value for tuple (b, c, d), but got 2: (?, ?)",
|
assertInvalidMessage("Expected 3 elements in value for tuple (b, c, d), but got 2: (?, ?)",
|
||||||
"SELECT * FROM %s WHERE a=0 AND (b, c, d) IN ((?, ?))", 0, 1);
|
"SELECT * FROM %s WHERE a=0 AND (b, c, d) IN ((?, ?))", 0, 1);
|
||||||
assertInvalidMessage("Expected 3 elements in value for tuple (b, c, d), but got 5: (?, ?, ?, ?, ?)",
|
assertInvalidMessage("Invalid tuple literal for (b, c, d): too many elements. Type frozen<tuple<int, int, int>> expects 3 but got 5",
|
||||||
"SELECT * FROM %s WHERE a=0 AND (b, c, d) IN ((?, ?, ?, ?, ?))", 0, 1, 2, 3, 4);
|
"SELECT * FROM %s WHERE a=0 AND (b, c, d) IN ((?, ?, ?, ?, ?))", 0, 1, 2, 3, 4);
|
||||||
|
|
||||||
// Missing first clustering column
|
// Missing first clustering column
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue