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;
|
List *rangetableList = query->rtable;
|
||||||
Index rangeTableEntryIndex = 0;
|
Index rangeTableEntryIndex = 0;
|
||||||
RangeTblEntry *rangeTableEntry = NULL;
|
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;
|
Expr *fieldExpression = compositeField->arg;
|
||||||
|
|
||||||
if (IsA(fieldExpression, Var))
|
if (IsA(fieldExpression, Var))
|
||||||
|
|
|
@ -319,6 +319,36 @@ AS foo;
|
||||||
|
|
||||||
SET client_min_messages TO NOTICE;
|
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;
|
DROP TABLE subquery_pruning_varchar_test_table;
|
||||||
|
|
||||||
ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 102026;
|
ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 102026;
|
||||||
|
|
|
@ -367,5 +367,37 @@ DEBUG: predicate pruning for shardId 102026
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
SET client_min_messages TO NOTICE;
|
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;
|
DROP TABLE subquery_pruning_varchar_test_table;
|
||||||
ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 102026;
|
ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 102026;
|
||||||
|
|
Loading…
Reference in New Issue