citus/src/test/regress/expected/multi_select_for_update.out

185 lines
5.7 KiB
Plaintext

--
-- MULTI_SIZE_QUERIES
--
-- Test checks whether size of distributed tables can be obtained with citus_table_size.
-- To find the relation size and total relation size citus_relation_size and
-- citus_total_relation_size are also tested.
SET citus.next_shard_id TO 1460000;
SET citus.shard_replication_factor to 1;
CREATE TABLE test_table_1_rf1(id int, val_1 int);
SELECT create_distributed_table('test_table_1_rf1','id');
create_distributed_table
---------------------------------------------------------------------
(1 row)
INSERT INTO test_table_1_rf1 values(1,2),(2,3),(3,4),(15,16);
CREATE TABLE test_table_2_rf1(id int, val_1 int);
SELECT create_distributed_table('test_table_2_rf1','id');
create_distributed_table
---------------------------------------------------------------------
(1 row)
INSERT INTO test_table_2_rf1 values(1,2),(2,3),(3,4);
CREATE TABLE ref_table(id int, val_1 int);
SELECT create_reference_table('ref_table');
create_reference_table
---------------------------------------------------------------------
(1 row)
INSERT INTO ref_table values(1,2),(3,4),(5,6);
CREATE TABLE ref_table_2(id int, val_1 int);
SELECT create_reference_table('ref_table_2');
create_reference_table
---------------------------------------------------------------------
(1 row)
INSERT INTO ref_table_2 values(3,4),(5,6),(8,9);
SET citus.shard_replication_factor to 2;
CREATE TABLE test_table_3_rf2(id int, val_1 int);
SELECT create_distributed_table('test_table_3_rf2','id');
create_distributed_table
---------------------------------------------------------------------
(1 row)
INSERT INTO test_table_3_rf2 values(1,2),(2,3),(3,4);
CREATE TABLE test_table_4_rf2(id int, val_1 int);
SELECT create_distributed_table('test_table_4_rf2','id');
create_distributed_table
---------------------------------------------------------------------
(1 row)
INSERT INTO test_table_4_rf2 values(1,2),(2,3),(3,4);
-- Hash tables with RF = 1 is supported for router planner queries
SELECT * FROM
test_table_1_rf1 as tt1 INNER JOIN test_table_1_rf1 as tt2 on tt1.id = tt2.id
WHERE tt1.id = 1
ORDER BY 1
FOR UPDATE;
id | val_1 | id | val_1
---------------------------------------------------------------------
1 | 2 | 1 | 2
(1 row)
-- May hav two different filters on partition column, if they resulted on the same shard
SELECT * FROM
test_table_1_rf1 as tt1 WHERE tt1.id = 1 OR tt1.id = 15
ORDER BY 1
FOR UPDATE;
id | val_1
---------------------------------------------------------------------
1 | 2
15 | 16
(2 rows)
-- Only router plannable queries are supported right now.
SELECT * FROM
test_table_1_rf1 as tt1 INNER JOIN test_table_1_rf1 as tt2 on tt1.id = tt2.id
ORDER BY 1
FOR UPDATE;
ERROR: could not run distributed query with FOR UPDATE/SHARE commands
HINT: Consider using an equality filter on the distributed table's partition column.
-- RF > 1 is not supported
SELECT * FROM
test_table_1_rf1 as tt1 INNER JOIN test_table_3_rf2 as tt3 on tt1.id = tt3.id
WHERE tt1.id = 1
ORDER BY 1
FOR UPDATE;
ERROR: could not run distributed query with FOR UPDATE/SHARE commands
SELECT * FROM
test_table_1_rf1 as tt1 INNER JOIN test_table_3_rf2 as tt3 on tt1.id = tt3.id
ORDER BY 1
FOR UPDATE;
ERROR: could not run distributed query with FOR UPDATE/SHARE commands
SELECT * FROM
test_table_3_rf2 as tt3 INNER JOIN test_table_4_rf2 as tt4 on tt3.id = tt4.id
WHERE tt3.id = 1
ORDER BY 1
FOR UPDATE;
ERROR: could not run distributed query with FOR UPDATE/SHARE commands
HINT: Consider using an equality filter on the distributed table's partition column.
-- We take executor shard lock for reference tables
SELECT * FROM
test_table_1_rf1 as tt1 INNER JOIN ref_table as rt1 on tt1.id = rt1.id
WHERE tt1.id = 1
ORDER BY 1
FOR UPDATE;
id | val_1 | id | val_1
---------------------------------------------------------------------
1 | 2 | 1 | 2
(1 row)
-- Lock type varies according to the strength of row level lock
SELECT * FROM
test_table_1_rf1 as tt1 INNER JOIN ref_table as rt1 on tt1.id = rt1.id
WHERE tt1.id = 1
ORDER BY 1
FOR SHARE;
id | val_1 | id | val_1
---------------------------------------------------------------------
1 | 2 | 1 | 2
(1 row)
-- You can choose which tables should be affected by locking clause
SELECT * FROM
ref_table as rt1 INNER JOIN ref_table_2 as rt2 on rt1.id = rt2.id
ORDER BY 1
FOR UPDATE
OF rt1;
id | val_1 | id | val_1
---------------------------------------------------------------------
3 | 4 | 3 | 4
5 | 6 | 5 | 6
(2 rows)
-- You can choose which tables should be affected by locking clause
SELECT * FROM
ref_table as rt1 INNER JOIN ref_table_2 as rt2 on rt1.id = rt2.id
ORDER BY 1
FOR UPDATE
OF rt1
NOWAIT;
id | val_1 | id | val_1
---------------------------------------------------------------------
3 | 4 | 3 | 4
5 | 6 | 5 | 6
(2 rows)
-- queries with CTEs are supported
WITH first_value AS (
SELECT val_1 FROM test_table_1_rf1 WHERE id = 1 FOR UPDATE)
SELECT * FROM first_value;
val_1
---------------------------------------------------------------------
2
(1 row)
-- queries with modifying CTEs are also supported
WITH update_table AS (
UPDATE test_table_1_rf1 SET val_1 = 10 WHERE id = 1 RETURNING *
)
SELECT * FROM update_table FOR UPDATE;
id | val_1
---------------------------------------------------------------------
1 | 10
(1 row)
-- Subqueries also supported
SELECT * FROM (SELECT * FROM test_table_1_rf1 FOR UPDATE) foo WHERE id = 1;
id | val_1
---------------------------------------------------------------------
1 | 10
(1 row)
DROP TABLE test_table_1_rf1;
DROP TABLE test_table_2_rf1;
DROP TABLE ref_table;
DROP TABLE ref_table_2;
DROP TABLE test_table_3_rf2;
DROP TABLE test_table_4_rf2;