提交 5a522d87 编写于 作者: S Sambitesh Dash

Consider predicate of type <cast(ident)> array cmp <const array>

While processing constraint interval, also consider predicate of type
<cast(ident)> array cmp else we lose the opportunity
to generate implied quals. This is corresponding to the ORCA changes.
上级 1dc09dcc
......@@ -19,4 +19,4 @@ params:
BLD_TARGETS:
OUTPUT_ARTIFACT_DIR: gpdb_artifacts
CONFIGURE_FLAGS:
ORCA_TAG: v3.66.0
ORCA_TAG: v3.67.0
......@@ -40,10 +40,10 @@ AC_RUN_IFELSE([AC_LANG_PROGRAM([[
#include <string.h>
]],
[
return strncmp("3.66.", GPORCA_VERSION_STRING, 5);
return strncmp("3.67.", GPORCA_VERSION_STRING, 5);
])],
[AC_MSG_RESULT([[ok]])],
[AC_MSG_ERROR([Your ORCA version is expected to be 3.66.XXX])]
[AC_MSG_ERROR([Your ORCA version is expected to be 3.67.XXX])]
)
AC_LANG_POP([C++])
])# PGAC_CHECK_ORCA_VERSION
......
......@@ -14902,7 +14902,7 @@ int
main ()
{
return strncmp("3.66.", GPORCA_VERSION_STRING, 5);
return strncmp("3.67.", GPORCA_VERSION_STRING, 5);
;
return 0;
......@@ -14912,7 +14912,7 @@ if ac_fn_cxx_try_run "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
$as_echo "ok" >&6; }
else
as_fn_error $? "Your ORCA version is expected to be 3.66.XXX" "$LINENO" 5
as_fn_error $? "Your ORCA version is expected to be 3.67.XXX" "$LINENO" 5
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
......
[requires]
orca/v3.66.0@gpdb/stable
orca/v3.67.0@gpdb/stable
[imports]
include, * -> build/include
......
......@@ -11383,3 +11383,53 @@ SELECT *, a IN ( SELECT b + 1 FROM non_part1) FROM ds_part, non_part2 WHERE ds_p
(1 row)
RESET optimizer_enforce_subplans;
-- implied predicate must be generated for the type cast(ident) scalar array cmp const array
CREATE TABLE varchar_sc_array_cmp(a varchar);
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Greenplum Database data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
INSERT INTO varchar_sc_array_cmp VALUES ('a'), ('b'), ('c'), ('d');
EXPLAIN SELECT * FROM varchar_sc_array_cmp t1, varchar_sc_array_cmp t2 where t1.a = t2.a and t1.a in ('b', 'c');
QUERY PLAN
-----------------------------------------------------------------------------------------
Gather Motion 2:1 (slice1; segments: 2) (cost=3.07..6.17 rows=4 width=4)
-> Hash Join (cost=3.07..6.17 rows=2 width=4)
Hash Cond: ((t1.a)::text = (t2.a)::text)
-> Seq Scan on varchar_sc_array_cmp t1 (cost=0.00..3.05 rows=1 width=2)
Filter: ((a)::text = ANY ('{b,c}'::text[]))
-> Hash (cost=3.05..3.05 rows=1 width=2)
-> Seq Scan on varchar_sc_array_cmp t2 (cost=0.00..3.05 rows=1 width=2)
Filter: ((a)::text = ANY ('{b,c}'::text[]))
Optimizer: Postgres query optimizer
(9 rows)
SELECT * FROM varchar_sc_array_cmp t1, varchar_sc_array_cmp t2 where t1.a = t2.a and t1.a in ('b', 'c');
a | a
---+---
c | c
b | b
(2 rows)
SET optimizer_array_constraints=on;
EXPLAIN SELECT * FROM varchar_sc_array_cmp t1, varchar_sc_array_cmp t2 where t1.a = t2.a and (t1.a in ('b', 'c') OR t1.a = 'a');
QUERY PLAN
----------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=3.09..6.18 rows=4 width=4)
-> Hash Join (cost=3.09..6.18 rows=2 width=4)
Hash Cond: ((t2.a)::text = (t1.a)::text)
-> Seq Scan on varchar_sc_array_cmp t2 (cost=0.00..3.04 rows=2 width=2)
-> Hash (cost=3.06..3.06 rows=1 width=2)
-> Seq Scan on varchar_sc_array_cmp t1 (cost=0.00..3.06 rows=1 width=2)
Filter: (((a)::text = ANY ('{b,c}'::text[])) OR ((a)::text = 'a'::text))
Optimizer: Postgres query optimizer
(8 rows)
SELECT * FROM varchar_sc_array_cmp t1, varchar_sc_array_cmp t2 where t1.a = t2.a and (t1.a in ('b', 'c') OR t1.a = 'a');
a | a
---+---
b | b
a | a
c | c
(3 rows)
DROP TABLE varchar_sc_array_cmp;
--
......@@ -11480,6 +11480,57 @@ SELECT *, a IN ( SELECT b + 1 FROM non_part1) FROM ds_part, non_part2 WHERE ds_p
(1 row)
RESET optimizer_enforce_subplans;
-- implied predicate must be generated for the type cast(ident) scalar array cmp const array
CREATE TABLE varchar_sc_array_cmp(a varchar);
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Greenplum Database data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
INSERT INTO varchar_sc_array_cmp VALUES ('a'), ('b'), ('c'), ('d');
EXPLAIN SELECT * FROM varchar_sc_array_cmp t1, varchar_sc_array_cmp t2 where t1.a = t2.a and t1.a in ('b', 'c');
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..862.00 rows=4 width=4)
-> Hash Join (cost=0.00..862.00 rows=2 width=4)
Hash Cond: ((varchar_sc_array_cmp.a)::text = (varchar_sc_array_cmp_1.a)::text)
-> Seq Scan on varchar_sc_array_cmp (cost=0.00..431.00 rows=1 width=2)
Filter: (((a)::text = ANY ('{b,c}'::text[])) AND (((a)::text = 'b'::text) OR ((a)::text = 'c'::text)))
-> Hash (cost=431.00..431.00 rows=1 width=2)
-> Seq Scan on varchar_sc_array_cmp varchar_sc_array_cmp_1 (cost=0.00..431.00 rows=1 width=2)
Filter: (((a)::text = 'b'::text) OR ((a)::text = 'c'::text))
Optimizer: Pivotal Optimizer (GPORCA) version 3.65.2
(9 rows)
SELECT * FROM varchar_sc_array_cmp t1, varchar_sc_array_cmp t2 where t1.a = t2.a and t1.a in ('b', 'c');
a | a
---+---
b | b
c | c
(2 rows)
SET optimizer_array_constraints=on;
EXPLAIN SELECT * FROM varchar_sc_array_cmp t1, varchar_sc_array_cmp t2 where t1.a = t2.a and (t1.a in ('b', 'c') OR t1.a = 'a');
QUERY PLAN
---------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..862.00 rows=4 width=4)
-> Hash Join (cost=0.00..862.00 rows=2 width=4)
Hash Cond: ((varchar_sc_array_cmp.a)::text = (varchar_sc_array_cmp_1.a)::text)
-> Seq Scan on varchar_sc_array_cmp (cost=0.00..431.00 rows=1 width=2)
Filter: (a = ANY ('{a,b,c}'::character varying[]))
-> Hash (cost=431.00..431.00 rows=1 width=2)
-> Seq Scan on varchar_sc_array_cmp varchar_sc_array_cmp_1 (cost=0.00..431.00 rows=1 width=2)
Filter: (a = ANY ('{a,b,c}'::character varying[]))
Optimizer: Pivotal Optimizer (GPORCA) version 3.65.2
(9 rows)
SELECT * FROM varchar_sc_array_cmp t1, varchar_sc_array_cmp t2 where t1.a = t2.a and (t1.a in ('b', 'c') OR t1.a = 'a');
a | a
---+---
a | a
c | c
b | b
(3 rows)
DROP TABLE varchar_sc_array_cmp;
--
-- start_ignore
DROP SCHEMA orca CASCADE;
NOTICE: drop cascades to 92 other objects
......
......@@ -2184,6 +2184,16 @@ analyze ds_part;
SELECT *, a IN ( SELECT b + 1 FROM non_part1) FROM ds_part, non_part2 WHERE ds_part.c = non_part2.e AND non_part2.f = 10 AND a IN ( SELECT b FROM non_part1);
RESET optimizer_enforce_subplans;
-- implied predicate must be generated for the type cast(ident) scalar array cmp const array
CREATE TABLE varchar_sc_array_cmp(a varchar);
INSERT INTO varchar_sc_array_cmp VALUES ('a'), ('b'), ('c'), ('d');
EXPLAIN SELECT * FROM varchar_sc_array_cmp t1, varchar_sc_array_cmp t2 where t1.a = t2.a and t1.a in ('b', 'c');
SELECT * FROM varchar_sc_array_cmp t1, varchar_sc_array_cmp t2 where t1.a = t2.a and t1.a in ('b', 'c');
SET optimizer_array_constraints=on;
EXPLAIN SELECT * FROM varchar_sc_array_cmp t1, varchar_sc_array_cmp t2 where t1.a = t2.a and (t1.a in ('b', 'c') OR t1.a = 'a');
SELECT * FROM varchar_sc_array_cmp t1, varchar_sc_array_cmp t2 where t1.a = t2.a and (t1.a in ('b', 'c') OR t1.a = 'a');
DROP TABLE varchar_sc_array_cmp;
--
-- start_ignore
DROP SCHEMA orca CASCADE;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册