mirror of https://github.com/citusdata/citus.git
133 lines
3.2 KiB
PL/PgSQL
133 lines
3.2 KiB
PL/PgSQL
--
|
|
-- MULTI_REPARTITION_JOIN_PLANNING
|
|
--
|
|
-- Tests that cover repartition join planning. Note that we explicitly start a
|
|
-- transaction block here so that we don't emit debug messages with changing
|
|
-- transaction ids in them.
|
|
|
|
|
|
SET citus.next_shard_id TO 690000;
|
|
SET citus.enable_unique_job_ids TO off;
|
|
SET citus.enable_repartition_joins to ON;
|
|
|
|
create schema repartition_join;
|
|
DROP TABLE IF EXISTS repartition_join.order_line;
|
|
CREATE TABLE order_line (
|
|
ol_w_id int NOT NULL,
|
|
ol_d_id int NOT NULL,
|
|
ol_o_id int NOT NULL,
|
|
ol_number int NOT NULL,
|
|
ol_i_id int NOT NULL,
|
|
ol_quantity decimal(2,0) NOT NULL,
|
|
PRIMARY KEY (ol_w_id,ol_d_id,ol_o_id,ol_number)
|
|
);
|
|
|
|
DROP TABLE IF EXISTS repartition_join.stock;
|
|
CREATE TABLE stock (
|
|
s_w_id int NOT NULL,
|
|
s_i_id int NOT NULL,
|
|
s_quantity decimal(4,0) NOT NULL,
|
|
PRIMARY KEY (s_w_id,s_i_id)
|
|
);
|
|
|
|
SELECT create_distributed_table('order_line','ol_w_id');
|
|
SELECT create_distributed_table('stock','s_w_id');
|
|
|
|
BEGIN;
|
|
SET client_min_messages TO DEBUG;
|
|
|
|
-- Debug4 log messages display jobIds within them. We explicitly set the jobId
|
|
-- sequence here so that the regression output becomes independent of the number
|
|
-- of jobs executed prior to running this test.
|
|
|
|
|
|
-- Multi-level repartition join to verify our projection columns are correctly
|
|
-- referenced and propagated across multiple repartition jobs. The test also
|
|
-- validates that only the minimal necessary projection columns are transferred
|
|
-- between jobs.
|
|
|
|
SELECT
|
|
l_partkey, o_orderkey, count(*)
|
|
FROM
|
|
lineitem, part_append, orders, customer_append
|
|
WHERE
|
|
l_orderkey = o_orderkey AND
|
|
l_partkey = p_partkey AND
|
|
c_custkey = o_custkey AND
|
|
(l_quantity > 5.0 OR l_extendedprice > 1200.0) AND
|
|
p_size > 8 AND o_totalprice > 10.0 AND
|
|
c_acctbal < 5000.0 AND l_partkey < 1000
|
|
GROUP BY
|
|
l_partkey, o_orderkey
|
|
ORDER BY
|
|
l_partkey, o_orderkey;
|
|
|
|
SELECT
|
|
l_partkey, o_orderkey, count(*)
|
|
FROM
|
|
lineitem, orders
|
|
WHERE
|
|
l_suppkey = o_shippriority AND
|
|
l_quantity < 5.0 AND o_totalprice <> 4.0
|
|
GROUP BY
|
|
l_partkey, o_orderkey
|
|
ORDER BY
|
|
l_partkey, o_orderkey;
|
|
|
|
-- Check that grouping by primary key allows o_shippriority to be in the target list
|
|
SELECT
|
|
o_orderkey, o_shippriority, count(*)
|
|
FROM
|
|
lineitem, orders
|
|
WHERE
|
|
l_suppkey = o_shippriority
|
|
GROUP BY
|
|
o_orderkey
|
|
ORDER BY
|
|
o_orderkey;
|
|
|
|
-- Check that grouping by primary key allows o_shippriority to be in the target
|
|
-- list
|
|
-- Postgres removes o_shippriority from the group by clause here
|
|
SELECT
|
|
o_orderkey, o_shippriority, count(*)
|
|
FROM
|
|
lineitem, orders
|
|
WHERE
|
|
l_suppkey = o_shippriority
|
|
GROUP BY
|
|
o_orderkey, o_shippriority
|
|
ORDER BY
|
|
o_orderkey;
|
|
|
|
-- Check that calling any_value manually works as well
|
|
SELECT
|
|
o_orderkey, any_value(o_shippriority)
|
|
FROM
|
|
lineitem, orders
|
|
WHERE
|
|
l_suppkey = o_shippriority
|
|
GROUP BY
|
|
o_orderkey, o_shippriority
|
|
ORDER BY
|
|
o_orderkey;
|
|
|
|
|
|
-- Check that grouping by primary key allows s_quantity to be in the having
|
|
-- list
|
|
-- Postgres removes s_quantity from the group by clause here
|
|
|
|
select s_i_id
|
|
from stock, order_line
|
|
where ol_i_id=s_i_id
|
|
group by s_i_id, s_w_id, s_quantity
|
|
having s_quantity > random()
|
|
;
|
|
|
|
-- Reset client logging level to its previous value
|
|
|
|
SET client_min_messages TO NOTICE;
|
|
COMMIT;
|
|
|
|
drop schema repartition_join;
|