mirror of
https://github.com/scylladb/scylladb.git
synced 2026-05-31 03:56:42 +00:00
Scylla now takes a custom timestamp into account when executing list append/prepend operations. Test the new semantics.
361 lines
6.4 KiB
Plaintext
361 lines
6.4 KiB
Plaintext
CREATE TABLE t (pk INT PRIMARY KEY, l LIST<INT>);
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
UPDATE t SET l = [-1] + l WHERE pk = 0;
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-1]"
|
|
}
|
|
]
|
|
}
|
|
UPDATE t SET l = [-3,-2] + l WHERE pk = 0;
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-3, -2, -1]"
|
|
}
|
|
]
|
|
}
|
|
UPDATE t SET l = [-4] + l WHERE pk = 0 IF EXISTS;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"[applied]" : "true",
|
|
"l" : "[-3, -2, -1]",
|
|
"pk" : "0"
|
|
}
|
|
]
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-4, -3, -2, -1]"
|
|
}
|
|
]
|
|
}
|
|
UPDATE t SET l = [-6, -5] + l WHERE pk = 0 IF EXISTS;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"[applied]" : "true",
|
|
"l" : "[-4, -3, -2, -1]",
|
|
"pk" : "0"
|
|
}
|
|
]
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-6, -5, -4, -3, -2, -1]"
|
|
}
|
|
]
|
|
}
|
|
UPDATE t SET l = l + [1] WHERE pk = 0;
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-6, -5, -4, -3, -2, -1, 1]"
|
|
}
|
|
]
|
|
}
|
|
UPDATE t SET l = l + [2,3] WHERE pk = 0;
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-6, -5, -4, -3, -2, -1, 1, 2, 3]"
|
|
}
|
|
]
|
|
}
|
|
UPDATE t SET l = l + [4] WHERE pk = 0 IF EXISTS;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"[applied]" : "true",
|
|
"l" : "[-6, -5, -4, -3, -2, -1, 1, 2, 3]",
|
|
"pk" : "0"
|
|
}
|
|
]
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-6, -5, -4, -3, -2, -1, 1, 2, 3, 4]"
|
|
}
|
|
]
|
|
}
|
|
UPDATE t SET l = l + [5,6] WHERE pk = 0 IF EXISTS;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"[applied]" : "true",
|
|
"l" : "[-6, -5, -4, -3, -2, -1, 1, 2, 3, 4]",
|
|
"pk" : "0"
|
|
}
|
|
]
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6]"
|
|
}
|
|
]
|
|
}
|
|
BEGIN BATCH
|
|
UPDATE t SET l = l + [7] WHERE pk = 0
|
|
UPDATE t SET l = [-7] + l WHERE pk = 0
|
|
UPDATE t SET l = l + [8, 9] WHERE pk = 0
|
|
UPDATE t SET l = l + [10] WHERE pk = 0
|
|
UPDATE t SET l = [-9, -8] + l WHERE pk = 0
|
|
UPDATE t SET l = [-10] + l WHERE pk = 0
|
|
APPLY BATCH;
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
|
|
}
|
|
]
|
|
}
|
|
-- LWT batch
|
|
BEGIN BATCH
|
|
UPDATE t SET l = [-11] + l WHERE pk = 0 IF EXISTS
|
|
UPDATE t SET l = [-13, -12] + l WHERE pk = 0 IF EXISTS
|
|
UPDATE t SET l = [-14] + l WHERE pk = 0 IF EXISTS
|
|
UPDATE t SET l = l + [11] WHERE pk = 0 IF EXISTS
|
|
UPDATE t SET l = l + [12, 13] WHERE pk = 0 IF EXISTS
|
|
UPDATE t SET l = l + [14] WHERE pk = 0 IF EXISTS
|
|
APPLY BATCH;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"[applied]" : "true",
|
|
"l" : "[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]",
|
|
"pk" : "0"
|
|
},
|
|
{
|
|
"[applied]" : "true",
|
|
"l" : "[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]",
|
|
"pk" : "0"
|
|
},
|
|
{
|
|
"[applied]" : "true",
|
|
"l" : "[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]",
|
|
"pk" : "0"
|
|
},
|
|
{
|
|
"[applied]" : "true",
|
|
"l" : "[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]",
|
|
"pk" : "0"
|
|
},
|
|
{
|
|
"[applied]" : "true",
|
|
"l" : "[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]",
|
|
"pk" : "0"
|
|
},
|
|
{
|
|
"[applied]" : "true",
|
|
"l" : "[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]",
|
|
"pk" : "0"
|
|
}
|
|
]
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]"
|
|
}
|
|
]
|
|
}
|
|
|
|
DROP TABLE t;
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
-- test custom timestamps
|
|
-- Scylla, unlike Cassandra, takes custom timestamps into account
|
|
-- in list append/prepend operations
|
|
CREATE TABLE t (pk INT PRIMARY KEY, l LIST<INT>);
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
|
|
-- Even though it's an append, since the timestamp is in the past,
|
|
-- the result is going to be a prepend
|
|
UPDATE t USING TIMESTAMP 1607100000000000 SET l = l + [-4] WHERE pk = 0;
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-4]"
|
|
}
|
|
]
|
|
}
|
|
-- using the same timestamp will reset the value to a new one, but only if
|
|
-- it is larger lexicographically
|
|
UPDATE t USING TIMESTAMP 1607100000000000 SET l = l + [-5] WHERE pk = 0;
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-4]"
|
|
}
|
|
]
|
|
}
|
|
UPDATE t USING TIMESTAMP 1607100000000000 SET l = l + [-3] WHERE pk = 0;
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-3]"
|
|
}
|
|
]
|
|
}
|
|
-- and what if we try two values at once?
|
|
UPDATE t USING TIMESTAMP 1607100000000000 SET l = l + [-5, -2] WHERE pk = 0;
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-3, -2]"
|
|
}
|
|
]
|
|
}
|
|
-- if a timestamp grows, the new value is after the previous one in the list
|
|
UPDATE t USING TIMESTAMP 1607100000000001 SET l = l + [-1] WHERE pk = 0;
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-3, -2, -1]"
|
|
}
|
|
]
|
|
}
|
|
-- And if it goes back, it's prepended
|
|
UPDATE t USING TIMESTAMP 1607099999999999 SET l = l + [-4] WHERE pk = 0;
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-4, -3, -2, -1]"
|
|
}
|
|
]
|
|
}
|
|
-- The batch has both list append and prepend.
|
|
-- The relative order of appends and prepends in the batch
|
|
-- is correct, but since batch timestamp is lower
|
|
-- than anything that is already in the list cell
|
|
-- all appends and prepends of the batch end up
|
|
-- preceding all previous values of the list.
|
|
BEGIN BATCH USING TIMESTAMP 1607099999999998
|
|
UPDATE t SET l = [-5] + l WHERE pk = 0
|
|
UPDATE t SET l = [-7, -6] + l WHERE pk = 0
|
|
UPDATE t SET l = [-8] + l WHERE pk = 0
|
|
UPDATE t SET l = l + [0] WHERE pk = 0
|
|
UPDATE t SET l = l + [1, 2] WHERE pk = 0
|
|
UPDATE t SET l = l + [3] WHERE pk = 0
|
|
APPLY BATCH;
|
|
{
|
|
"status" : "ok"
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-8, -7, -6, -5, 0, 1, 2, 3, -4, -3, -2, -1]"
|
|
}
|
|
]
|
|
}
|
|
-- try a very low timestamp
|
|
BEGIN BATCH USING TIMESTAMP 1000
|
|
UPDATE t SET l = [-8] + l WHERE pk = 0
|
|
UPDATE t SET l = [-10, -9] + l WHERE pk = 0
|
|
UPDATE t SET l = [-11] + l WHERE pk = 0
|
|
UPDATE t SET l = l + [4] WHERE pk = 0
|
|
UPDATE t SET l = l + [5, 6] WHERE pk = 0
|
|
UPDATE t SET l = l + [7] WHERE pk = 0
|
|
APPLY BATCH;
|
|
{
|
|
"message" : "exceptions::invalid_request_exception (List prepend custom timestamp must be greater than Jan 1 2010 00:00:00)",
|
|
"status" : "error"
|
|
}
|
|
SELECT l FROM t WHERE pk = 0;
|
|
{
|
|
"rows" :
|
|
[
|
|
{
|
|
"l" : "[-8, -7, -6, -5, 0, 1, 2, 3, -4, -3, -2, -1]"
|
|
}
|
|
]
|
|
}
|
|
|
|
DROP TABLE t;
|
|
{
|
|
"status" : "ok"
|
|
}
|