mirror of https://github.com/citusdata/citus.git
Fix JOINs on varchar columns with subquery pushdown
Fixes #379 Varchar VAR struct is wrapped in RELABELTYPE struct inside PostgreSQL code and IsPartitionColumnRecursive function considers only VAR types so returning false for varchar. This change adds strip_implicit_coercions() call to the columnExpression in IsPartitionColumnRecursive function so that we get rid of implicit coercions like RELABELTYPE are stripped to VAR.pull/426/head
parent
399b5738b0
commit
448527c3af
|
@ -2907,14 +2907,15 @@ IsPartitionColumnRecursive(Expr *columnExpression, Query *query)
|
|||
List *rangetableList = query->rtable;
|
||||
Index rangeTableEntryIndex = 0;
|
||||
RangeTblEntry *rangeTableEntry = NULL;
|
||||
Expr *strippedColumnExpression = strip_implicit_coercions(columnExpression);
|
||||
|
||||
if (IsA(columnExpression, Var))
|
||||
if (IsA(strippedColumnExpression, Var))
|
||||
{
|
||||
candidateColumn = (Var *) columnExpression;
|
||||
candidateColumn = (Var *) strippedColumnExpression;
|
||||
}
|
||||
else if (IsA(columnExpression, FieldSelect))
|
||||
else if (IsA(strippedColumnExpression, FieldSelect))
|
||||
{
|
||||
FieldSelect *compositeField = (FieldSelect *) columnExpression;
|
||||
FieldSelect *compositeField = (FieldSelect *) strippedColumnExpression;
|
||||
Expr *fieldExpression = compositeField->arg;
|
||||
|
||||
if (IsA(fieldExpression, Var))
|
||||
|
|
|
@ -319,6 +319,36 @@ AS foo;
|
|||
|
||||
SET client_min_messages TO NOTICE;
|
||||
|
||||
-- test subquery join on VARCHAR partition column
|
||||
SELECT * FROM
|
||||
(SELECT
|
||||
a_inner AS a
|
||||
FROM
|
||||
(SELECT
|
||||
subquery_pruning_varchar_test_table.a AS a_inner
|
||||
FROM
|
||||
subquery_pruning_varchar_test_table
|
||||
GROUP BY
|
||||
subquery_pruning_varchar_test_table.a
|
||||
HAVING
|
||||
count(subquery_pruning_varchar_test_table.a) < 3)
|
||||
AS f1,
|
||||
|
||||
(SELECT
|
||||
subquery_pruning_varchar_test_table.a
|
||||
FROM
|
||||
subquery_pruning_varchar_test_table
|
||||
GROUP BY
|
||||
subquery_pruning_varchar_test_table.a
|
||||
HAVING
|
||||
sum(coalesce(subquery_pruning_varchar_test_table.b,0)) > 20.0)
|
||||
AS f2
|
||||
WHERE
|
||||
f1.a_inner = f2.a
|
||||
GROUP BY
|
||||
a_inner)
|
||||
AS foo;
|
||||
|
||||
DROP TABLE subquery_pruning_varchar_test_table;
|
||||
|
||||
ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 102026;
|
||||
|
|
|
@ -367,5 +367,37 @@ DEBUG: predicate pruning for shardId 102026
|
|||
(0 rows)
|
||||
|
||||
SET client_min_messages TO NOTICE;
|
||||
-- test subquery join on VARCHAR partition column
|
||||
SELECT * FROM
|
||||
(SELECT
|
||||
a_inner AS a
|
||||
FROM
|
||||
(SELECT
|
||||
subquery_pruning_varchar_test_table.a AS a_inner
|
||||
FROM
|
||||
subquery_pruning_varchar_test_table
|
||||
GROUP BY
|
||||
subquery_pruning_varchar_test_table.a
|
||||
HAVING
|
||||
count(subquery_pruning_varchar_test_table.a) < 3)
|
||||
AS f1,
|
||||
(SELECT
|
||||
subquery_pruning_varchar_test_table.a
|
||||
FROM
|
||||
subquery_pruning_varchar_test_table
|
||||
GROUP BY
|
||||
subquery_pruning_varchar_test_table.a
|
||||
HAVING
|
||||
sum(coalesce(subquery_pruning_varchar_test_table.b,0)) > 20.0)
|
||||
AS f2
|
||||
WHERE
|
||||
f1.a_inner = f2.a
|
||||
GROUP BY
|
||||
a_inner)
|
||||
AS foo;
|
||||
a
|
||||
---
|
||||
(0 rows)
|
||||
|
||||
DROP TABLE subquery_pruning_varchar_test_table;
|
||||
ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 102026;
|
||||
|
|
Loading…
Reference in New Issue