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
|
||||
ShouldUseSubqueryPushDown(Query *originalQuery, Query *rewrittenQuery)
|
||||
{
|
||||
List *whereClauseList = NIL;
|
||||
List *qualifierList = NIL;
|
||||
|
||||
/*
|
||||
* 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
|
||||
* may be supported by subquery pushdown planner.
|
||||
*/
|
||||
whereClauseList = WhereClauseList(rewrittenQuery->jointree);
|
||||
if (DeferErrorIfUnsupportedClause(whereClauseList) != NULL)
|
||||
qualifierList = QualifierList(rewrittenQuery->jointree);
|
||||
if (DeferErrorIfUnsupportedClause(qualifierList) != NULL)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -390,6 +390,99 @@ WHERE
|
|||
ORDER BY l_orderkey DESC
|
||||
LIMIT 10;
|
||||
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
|
||||
SELECT DISTINCT l_orderkey
|
||||
FROM
|
||||
|
|
|
@ -279,6 +279,59 @@ WHERE
|
|||
ORDER BY l_orderkey DESC
|
||||
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
|
||||
SELECT DISTINCT l_orderkey
|
||||
FROM
|
||||
|
|
Loading…
Reference in New Issue