mirror of https://github.com/citusdata/citus.git
185 lines
5.7 KiB
Plaintext
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;
|