From 7ccfcbd69d60430d8b2c88bfdd37e77b4d9be244 Mon Sep 17 00:00:00 2001 From: wangfeihuo Date: Wed, 31 Jan 2024 18:07:19 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=A0=87=E9=A2=98=E3=80=91:=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8DI8XXN6=E6=89=80=E7=A4=BA=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=B1=BB=E5=9E=8Bvarchar=E5=9C=A8in=EF=BC=88array[]?= =?UTF-8?q?=EF=BC=89=E6=97=B6=E4=B8=8D=E8=B5=B0=E5=8A=A8=E6=80=81=E5=88=86?= =?UTF-8?q?=E5=8C=BA=E8=A3=81=E5=89=AA=E7=9A=84=E9=97=AE=E9=A2=98=20?= =?UTF-8?q?=E3=80=90=E5=AE=9E=E7=8E=B0=E5=86=85=E5=AE=B9=E3=80=91:=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8DI8XXN6=E6=89=80=E7=A4=BA=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=B1=BB=E5=9E=8Bvarchar=E5=9C=A8in=EF=BC=88array[]?= =?UTF-8?q?=EF=BC=89=E6=97=B6=E4=B8=8D=E8=B5=B0=E5=8A=A8=E6=80=81=E5=88=86?= =?UTF-8?q?=E5=8C=BA=E8=A3=81=E5=89=AA=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= =?UTF-8?q?=20=E3=80=90=E6=A0=B9=E5=9B=A0=E5=88=86=E6=9E=90=E3=80=91:=20?= =?UTF-8?q?=E5=9B=A0=E4=B8=BA=E9=BB=98=E8=AE=A4=E4=B8=BAtext=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=EF=BC=8C=E5=A6=82=E6=9E=9C=E5=BB=BA=E8=A1=A8=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E5=80=99=E7=B1=BB=E5=9E=8B=E4=B8=BAvarchar=E4=B8=BAT?= =?UTF-8?q?=5FArrayCoerceExpr=EF=BC=8C=E5=BD=93=E5=89=8D=E5=8F=AA=E6=9C=89?= =?UTF-8?q?=E5=8F=B3=E8=8A=82=E7=82=B9=E4=B8=BAT=5FArrayExpr=E6=89=8D?= =?UTF-8?q?=E5=8F=AF=E5=8A=A8=E5=88=86=E5=8C=BA=E8=A3=81=E5=89=AA=E3=80=82?= =?UTF-8?q?=20=E3=80=90=E5=AE=9E=E7=8E=B0=E6=96=B9=E6=A1=88=E3=80=91:=20?= =?UTF-8?q?=E5=8F=82=E7=85=A7T=5FArrayExpr=E5=AE=9E=E7=8E=B0T=5FArrayCoerc?= =?UTF-8?q?eExpr=E3=80=82=20=E3=80=90=E5=85=B3=E8=81=94=E9=9C=80=E6=B1=82?= =?UTF-8?q?=E6=88=96issue=E3=80=91:=20https://e.gitee.com/opengaussorg/das?= =?UTF-8?q?hboard=3Fissue=3DI8XXN6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/optimizer/util/pruning.cpp | 34 +++++++++++++++++- .../regress/expected/partition_pruning.out | 35 +++++++++++++++++++ src/test/regress/sql/partition_pruning.sql | 21 +++++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) diff --git a/src/gausskernel/optimizer/util/pruning.cpp b/src/gausskernel/optimizer/util/pruning.cpp index 47c86ce14..eb7fb8dfe 100644 --- a/src/gausskernel/optimizer/util/pruning.cpp +++ b/src/gausskernel/optimizer/util/pruning.cpp @@ -1172,7 +1172,8 @@ static PruningResult* partitionPruningFromScalarArrayOpExpr larg = ((RelabelType*)larg)->arg; } - if (T_Var != nodeTag(larg) || (T_ArrayExpr != nodeTag(rarg) && T_Const != nodeTag(rarg))) { + if (T_Var != nodeTag(larg) || (T_ArrayExpr != nodeTag(rarg) && T_Const != nodeTag(rarg) && + T_ArrayCoerceExpr != nodeTag(rarg))) { result = makeNode(PruningResult); result->state = PRUNING_RESULT_FULL; result->isPbeSinlePartition = false; @@ -1265,6 +1266,37 @@ static PruningResult* partitionPruningFromScalarArrayOpExpr exprList = lappend(exprList, expr); } + if (arrayExpr->useOr) { + result = partitionPruningWalker( + (Expr*)makeBoolExpr(OR_EXPR, exprList, 0), pruningCtx); + } else { + result = partitionPruningWalker( + (Expr*)makeBoolExpr(AND_EXPR, exprList, 0), pruningCtx); + } + success = true; + } + } else if (T_ArrayCoerceExpr == nodeTag(rarg)) { + List* eleList = NULL; + ListCell* element = NULL; + ArrayCoerceExpr* rargExpr = (ArrayCoerceExpr*)rarg; + if (T_ArrayExpr == nodeTag(rargExpr->arg)) { + ArrayExpr* rarg_arg = (ArrayExpr*)(rargExpr->arg); + eleList = rarg_arg->elements; + foreach (element, eleList) { + Expr* eleExpr = (Expr*)lfirst(element); + List* eleArgs = NULL; + eleArgs = list_make2(copyObject(larg), copyObject(eleExpr)); + expr = (OpExpr*)makeNode(OpExpr); + expr->args = eleArgs; + expr->inputcollid = arrayExpr->inputcollid; + expr->location = 0; + expr->opcollid = arrayExpr->opfuncid; + expr->opfuncid = arrayExpr->opfuncid; + expr->opno = arrayExpr->opno; + expr->opresulttype = BOOLOID; + expr->opretset = false; + exprList = lappend(exprList, expr); + } if (arrayExpr->useOr) { result = partitionPruningWalker( (Expr*)makeBoolExpr(OR_EXPR, exprList, 0), pruningCtx); diff --git a/src/test/regress/expected/partition_pruning.out b/src/test/regress/expected/partition_pruning.out index 977d8bbcf..25170d3c7 100644 --- a/src/test/regress/expected/partition_pruning.out +++ b/src/test/regress/expected/partition_pruning.out @@ -107,4 +107,39 @@ execute p1(2001,3001); (0 rows) drop table test_range_pt; +create table par4_1188069(id int,a1 text,a2 date,a3 varchar(30)) +partition by range (a3) +( +partition p1 values less than('d'), +partition p2 values less than('k'), +partition p3 values less than('q'), +partition p4 values less than('z')); +insert into par4_1188069 values(generate_series(1,100),'d',generate_series(DATE '2022-01-01', DATE '2022-4-10', '1 day'),chr(65 + (generate_series(1,100)-1)%25)); +insert into par4_1188069 values(generate_series(101,200),'k',generate_series(DATE '2022-01-01', DATE '2022-4-10', '1 day'),chr(65 + (generate_series(1,100)-1)%25)); +insert into par4_1188069 values(generate_series(201,300),'q',generate_series(DATE '2022-01-01', DATE '2022-4-10', '1 day'),chr(65 + (generate_series(1,100)-1)%25)); +insert into par4_1188069 values(generate_series(301,400),null,generate_series(DATE '2022-01-01', DATE '2022-4-10', '1 day'),chr(65 + (generate_series(1,100)-1)%25)); +prepare l7_1188069(varchar,varchar) as select * from par4_1188069 where a3 in($1,$2) limit 3; +explain (analyze,costs off) execute l7_1188069('h','v'); + QUERY PLAN +-------------------------------------------------------------------------------------------- +--?.* +--?.* + Iterations: PART +--?.* + Filter: ((a3)::text = ANY ((ARRAY[$1, $2])::text[])) + Rows Removed by Filter: 256 + Selected Partitions: PART +--?.* +(8 rows) + +execute l7_1188069('H','V'); + id | a1 | a2 | a3 +----+----+--------------------------+---- +--?.* +--?.* +--?.* +(3 rows) + +deallocate l7_1188069; +drop table par4_1188069; DROP SCHEMA partition_pruning; diff --git a/src/test/regress/sql/partition_pruning.sql b/src/test/regress/sql/partition_pruning.sql index 4772021af..43236db24 100644 --- a/src/test/regress/sql/partition_pruning.sql +++ b/src/test/regress/sql/partition_pruning.sql @@ -48,4 +48,25 @@ explain (costs off)execute p1(2001,3001); execute p1(2001,3001); drop table test_range_pt; +create table par4_1188069(id int,a1 text,a2 date,a3 varchar(30)) +partition by range (a3) +( +partition p1 values less than('d'), +partition p2 values less than('k'), +partition p3 values less than('q'), +partition p4 values less than('z')); + +insert into par4_1188069 values(generate_series(1,100),'d',generate_series(DATE '2022-01-01', DATE '2022-4-10', '1 day'),chr(65 + (generate_series(1,100)-1)%25)); +insert into par4_1188069 values(generate_series(101,200),'k',generate_series(DATE '2022-01-01', DATE '2022-4-10', '1 day'),chr(65 + (generate_series(1,100)-1)%25)); +insert into par4_1188069 values(generate_series(201,300),'q',generate_series(DATE '2022-01-01', DATE '2022-4-10', '1 day'),chr(65 + (generate_series(1,100)-1)%25)); +insert into par4_1188069 values(generate_series(301,400),null,generate_series(DATE '2022-01-01', DATE '2022-4-10', '1 day'),chr(65 + (generate_series(1,100)-1)%25)); + +prepare l7_1188069(varchar,varchar) as select * from par4_1188069 where a3 in($1,$2) limit 3; +explain (analyze,costs off) execute l7_1188069('h','v'); + +execute l7_1188069('H','V'); + +deallocate l7_1188069; +drop table par4_1188069; + DROP SCHEMA partition_pruning;