mirror of https://github.com/citusdata/citus.git
329 lines
7.6 KiB
Plaintext
329 lines
7.6 KiB
Plaintext
--
|
|
-- MULTI_SUBQUERY
|
|
--
|
|
-- Create tables for subquery tests
|
|
CREATE TABLE lineitem_subquery (
|
|
l_orderkey bigint not null,
|
|
l_partkey integer not null,
|
|
l_suppkey integer not null,
|
|
l_linenumber integer not null,
|
|
l_quantity decimal(15, 2) not null,
|
|
l_extendedprice decimal(15, 2) not null,
|
|
l_discount decimal(15, 2) not null,
|
|
l_tax decimal(15, 2) not null,
|
|
l_returnflag char(1) not null,
|
|
l_linestatus char(1) not null,
|
|
l_shipdate date not null,
|
|
l_commitdate date not null,
|
|
l_receiptdate date not null,
|
|
l_shipinstruct char(25) not null,
|
|
l_shipmode char(10) not null,
|
|
l_comment varchar(44) not null,
|
|
PRIMARY KEY(l_orderkey, l_linenumber) );
|
|
SELECT master_create_distributed_table('lineitem_subquery', 'l_orderkey', 'range');
|
|
master_create_distributed_table
|
|
---------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE orders_subquery (
|
|
o_orderkey bigint not null,
|
|
o_custkey integer not null,
|
|
o_orderstatus char(1) not null,
|
|
o_totalprice decimal(15,2) not null,
|
|
o_orderdate date not null,
|
|
o_orderpriority char(15) not null,
|
|
o_clerk char(15) not null,
|
|
o_shippriority integer not null,
|
|
o_comment varchar(79) not null,
|
|
PRIMARY KEY(o_orderkey) );
|
|
SELECT master_create_distributed_table('orders_subquery', 'o_orderkey', 'range');
|
|
master_create_distributed_table
|
|
---------------------------------
|
|
|
|
(1 row)
|
|
|
|
SET citus.task_executor_type TO 'task-tracker';
|
|
-- Check that we don't allow subquery pushdown in default settings.
|
|
SELECT
|
|
avg(unit_price)
|
|
FROM
|
|
(SELECT
|
|
l_orderkey,
|
|
avg(o_totalprice) AS unit_price
|
|
FROM
|
|
lineitem_subquery,
|
|
orders_subquery
|
|
WHERE
|
|
l_orderkey = o_orderkey
|
|
GROUP BY
|
|
l_orderkey) AS unit_prices;
|
|
ERROR: cannot perform distributed planning on this query
|
|
DETAIL: Join in subqueries is not supported yet
|
|
SET citus.subquery_pushdown to TRUE;
|
|
-- Check that we don't crash if there are not any shards.
|
|
SELECT
|
|
avg(unit_price)
|
|
FROM
|
|
(SELECT
|
|
l_orderkey,
|
|
avg(o_totalprice) AS unit_price
|
|
FROM
|
|
lineitem_subquery,
|
|
orders_subquery
|
|
WHERE
|
|
l_orderkey = o_orderkey
|
|
GROUP BY
|
|
l_orderkey) AS unit_prices;
|
|
avg
|
|
-----
|
|
|
|
(1 row)
|
|
|
|
-- Stage data to tables.
|
|
SET citus.shard_max_size TO "1MB";
|
|
\STAGE lineitem_subquery FROM '@abs_srcdir@/data/lineitem.1.data' with delimiter '|'
|
|
\STAGE lineitem_subquery FROM '@abs_srcdir@/data/lineitem.2.data' with delimiter '|'
|
|
\STAGE orders_subquery FROM '@abs_srcdir@/data/orders.1.data' with delimiter '|'
|
|
\STAGE orders_subquery FROM '@abs_srcdir@/data/orders.2.data' with delimiter '|'
|
|
-- Check that we error out if shard min/max values are not exactly same.
|
|
SELECT
|
|
avg(unit_price)
|
|
FROM
|
|
(SELECT
|
|
l_orderkey,
|
|
avg(o_totalprice) AS unit_price
|
|
FROM
|
|
lineitem_subquery,
|
|
orders_subquery
|
|
WHERE
|
|
l_orderkey = o_orderkey
|
|
GROUP BY
|
|
l_orderkey) AS unit_prices;
|
|
ERROR: cannot push down this subquery
|
|
DETAIL: Shards of relations in subquery need to have 1-to-1 shard partitioning
|
|
-- Update metadata in order to make all shards equal.
|
|
UPDATE pg_dist_shard SET shardmaxvalue = '14947' WHERE shardid = 102024;
|
|
-- If group by is not on partition column then we error out.
|
|
SELECT
|
|
avg(order_count)
|
|
FROM
|
|
(SELECT
|
|
l_suppkey,
|
|
count(*) AS order_count
|
|
FROM
|
|
lineitem_subquery
|
|
GROUP BY
|
|
l_suppkey) AS order_counts;
|
|
ERROR: cannot push down this subquery
|
|
DETAIL: Group by list without partition column is currently unsupported
|
|
-- Check that we error out if join is not on partition columns.
|
|
SELECT
|
|
avg(unit_price)
|
|
FROM
|
|
(SELECT
|
|
l_orderkey,
|
|
avg(o_totalprice / l_quantity) AS unit_price
|
|
FROM
|
|
lineitem_subquery,
|
|
orders_subquery
|
|
GROUP BY
|
|
l_orderkey) AS unit_prices;
|
|
ERROR: cannot push down this subquery
|
|
DETAIL: Relations need to be joining on partition columns
|
|
SELECT
|
|
avg(unit_price)
|
|
FROM
|
|
(SELECT
|
|
l_orderkey,
|
|
avg(o_totalprice / l_quantity) AS unit_price
|
|
FROM
|
|
lineitem_subquery,
|
|
orders_subquery
|
|
WHERE
|
|
l_orderkey = o_custkey
|
|
GROUP BY
|
|
l_orderkey) AS unit_prices;
|
|
ERROR: cannot push down this subquery
|
|
DETAIL: Relations need to be joining on partition columns
|
|
-- Check that we error out if there is union all.
|
|
SELECT count(*) FROM
|
|
(
|
|
(SELECT l_orderkey FROM lineitem_subquery) UNION ALL
|
|
(SELECT 1::bigint)
|
|
) b;
|
|
ERROR: cannot perform distributed planning on this query
|
|
DETAIL: Complex table expressions are currently unsupported
|
|
-- Check that we error out if queries in union do not include partition columns.
|
|
SELECT count(*) FROM
|
|
(
|
|
(SELECT l_orderkey FROM lineitem_subquery) UNION
|
|
(SELECT l_partkey FROM lineitem_subquery)
|
|
) b;
|
|
ERROR: cannot push down this subquery
|
|
DETAIL: Union clauses need to select partition columns
|
|
-- Check that we run union queries if partition column is selected.
|
|
SELECT count(*) FROM
|
|
(
|
|
(SELECT l_orderkey FROM lineitem_subquery) UNION
|
|
(SELECT l_orderkey FROM lineitem_subquery)
|
|
) b;
|
|
count
|
|
-------
|
|
2985
|
|
(1 row)
|
|
|
|
-- Check that we error out if the outermost query has subquery join.
|
|
SELECT
|
|
avg(o_totalprice/l_quantity)
|
|
FROM
|
|
(SELECT
|
|
l_orderkey,
|
|
l_quantity
|
|
FROM
|
|
lineitem_subquery
|
|
ORDER BY
|
|
l_quantity
|
|
LIMIT 10
|
|
) lineitem_quantities
|
|
JOIN LATERAL
|
|
(SELECT
|
|
o_totalprice
|
|
FROM
|
|
orders_subquery
|
|
WHERE
|
|
lineitem_quantities.l_orderkey = o_orderkey) orders_price ON true;
|
|
ERROR: cannot perform distributed planning on this query
|
|
DETAIL: Join in subqueries is not supported yet
|
|
-- Check that we error out if the outermost query is a distinct clause.
|
|
SELECT
|
|
count(DISTINCT a)
|
|
FROM (
|
|
SELECT
|
|
count(*) a
|
|
FROM
|
|
lineitem_subquery
|
|
) z;
|
|
ERROR: cannot push down this subquery
|
|
DETAIL: distinct in the outermost query is unsupported
|
|
-- Check supported subquery types.
|
|
SELECT
|
|
o_custkey,
|
|
sum(order_count) as total_order_count
|
|
FROM
|
|
(SELECT
|
|
o_orderkey,
|
|
o_custkey,
|
|
count(*) AS order_count
|
|
FROM
|
|
orders_subquery
|
|
WHERE
|
|
o_orderkey > 0 AND
|
|
o_orderkey < 12000
|
|
GROUP BY
|
|
o_orderkey, o_custkey) AS order_counts
|
|
GROUP BY
|
|
o_custkey
|
|
ORDER BY
|
|
total_order_count DESC,
|
|
o_custkey ASC
|
|
LIMIT 10;
|
|
o_custkey | total_order_count
|
|
-----------+-------------------
|
|
1462 | 9
|
|
619 | 8
|
|
643 | 8
|
|
1030 | 8
|
|
1486 | 8
|
|
79 | 7
|
|
304 | 7
|
|
319 | 7
|
|
343 | 7
|
|
448 | 7
|
|
(10 rows)
|
|
|
|
SELECT
|
|
avg(unit_price)
|
|
FROM
|
|
(SELECT
|
|
l_orderkey,
|
|
avg(o_totalprice / l_quantity) AS unit_price
|
|
FROM
|
|
lineitem_subquery,
|
|
orders_subquery
|
|
WHERE
|
|
l_orderkey = o_orderkey
|
|
GROUP BY
|
|
l_orderkey) AS unit_prices
|
|
WHERE
|
|
unit_price > 1000 AND
|
|
unit_price < 10000;
|
|
avg
|
|
-----------------------
|
|
4968.2889885208475549
|
|
(1 row)
|
|
|
|
-- Check that if subquery is pulled, we don't error and run query properly.
|
|
SELECT count(*) FROM
|
|
(
|
|
SELECT l_orderkey FROM (
|
|
(SELECT l_orderkey FROM lineitem_subquery) UNION
|
|
(SELECT l_orderkey FROM lineitem_subquery)
|
|
) a
|
|
WHERE l_orderkey = 1
|
|
) b;
|
|
count
|
|
-------
|
|
1
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM
|
|
(
|
|
SELECT * FROM (
|
|
(SELECT * FROM lineitem_subquery) UNION
|
|
(SELECT * FROM lineitem_subquery)
|
|
) a
|
|
WHERE l_orderkey = 1
|
|
) b;
|
|
count
|
|
-------
|
|
6
|
|
(1 row)
|
|
|
|
SELECT max(l_orderkey) FROM
|
|
(
|
|
SELECT l_orderkey FROM (
|
|
SELECT
|
|
l_orderkey
|
|
FROM
|
|
lineitem_subquery
|
|
WHERE
|
|
l_orderkey < 20000
|
|
GROUP BY
|
|
l_orderkey
|
|
) z
|
|
) y;
|
|
max
|
|
-------
|
|
14947
|
|
(1 row)
|
|
|
|
-- Load more data to one relation, then test if we error out because of different
|
|
-- shard counts for joining relations.
|
|
\STAGE orders_subquery FROM '@abs_srcdir@/data/orders.1.data' with delimiter '|'
|
|
SELECT
|
|
avg(unit_price)
|
|
FROM
|
|
(SELECT
|
|
l_orderkey,
|
|
avg(o_totalprice / l_quantity) AS unit_price
|
|
FROM
|
|
lineitem_subquery,
|
|
orders_subquery
|
|
WHERE
|
|
l_orderkey = o_orderkey
|
|
GROUP BY
|
|
l_orderkey) AS unit_prices;
|
|
ERROR: cannot push down this subquery
|
|
DETAIL: Shards of relations in subquery need to have 1-to-1 shard partitioning
|