You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudberry.apache.org by re...@apache.org on 2025/02/13 06:04:23 UTC
(cloudberry) 34/43: Remove check restricting some array casts by orca (#16379)
This is an automated email from the ASF dual-hosted git repository.
reshke pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit 1c07547b3f06928717169cb9b8d8b233a9f80669
Author: bhari <bh...@vmware.com>
AuthorDate: Fri Sep 8 15:15:08 2023 +0530
Remove check restricting some array casts by orca (#16379)
Issue:
Gporca failed to produce plan for casting int[] to text[] in a query like:
`explain select CAST(int_arr_col as text[]) FROM foo;`
RCA:
The commit https://github.com/greenplum-db/gpdb-postgres-merge/commit/256b11929f349c27b86e754e4664d3a63426a6e4,
added a condition restricting the plan dxl to be generated,
if per-elem expr of `ArrayCoerceExpr` is not of type `RelabelType` or `FuncExpr`.
Fix:
This condition is now redundant, since DXL is working well with per-elem expr
of type `CoerceViaIO`. So the condition is now removed.
Note:
The condition might have been needed because of postgres change added in commit https://github.com/postgres/postgres/commit/c12d570fa147d0ec273df53de3a2802925d551ba.
Which was later fixed in https://github.com/greenplum-db/gpdb/commit/600c7611512942a65352752e637890c29dcb2a90.
* Added a regression test to verify that plan is being generated by Orca,
for cast from int[] to text[] which was failing earlier.
---
.../gpopt/translate/CTranslatorScalarToDXL.cpp | 8 --------
src/test/regress/expected/gporca.out | 19 +++++++++++++++++++
src/test/regress/expected/gporca_optimizer.out | 19 +++++++++++++++++++
src/test/regress/sql/gporca.sql | 9 +++++++++
4 files changed, 47 insertions(+), 8 deletions(-)
diff --git a/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp b/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp
index 5a7a7f94e5..0759d103d7 100644
--- a/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp
+++ b/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp
@@ -1282,14 +1282,6 @@ CTranslatorScalarToDXL::TranslateArrayCoerceExprToDXL(
GPOS_ASSERT(nullptr != child_node);
GPOS_ASSERT(nullptr != elemexpr_node);
- if (!(IsA(array_coerce_expr->elemexpr, FuncExpr) ||
- IsA(array_coerce_expr->elemexpr, RelabelType)))
- {
- GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature,
- GPOS_WSZ_LIT("ArrayCoerceExpr with elemexpr that is neither "
- "FuncExpr or RelabelType"));
- }
-
CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(
m_mp, GPOS_NEW(m_mp) CDXLScalarArrayCoerceExpr(
m_mp,
diff --git a/src/test/regress/expected/gporca.out b/src/test/regress/expected/gporca.out
index ab827b5ae4..6fe7b29096 100644
--- a/src/test/regress/expected/gporca.out
+++ b/src/test/regress/expected/gporca.out
@@ -14914,3 +14914,22 @@ select check_col_width('select a from testPartWidth;','Append','width=5') = 1;
(1 row)
drop function check_col_width(query text, operator text, width text);
+---------------------------------------------------------------------------------
+-- Test cast from INT[] to TEXT[]
+CREATE TABLE array_coerceviaio(a INT[]) distributed randomly;
+INSERT INTO array_coerceviaio values(ARRAY[1, 2, 3]);
+EXPLAIN SELECT CAST(a AS TEXT[]) FROM array_coerceviaio;
+ QUERY PLAN
+------------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..1882.00 rows=52800 width=32)
+ -> Seq Scan on array_coerceviaio (cost=0.00..1178.00 rows=17600 width=32)
+ Optimizer: Postgres-based planner
+(3 rows)
+
+SELECT CAST(a AS TEXT[]) FROM array_coerceviaio;
+ a
+---------
+ {1,2,3}
+(1 row)
+
+---------------------------------------------------------------------------------
diff --git a/src/test/regress/expected/gporca_optimizer.out b/src/test/regress/expected/gporca_optimizer.out
index 4d14cbbcde..c7f80012e7 100644
--- a/src/test/regress/expected/gporca_optimizer.out
+++ b/src/test/regress/expected/gporca_optimizer.out
@@ -14999,3 +14999,22 @@ DETAIL: Falling back to Postgres-based planner because GPORCA does not support
(1 row)
drop function check_col_width(query text, operator text, width text);
+---------------------------------------------------------------------------------
+-- Test cast from INT[] to TEXT[]
+CREATE TABLE array_coerceviaio(a INT[]) distributed randomly;
+INSERT INTO array_coerceviaio values(ARRAY[1, 2, 3]);
+EXPLAIN SELECT CAST(a AS TEXT[]) FROM array_coerceviaio;
+ QUERY PLAN
+------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=8)
+ -> Seq Scan on array_coerceviaio (cost=0.00..431.00 rows=1 width=8)
+ Optimizer: GPORCA
+(3 rows)
+
+SELECT CAST(a AS TEXT[]) FROM array_coerceviaio;
+ a
+---------
+ {1,2,3}
+(1 row)
+
+---------------------------------------------------------------------------------
diff --git a/src/test/regress/sql/gporca.sql b/src/test/regress/sql/gporca.sql
index ff08636b68..a659d5695c 100644
--- a/src/test/regress/sql/gporca.sql
+++ b/src/test/regress/sql/gporca.sql
@@ -3698,6 +3698,15 @@ select check_col_width('select a from testPartWidth;','Append','width=5') = 1;
select check_col_width('select a from testPartWidth;','Append','width=5') = 1;
drop function check_col_width(query text, operator text, width text);
+---------------------------------------------------------------------------------
+-- Test cast from INT[] to TEXT[]
+CREATE TABLE array_coerceviaio(a INT[]) distributed randomly;
+INSERT INTO array_coerceviaio values(ARRAY[1, 2, 3]);
+
+EXPLAIN SELECT CAST(a AS TEXT[]) FROM array_coerceviaio;
+SELECT CAST(a AS TEXT[]) FROM array_coerceviaio;
+---------------------------------------------------------------------------------
+
-- start_ignore
DROP SCHEMA orca CASCADE;
-- end_ignore
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org