citus/src/test/regress/sql/multi_repartition_join_plan...

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;