mirror of https://github.com/citusdata/citus.git
Merge pull request #1918 from citusdata/fix_outer_join_pushdown
Outer joins should also use/try subquery pushdown planner if join clause is not supportedpull/1903/head^2
commit
6e34a8fbf4
|
@ -224,7 +224,7 @@ MultiLogicalPlanCreate(Query *originalQuery, Query *queryTree,
|
||||||
static bool
|
static bool
|
||||||
ShouldUseSubqueryPushDown(Query *originalQuery, Query *rewrittenQuery)
|
ShouldUseSubqueryPushDown(Query *originalQuery, Query *rewrittenQuery)
|
||||||
{
|
{
|
||||||
List *whereClauseList = NIL;
|
List *qualifierList = NIL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We check the existence of subqueries in FROM clause on the modified query
|
* We check the existence of subqueries in FROM clause on the modified query
|
||||||
|
@ -260,8 +260,8 @@ ShouldUseSubqueryPushDown(Query *originalQuery, Query *rewrittenQuery)
|
||||||
* Some unsupported join clauses in logical planner
|
* Some unsupported join clauses in logical planner
|
||||||
* may be supported by subquery pushdown planner.
|
* may be supported by subquery pushdown planner.
|
||||||
*/
|
*/
|
||||||
whereClauseList = WhereClauseList(rewrittenQuery->jointree);
|
qualifierList = QualifierList(rewrittenQuery->jointree);
|
||||||
if (DeferErrorIfUnsupportedClause(whereClauseList) != NULL)
|
if (DeferErrorIfUnsupportedClause(qualifierList) != NULL)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -390,6 +390,99 @@ WHERE
|
||||||
ORDER BY l_orderkey DESC
|
ORDER BY l_orderkey DESC
|
||||||
LIMIT 10;
|
LIMIT 10;
|
||||||
ERROR: complex joins are only supported when all distributed tables are joined on their distribution columns with equal operator
|
ERROR: complex joins are only supported when all distributed tables are joined on their distribution columns with equal operator
|
||||||
|
-- outer joins on reference tables with functions works
|
||||||
|
SELECT DISTINCT ON (t1.user_id) t1.user_id, t2.value_1, t2.value_2, t2.value_3
|
||||||
|
FROM events_table t1
|
||||||
|
LEFT JOIN users_reference_table t2 ON t1.user_id = trunc(t2.user_id)
|
||||||
|
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC
|
||||||
|
LIMIT 5;
|
||||||
|
user_id | value_1 | value_2 | value_3
|
||||||
|
---------+---------+---------+---------
|
||||||
|
6 | 5 | 2 | 0
|
||||||
|
5 | 5 | 5 | 1
|
||||||
|
4 | 5 | 4 | 1
|
||||||
|
3 | 5 | 5 | 3
|
||||||
|
2 | 4 | 4 | 5
|
||||||
|
(5 rows)
|
||||||
|
|
||||||
|
-- outer joins on reference tables with simple expressions should work
|
||||||
|
SELECT DISTINCT ON (t1.user_id) t1.user_id, t2.value_1, t2.value_2, t2.value_3
|
||||||
|
FROM events_table t1
|
||||||
|
LEFT JOIN users_reference_table t2 ON t1.user_id > t2.user_id
|
||||||
|
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC
|
||||||
|
LIMIT 5;
|
||||||
|
user_id | value_1 | value_2 | value_3
|
||||||
|
---------+---------+---------+---------
|
||||||
|
6 | 5 | 5 | 3
|
||||||
|
5 | 5 | 5 | 3
|
||||||
|
4 | 5 | 5 | 3
|
||||||
|
3 | 5 | 4 | 3
|
||||||
|
2 | 5 | 4 | 3
|
||||||
|
(5 rows)
|
||||||
|
|
||||||
|
-- outer joins on distributed tables with simple expressions should not work
|
||||||
|
SELECT DISTINCT ON (t1.user_id) t1.user_id, t2.value_1, t2.value_2, t2.value_3
|
||||||
|
FROM events_table t1
|
||||||
|
LEFT JOIN users_table t2 ON t1.user_id > t2.user_id
|
||||||
|
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC
|
||||||
|
LIMIT 5;
|
||||||
|
ERROR: complex joins are only supported when all distributed tables are joined on their distribution columns with equal operator
|
||||||
|
-- outer joins on reference tables with expressions should work
|
||||||
|
SELECT DISTINCT ON (t1.user_id) t1.user_id, t2.value_1, t2.value_2, t2.value_3
|
||||||
|
FROM events_table t1
|
||||||
|
LEFT JOIN users_reference_table t2 ON t1.user_id = (CASE WHEN t2.user_id > 3 THEN 3 ELSE t2.user_id END)
|
||||||
|
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC
|
||||||
|
LIMIT 5;
|
||||||
|
user_id | value_1 | value_2 | value_3
|
||||||
|
---------+---------+---------+---------
|
||||||
|
6 | | |
|
||||||
|
5 | | |
|
||||||
|
4 | | |
|
||||||
|
3 | 5 | 5 | 3
|
||||||
|
2 | 4 | 4 | 5
|
||||||
|
(5 rows)
|
||||||
|
|
||||||
|
-- outer joins on distributed tables and reference tables with expressions should work
|
||||||
|
SELECT DISTINCT ON (t1.user_id) t1.user_id, t2.value_1, t2.value_2, t2.value_3
|
||||||
|
FROM
|
||||||
|
users_table t0 LEFT JOIN
|
||||||
|
events_table t1 ON t0.user_id = t1.user_id
|
||||||
|
LEFT JOIN users_reference_table t2 ON t1.user_id = trunc(t2.user_id)
|
||||||
|
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC
|
||||||
|
LIMIT 5;
|
||||||
|
user_id | value_1 | value_2 | value_3
|
||||||
|
---------+---------+---------+---------
|
||||||
|
6 | 5 | 2 | 0
|
||||||
|
5 | 5 | 5 | 1
|
||||||
|
4 | 5 | 4 | 1
|
||||||
|
3 | 5 | 5 | 3
|
||||||
|
2 | 4 | 4 | 5
|
||||||
|
(5 rows)
|
||||||
|
|
||||||
|
-- outer joins on distributed tables with expressions should not work
|
||||||
|
SELECT DISTINCT ON (t1.user_id) t1.user_id, t2.value_1, t2.value_2, t2.value_3
|
||||||
|
FROM
|
||||||
|
users_table t0 LEFT JOIN
|
||||||
|
events_table t1 ON t0.user_id = trunc(t1.user_id)
|
||||||
|
LEFT JOIN users_reference_table t2 ON t1.user_id = trunc(t2.user_id)
|
||||||
|
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC
|
||||||
|
LIMIT 5;
|
||||||
|
ERROR: complex joins are only supported when all distributed tables are joined on their distribution columns with equal operator
|
||||||
|
-- inner joins on reference tables with functions works
|
||||||
|
SELECT DISTINCT ON (t1.user_id) t1.user_id, t2.value_1, t2.value_2, t2.value_3
|
||||||
|
FROM events_table t1
|
||||||
|
JOIN users_reference_table t2 ON t1.user_id = trunc(t2.user_id)
|
||||||
|
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC
|
||||||
|
LIMIT 5;
|
||||||
|
user_id | value_1 | value_2 | value_3
|
||||||
|
---------+---------+---------+---------
|
||||||
|
6 | 5 | 2 | 0
|
||||||
|
5 | 5 | 5 | 1
|
||||||
|
4 | 5 | 4 | 1
|
||||||
|
3 | 5 | 5 | 3
|
||||||
|
2 | 4 | 4 | 5
|
||||||
|
(5 rows)
|
||||||
|
|
||||||
-- distinct queries work
|
-- distinct queries work
|
||||||
SELECT DISTINCT l_orderkey
|
SELECT DISTINCT l_orderkey
|
||||||
FROM
|
FROM
|
||||||
|
|
|
@ -279,6 +279,59 @@ WHERE
|
||||||
ORDER BY l_orderkey DESC
|
ORDER BY l_orderkey DESC
|
||||||
LIMIT 10;
|
LIMIT 10;
|
||||||
|
|
||||||
|
-- outer joins on reference tables with functions works
|
||||||
|
SELECT DISTINCT ON (t1.user_id) t1.user_id, t2.value_1, t2.value_2, t2.value_3
|
||||||
|
FROM events_table t1
|
||||||
|
LEFT JOIN users_reference_table t2 ON t1.user_id = trunc(t2.user_id)
|
||||||
|
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC
|
||||||
|
LIMIT 5;
|
||||||
|
|
||||||
|
-- outer joins on reference tables with simple expressions should work
|
||||||
|
SELECT DISTINCT ON (t1.user_id) t1.user_id, t2.value_1, t2.value_2, t2.value_3
|
||||||
|
FROM events_table t1
|
||||||
|
LEFT JOIN users_reference_table t2 ON t1.user_id > t2.user_id
|
||||||
|
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC
|
||||||
|
LIMIT 5;
|
||||||
|
|
||||||
|
-- outer joins on distributed tables with simple expressions should not work
|
||||||
|
SELECT DISTINCT ON (t1.user_id) t1.user_id, t2.value_1, t2.value_2, t2.value_3
|
||||||
|
FROM events_table t1
|
||||||
|
LEFT JOIN users_table t2 ON t1.user_id > t2.user_id
|
||||||
|
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC
|
||||||
|
LIMIT 5;
|
||||||
|
|
||||||
|
-- outer joins on reference tables with expressions should work
|
||||||
|
SELECT DISTINCT ON (t1.user_id) t1.user_id, t2.value_1, t2.value_2, t2.value_3
|
||||||
|
FROM events_table t1
|
||||||
|
LEFT JOIN users_reference_table t2 ON t1.user_id = (CASE WHEN t2.user_id > 3 THEN 3 ELSE t2.user_id END)
|
||||||
|
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC
|
||||||
|
LIMIT 5;
|
||||||
|
|
||||||
|
-- outer joins on distributed tables and reference tables with expressions should work
|
||||||
|
SELECT DISTINCT ON (t1.user_id) t1.user_id, t2.value_1, t2.value_2, t2.value_3
|
||||||
|
FROM
|
||||||
|
users_table t0 LEFT JOIN
|
||||||
|
events_table t1 ON t0.user_id = t1.user_id
|
||||||
|
LEFT JOIN users_reference_table t2 ON t1.user_id = trunc(t2.user_id)
|
||||||
|
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC
|
||||||
|
LIMIT 5;
|
||||||
|
|
||||||
|
-- outer joins on distributed tables with expressions should not work
|
||||||
|
SELECT DISTINCT ON (t1.user_id) t1.user_id, t2.value_1, t2.value_2, t2.value_3
|
||||||
|
FROM
|
||||||
|
users_table t0 LEFT JOIN
|
||||||
|
events_table t1 ON t0.user_id = trunc(t1.user_id)
|
||||||
|
LEFT JOIN users_reference_table t2 ON t1.user_id = trunc(t2.user_id)
|
||||||
|
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC
|
||||||
|
LIMIT 5;
|
||||||
|
|
||||||
|
-- inner joins on reference tables with functions works
|
||||||
|
SELECT DISTINCT ON (t1.user_id) t1.user_id, t2.value_1, t2.value_2, t2.value_3
|
||||||
|
FROM events_table t1
|
||||||
|
JOIN users_reference_table t2 ON t1.user_id = trunc(t2.user_id)
|
||||||
|
ORDER BY 1 DESC, 2 DESC, 3 DESC, 4 DESC
|
||||||
|
LIMIT 5;
|
||||||
|
|
||||||
-- distinct queries work
|
-- distinct queries work
|
||||||
SELECT DISTINCT l_orderkey
|
SELECT DISTINCT l_orderkey
|
||||||
FROM
|
FROM
|
||||||
|
|
Loading…
Reference in New Issue