improve comments/ error checks for CTEs and set operations

pull/896/head
Onder Kalaci 2016-10-20 09:39:32 +03:00
parent 6658048b36
commit 56651c7511
3 changed files with 147 additions and 108 deletions

View File

@ -551,6 +551,19 @@ ErrorIfMultiTaskRouterSelectQueryUnsupported(Query *query)
"INSERT ... SELECT queries"))); "INSERT ... SELECT queries")));
} }
/*
* We currently do not support CTEs. In order to handle CTEs, consider expanding
* IsPartitionColumnRecursive() to handle CTEs.
*/
if (subquery->cteList != NULL)
{
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("cannot perform distributed planning for the given "
"modification"),
errdetail("Common table expressions are not allowed in "
"INSERT ... SELECT queries")));
}
/* see comment on AddUninstantiatedPartitionColumnEqualityQual() */ /* see comment on AddUninstantiatedPartitionColumnEqualityQual() */
if (subquery->setOperations != NULL) if (subquery->setOperations != NULL)
{ {
@ -655,32 +668,15 @@ AddUninstantiatedPartitionColumnEqualityQual(Query *originalQuery)
Assert(InsertSelectQuery(originalQuery)); Assert(InsertSelectQuery(originalQuery));
/* we currently do not support CTEs */
if (originalQuery->cteList != NULL)
{
return;
}
subqueryEntry = ExtractSelectRangeTableEntry(originalQuery); subqueryEntry = ExtractSelectRangeTableEntry(originalQuery);
subquery = subqueryEntry->subquery; subquery = subqueryEntry->subquery;
/* /*
* We currently not support the subquery with set operations for three reasons. * We currently not support the subquery with set operations. The main reason is that
* * there is an "Assert(parse->jointree->quals == NULL);" on standard planner's execution
* (i) Adding only a single qual where there are more than one join trees * path (i.e., plan_set_operations).
* leads to an assertion failure on the standard planner (i.e., * If we are to add uninstantiated equality qual to the query, we may end up hitting that
* Assert(parse->jointree->quals == NULL); on plan_set_operations()). * assertion, so it's better not to support for now.
* [THE ABOVE COMMENT IS TO EASE THE REVIEW, REMOVE LATER ON]
*
* (ii) There are potentially multiple jointree quals that we need to add
* the qual, and we haven't implemented that logic yet.
*
* (iii) We cannot get the source tables OID via target entries resorigtbl field.
* This makes hard to check the colocation requirement of the source and target
* tables.
*
* Note that we do not allow set operations on the lower level's of the subquery
* as well, which is handled on ErrorIfMultiTaskRouterSelectQueryUnsupported().
*/ */
if (subquery->setOperations != NULL) if (subquery->setOperations != NULL)
{ {

View File

@ -640,10 +640,10 @@ DEBUG: sent COMMIT over connection 13300010
(1 row) (1 row)
-- TODO:: add hll and date_trunc -- TODO:: add hll and date_trunc
INSERT INTO agg_events (user_id, value_1_agg) INSERT INTO agg_events (user_id, value_1_agg)
SELECT SELECT
user_id, sum(value_1 + value_2) user_id, sum(value_1 + value_2)
FROM FROM
raw_events_first GROUP BY user_id; raw_events_first GROUP BY user_id;
DEBUG: StartTransactionCommand DEBUG: StartTransactionCommand
DEBUG: StartTransaction DEBUG: StartTransaction
@ -678,10 +678,10 @@ DEBUG: sent COMMIT over connection 13300009
DEBUG: sent COMMIT over connection 13300010 DEBUG: sent COMMIT over connection 13300010
DEBUG: sent COMMIT over connection 13300010 DEBUG: sent COMMIT over connection 13300010
-- FILTER CLAUSE -- FILTER CLAUSE
INSERT INTO agg_events (user_id, value_1_agg) INSERT INTO agg_events (user_id, value_1_agg)
SELECT SELECT
user_id, sum(value_1 + value_2) FILTER (where value_3 = 15) user_id, sum(value_1 + value_2) FILTER (where value_3 = 15)
FROM FROM
raw_events_first GROUP BY user_id; raw_events_first GROUP BY user_id;
DEBUG: StartTransactionCommand DEBUG: StartTransactionCommand
DEBUG: StartTransaction DEBUG: StartTransaction
@ -715,51 +715,15 @@ DEBUG: sent COMMIT over connection 13300009
DEBUG: sent COMMIT over connection 13300009 DEBUG: sent COMMIT over connection 13300009
DEBUG: sent COMMIT over connection 13300010 DEBUG: sent COMMIT over connection 13300010
DEBUG: sent COMMIT over connection 13300010 DEBUG: sent COMMIT over connection 13300010
-- a very simple UNION query
INSERT INTO
raw_events_first(user_id)
SELECT
user_id
FROM
((SELECT user_id FROM raw_events_first) UNION
(SELECT user_id FROM raw_events_second)) as foo;
DEBUG: StartTransactionCommand
DEBUG: StartTransaction
DEBUG: name: unnamed; blockState: DEFAULT; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children:
ERROR: cannot perform distributed planning for the given modification
DETAIL: Set operations are not allowed in INSERT ... SELECT queries
-- same query with slightly different syntax, but this time we cannot push it down
INSERT INTO
raw_events_first(user_id)
(SELECT user_id FROM raw_events_first) UNION
(SELECT user_id FROM raw_events_first);
DEBUG: StartTransactionCommand
DEBUG: StartTransaction
DEBUG: name: unnamed; blockState: DEFAULT; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children:
ERROR: cannot perform distributed planning for the given modification
DETAIL: Set operations are not allowed in INSERT ... SELECT queries
-- similar query with a filter on two of the queries
INSERT INTO
raw_events_first(user_id)
SELECT
user_id
FROM
((SELECT user_id FROM raw_events_first WHERE user_id = 15) UNION
(SELECT user_id FROM raw_events_second where user_id = 17)) as foo;
DEBUG: StartTransactionCommand
DEBUG: StartTransaction
DEBUG: name: unnamed; blockState: DEFAULT; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children:
ERROR: cannot perform distributed planning for the given modification
DETAIL: Set operations are not allowed in INSERT ... SELECT queries
-- TODO: UUIDs -- TODO: UUIDs
-- a test with reference table JOINs -- a test with reference table JOINs
INSERT INTO INSERT INTO
agg_events (user_id, value_1_agg) agg_events (user_id, value_1_agg)
SELECT SELECT
raw_events_first.user_id, sum(value_1) raw_events_first.user_id, sum(value_1)
FROM FROM
reference_table, raw_events_first reference_table, raw_events_first
WHERE WHERE
raw_events_first.user_id = reference_table.user_id raw_events_first.user_id = reference_table.user_id
GROUP BY GROUP BY
raw_events_first.user_id; raw_events_first.user_id;
@ -795,6 +759,68 @@ DEBUG: sent COMMIT over connection 13300009
DEBUG: sent COMMIT over connection 13300009 DEBUG: sent COMMIT over connection 13300009
DEBUG: sent COMMIT over connection 13300010 DEBUG: sent COMMIT over connection 13300010
DEBUG: sent COMMIT over connection 13300010 DEBUG: sent COMMIT over connection 13300010
-- We do not support CTEs
WITH fist_table_agg AS
(SELECT sum(value_1) as v1_agg, user_id FROM raw_events_first GROUP BY user_id)
INSERT INTO agg_events
(value_1_agg, user_id)
SELECT
v1_agg, user_id
FROM
fist_table_agg;
DEBUG: StartTransactionCommand
DEBUG: StartTransaction
DEBUG: name: unnamed; blockState: DEFAULT; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children:
ERROR: cannot perform distributed planning for the given modification
DETAIL: Common table expressions are not allowed in INSERT ... SELECT queries
-- We do not support CTEs in the INSERT as well
INSERT INTO agg_events
WITH sub_cte AS (SELECT 1)
SELECT
raw_events_first.user_id, (SELECT * FROM sub_cte)
FROM
raw_events_first;
DEBUG: StartTransactionCommand
DEBUG: StartTransaction
DEBUG: name: unnamed; blockState: DEFAULT; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children:
ERROR: cannot perform distributed planning for the given modification
DETAIL: Common table expressions are not allowed in INSERT ... SELECT queries
-- We do not support any set operations
INSERT INTO
raw_events_first(user_id)
SELECT
user_id
FROM
((SELECT user_id FROM raw_events_first) UNION
(SELECT user_id FROM raw_events_second)) as foo;
DEBUG: StartTransactionCommand
DEBUG: StartTransaction
DEBUG: name: unnamed; blockState: DEFAULT; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children:
ERROR: cannot perform distributed planning for the given modification
DETAIL: Set operations are not allowed in INSERT ... SELECT queries
-- We do not support any set operations
INSERT INTO
raw_events_first(user_id)
(SELECT user_id FROM raw_events_first) INTERSECT
(SELECT user_id FROM raw_events_first);
DEBUG: StartTransactionCommand
DEBUG: StartTransaction
DEBUG: name: unnamed; blockState: DEFAULT; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children:
ERROR: cannot perform distributed planning for the given modification
DETAIL: Set operations are not allowed in INSERT ... SELECT queries
-- We do not support any set operations
INSERT INTO
raw_events_first(user_id)
SELECT
user_id
FROM
((SELECT user_id FROM raw_events_first WHERE user_id = 15) EXCEPT
(SELECT user_id FROM raw_events_second where user_id = 17)) as foo;
DEBUG: StartTransactionCommand
DEBUG: StartTransaction
DEBUG: name: unnamed; blockState: DEFAULT; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children:
ERROR: cannot perform distributed planning for the given modification
DETAIL: Set operations are not allowed in INSERT ... SELECT queries
-- unsupported JOIN -- unsupported JOIN
INSERT INTO agg_events INSERT INTO agg_events
(value_4_agg, (value_4_agg,

View File

@ -217,57 +217,74 @@ RETURNING user_id, value_1_agg;
-- TODO:: add hll and date_trunc -- TODO:: add hll and date_trunc
INSERT INTO agg_events (user_id, value_1_agg) INSERT INTO agg_events (user_id, value_1_agg)
SELECT SELECT
user_id, sum(value_1 + value_2) user_id, sum(value_1 + value_2)
FROM FROM
raw_events_first GROUP BY user_id; raw_events_first GROUP BY user_id;
-- FILTER CLAUSE -- FILTER CLAUSE
INSERT INTO agg_events (user_id, value_1_agg) INSERT INTO agg_events (user_id, value_1_agg)
SELECT SELECT
user_id, sum(value_1 + value_2) FILTER (where value_3 = 15) user_id, sum(value_1 + value_2) FILTER (where value_3 = 15)
FROM FROM
raw_events_first GROUP BY user_id; raw_events_first GROUP BY user_id;
-- a very simple UNION query
INSERT INTO
raw_events_first(user_id)
SELECT
user_id
FROM
((SELECT user_id FROM raw_events_first) UNION
(SELECT user_id FROM raw_events_second)) as foo;
-- same query with slightly different syntax, but this time we cannot push it down
INSERT INTO
raw_events_first(user_id)
(SELECT user_id FROM raw_events_first) UNION
(SELECT user_id FROM raw_events_first);
-- similar query with a filter on two of the queries
INSERT INTO
raw_events_first(user_id)
SELECT
user_id
FROM
((SELECT user_id FROM raw_events_first WHERE user_id = 15) UNION
(SELECT user_id FROM raw_events_second where user_id = 17)) as foo;
-- TODO: UUIDs -- TODO: UUIDs
-- a test with reference table JOINs -- a test with reference table JOINs
INSERT INTO INSERT INTO
agg_events (user_id, value_1_agg) agg_events (user_id, value_1_agg)
SELECT SELECT
raw_events_first.user_id, sum(value_1) raw_events_first.user_id, sum(value_1)
FROM FROM
reference_table, raw_events_first reference_table, raw_events_first
WHERE WHERE
raw_events_first.user_id = reference_table.user_id raw_events_first.user_id = reference_table.user_id
GROUP BY GROUP BY
raw_events_first.user_id; raw_events_first.user_id;
-- We do not support CTEs
WITH fist_table_agg AS
(SELECT sum(value_1) as v1_agg, user_id FROM raw_events_first GROUP BY user_id)
INSERT INTO agg_events
(value_1_agg, user_id)
SELECT
v1_agg, user_id
FROM
fist_table_agg;
-- We do not support CTEs in the INSERT as well
INSERT INTO agg_events
WITH sub_cte AS (SELECT 1)
SELECT
raw_events_first.user_id, (SELECT * FROM sub_cte)
FROM
raw_events_first;
-- We do not support any set operations
INSERT INTO
raw_events_first(user_id)
SELECT
user_id
FROM
((SELECT user_id FROM raw_events_first) UNION
(SELECT user_id FROM raw_events_second)) as foo;
-- We do not support any set operations
INSERT INTO
raw_events_first(user_id)
(SELECT user_id FROM raw_events_first) INTERSECT
(SELECT user_id FROM raw_events_first);
-- We do not support any set operations
INSERT INTO
raw_events_first(user_id)
SELECT
user_id
FROM
((SELECT user_id FROM raw_events_first WHERE user_id = 15) EXCEPT
(SELECT user_id FROM raw_events_second where user_id = 17)) as foo;
-- unsupported JOIN -- unsupported JOIN
INSERT INTO agg_events INSERT INTO agg_events