From 59253c1f4a880d5608e16de637f8a28d8da64250 Mon Sep 17 00:00:00 2001 From: chenxiaobin19 <1025221611@qq.com> Date: Tue, 12 Sep 2023 20:58:32 +0800 Subject: [PATCH] =?UTF-8?q?A=E5=85=BC=E5=AE=B9=E6=80=A7=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E4=B8=8B=EF=BC=8C=E6=89=93=E5=BC=80char=5Fcoerce=5Fco?= =?UTF-8?q?mpat=E6=97=B6varchar=E7=9A=84=E6=AF=94=E8=BE=83=E5=8C=85?= =?UTF-8?q?=E5=90=AB=E7=A9=BA=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/parser/parse_oper.cpp | 10 + .../codegen/vecexecutor/vecexprcodegen.cpp | 8 + .../vecexecutor/vecprimitive/varchar.inl | 2 +- src/include/catalog/pg_operator.h | 3 + .../regress/expected/single_node_varchar.out | 233 ++++++++++++++++++ src/test/regress/sql/single_node_varchar.sql | 67 +++++ 6 files changed, 322 insertions(+), 1 deletion(-) diff --git a/src/common/backend/parser/parse_oper.cpp b/src/common/backend/parser/parse_oper.cpp index 2093e3c0f..292157e3d 100644 --- a/src/common/backend/parser/parse_oper.cpp +++ b/src/common/backend/parser/parse_oper.cpp @@ -402,6 +402,16 @@ Operator oper(ParseState* pstate, List* opname, Oid ltypeId, Oid rtypeId, bool n rtypeId = NUMERICOID; } + /* + * In A_FORMAT compatibility and CHAR_COERCE_COMPAT, we choose TEXT-related + * operators for varchar and bpchar. + */ + if (DB_IS_CMPT(A_FORMAT) && CHAR_COERCE_COMPAT && (((ltypeId == VARCHAROID) && (rtypeId == BPCHAROID)) || + ((rtypeId == VARCHAROID) && (ltypeId == BPCHAROID)))) { + ltypeId = TEXTOID; + rtypeId = TEXTOID; + } + /* * Try to find the mapping in the lookaside cache. */ diff --git a/src/gausskernel/runtime/codegen/vecexecutor/vecexprcodegen.cpp b/src/gausskernel/runtime/codegen/vecexecutor/vecexprcodegen.cpp index a0f0e5f06..eaa4c0f66 100644 --- a/src/gausskernel/runtime/codegen/vecexecutor/vecexprcodegen.cpp +++ b/src/gausskernel/runtime/codegen/vecexecutor/vecexprcodegen.cpp @@ -658,8 +658,16 @@ bool VecExprCodeGen::OpJittable(ExprState* state) return false; switch (opexpr->opno) { + case TEXTEQOID: + case TEXTNEOID: + case TEXTLEOID: + case TEXTGEOID: case TEXTLTOID: case TEXTGTOID: { + if (DB_IS_CMPT(A_FORMAT) && CHAR_COERCE_COMPAT) { + return false; + } + /* Only support ASCII and UTF-8 encoding */ int current_encoding = GetDatabaseEncoding(); if (current_encoding != PG_SQL_ASCII && current_encoding != PG_UTF8) diff --git a/src/gausskernel/runtime/vecexecutor/vecprimitive/varchar.inl b/src/gausskernel/runtime/vecexecutor/vecprimitive/varchar.inl index 9d60cca42..96b8cc3bb 100755 --- a/src/gausskernel/runtime/vecexecutor/vecprimitive/varchar.inl +++ b/src/gausskernel/runtime/vecexecutor/vecprimitive/varchar.inl @@ -765,7 +765,7 @@ vtrim1(PG_FUNCTION_ARGS) FunctionCallInfoData finfo; finfo.arg = &args[0]; - + finfo.flinfo = fcinfo->flinfo; if (pselection != NULL) { diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h index d03916cf9..89e94322f 100644 --- a/src/include/catalog/pg_operator.h +++ b/src/include/catalog/pg_operator.h @@ -165,8 +165,11 @@ typedef FormData_pg_operator *Form_pg_operator; #define INT1EQOID 5513 #define OID_NAME_REGEXEQ_OP 639 #define OID_TEXT_REGEXEQ_OP 641 +#define TEXTNEOID 531 #define TEXTLTOID 664 +#define TEXTLEOID 665 #define TEXTGTOID 666 +#define TEXTGEOID 667 #define FLOAT8EQOID 670 #define FLOAT8NEOID 671 #define FLOAT8LTOID 672 diff --git a/src/test/regress/expected/single_node_varchar.out b/src/test/regress/expected/single_node_varchar.out index dae59316b..d5c2d9343 100644 --- a/src/test/regress/expected/single_node_varchar.out +++ b/src/test/regress/expected/single_node_varchar.out @@ -154,3 +154,236 @@ select length(rtrim('123 ')); (1 row) set behavior_compat_options = ''; +set behavior_compat_options = 'char_coerce_compat'; +create table tbl_111 (id int); +insert into tbl_111 values(1); +select count(*) from tbl_111 where cast(' ' as char(5)) = cast(' ' as varchar(5)); + count +------- + 0 +(1 row) + +select count(*) from tbl_111 where cast('abc ' as char(10)) = cast('abc ' as varchar(10)); + count +------- + 0 +(1 row) + +select count(*) from tbl_111 where cast(' ' as char(5)) != cast(' ' as varchar(5)); + count +------- + 1 +(1 row) + +select count(*) from tbl_111 where cast('abc ' as char(10)) != cast('abc ' as varchar(10)); + count +------- + 1 +(1 row) + +select count(*) from tbl_111 where cast(' ' as char(5)) > cast(' ' as varchar(5)); + count +------- + 1 +(1 row) + +select count(*) from tbl_111 where cast('abc ' as char(10)) > cast('abc ' as varchar(10)); + count +------- + 1 +(1 row) + +select count(*) from tbl_111 where cast(' ' as char(5)) >= cast(' ' as varchar(5)); + count +------- + 1 +(1 row) + +select count(*) from tbl_111 where cast('abc ' as char(10)) >= cast('abc ' as varchar(10)); + count +------- + 1 +(1 row) + +select count(*) from tbl_111 where cast(' ' as char(5)) < cast(' ' as varchar(5)); + count +------- + 0 +(1 row) + +select count(*) from tbl_111 where cast('abc ' as char(10)) < cast('abc ' as varchar(10)); + count +------- + 0 +(1 row) + +select count(*) from tbl_111 where cast(' ' as char(5)) <= cast(' ' as varchar(5)); + count +------- + 0 +(1 row) + +select count(*) from tbl_111 where cast('abc ' as char(10)) <= cast('abc ' as varchar(10)); + count +------- + 0 +(1 row) + +drop table tbl_111; +create table tbl_111 (a char(5), b varchar(5)); +insert into tbl_111 values (' ', ' '); +insert into tbl_111 values ('abc ', 'abc '); +select count(*) from tbl_111 where a = b; + count +------- + 0 +(1 row) + +select count(*) from tbl_111 where a != b; + count +------- + 2 +(1 row) + +select count(*) from tbl_111 where a > b; + count +------- + 2 +(1 row) + +select count(*) from tbl_111 where a >= b; + count +------- + 2 +(1 row) + +select count(*) from tbl_111 where a < b; + count +------- + 0 +(1 row) + +select count(*) from tbl_111 where a <= b; + count +------- + 0 +(1 row) + +set try_vector_engine_strategy='force'; +select count(*) from tbl_111 where a = b; + count +------- + 0 +(1 row) + +select count(*) from tbl_111 where a != b; + count +------- + 2 +(1 row) + +select count(*) from tbl_111 where a > b; + count +------- + 2 +(1 row) + +select count(*) from tbl_111 where a >= b; + count +------- + 2 +(1 row) + +select count(*) from tbl_111 where a < b; + count +------- + 0 +(1 row) + +select count(*) from tbl_111 where a <= b; + count +------- + 0 +(1 row) + +set try_vector_engine_strategy='off'; +drop table tbl_111; +create table tbl_111 (a char(5), b varchar(5)) with (orientation = column); +insert into tbl_111 values (' ', ' '); +insert into tbl_111 values ('abc ', 'abc '); +select count(*) from tbl_111 where a = b; + count +------- + 0 +(1 row) + +select count(*) from tbl_111 where a != b; + count +------- + 2 +(1 row) + +select count(*) from tbl_111 where a > b; + count +------- + 2 +(1 row) + +select count(*) from tbl_111 where a >= b; + count +------- + 2 +(1 row) + +select count(*) from tbl_111 where a < b; + count +------- + 0 +(1 row) + +select count(*) from tbl_111 where a <= b; + count +------- + 0 +(1 row) + +set enable_codegen to true; +set codegen_cost_threshold to 0; +select count(*) from tbl_111 where a = b; + count +------- + 0 +(1 row) + +select count(*) from tbl_111 where a != b; + count +------- + 2 +(1 row) + +select count(*) from tbl_111 where a > b; + count +------- + 2 +(1 row) + +select count(*) from tbl_111 where a >= b; + count +------- + 2 +(1 row) + +select count(*) from tbl_111 where a < b; + count +------- + 0 +(1 row) + +select count(*) from tbl_111 where a <= b; + count +------- + 0 +(1 row) + +drop table tbl_111; +set behavior_compat_options = ''; diff --git a/src/test/regress/sql/single_node_varchar.sql b/src/test/regress/sql/single_node_varchar.sql index 0147ae336..48e604499 100644 --- a/src/test/regress/sql/single_node_varchar.sql +++ b/src/test/regress/sql/single_node_varchar.sql @@ -85,3 +85,70 @@ select length(rtrim('123 ')); set behavior_compat_options = 'char_coerce_compat'; select length(rtrim('123 ')); set behavior_compat_options = ''; + +set behavior_compat_options = 'char_coerce_compat'; +create table tbl_111 (id int); +insert into tbl_111 values(1); + +select count(*) from tbl_111 where cast(' ' as char(5)) = cast(' ' as varchar(5)); +select count(*) from tbl_111 where cast('abc ' as char(10)) = cast('abc ' as varchar(10)); + +select count(*) from tbl_111 where cast(' ' as char(5)) != cast(' ' as varchar(5)); +select count(*) from tbl_111 where cast('abc ' as char(10)) != cast('abc ' as varchar(10)); + +select count(*) from tbl_111 where cast(' ' as char(5)) > cast(' ' as varchar(5)); +select count(*) from tbl_111 where cast('abc ' as char(10)) > cast('abc ' as varchar(10)); + +select count(*) from tbl_111 where cast(' ' as char(5)) >= cast(' ' as varchar(5)); +select count(*) from tbl_111 where cast('abc ' as char(10)) >= cast('abc ' as varchar(10)); + +select count(*) from tbl_111 where cast(' ' as char(5)) < cast(' ' as varchar(5)); +select count(*) from tbl_111 where cast('abc ' as char(10)) < cast('abc ' as varchar(10)); + +select count(*) from tbl_111 where cast(' ' as char(5)) <= cast(' ' as varchar(5)); +select count(*) from tbl_111 where cast('abc ' as char(10)) <= cast('abc ' as varchar(10)); + +drop table tbl_111; + +create table tbl_111 (a char(5), b varchar(5)); +insert into tbl_111 values (' ', ' '); +insert into tbl_111 values ('abc ', 'abc '); +select count(*) from tbl_111 where a = b; +select count(*) from tbl_111 where a != b; +select count(*) from tbl_111 where a > b; +select count(*) from tbl_111 where a >= b; +select count(*) from tbl_111 where a < b; +select count(*) from tbl_111 where a <= b; + +set try_vector_engine_strategy='force'; +select count(*) from tbl_111 where a = b; +select count(*) from tbl_111 where a != b; +select count(*) from tbl_111 where a > b; +select count(*) from tbl_111 where a >= b; +select count(*) from tbl_111 where a < b; +select count(*) from tbl_111 where a <= b; +set try_vector_engine_strategy='off'; + +drop table tbl_111; + +create table tbl_111 (a char(5), b varchar(5)) with (orientation = column); +insert into tbl_111 values (' ', ' '); +insert into tbl_111 values ('abc ', 'abc '); +select count(*) from tbl_111 where a = b; +select count(*) from tbl_111 where a != b; +select count(*) from tbl_111 where a > b; +select count(*) from tbl_111 where a >= b; +select count(*) from tbl_111 where a < b; +select count(*) from tbl_111 where a <= b; + +set enable_codegen to true; +set codegen_cost_threshold to 0; +select count(*) from tbl_111 where a = b; +select count(*) from tbl_111 where a != b; +select count(*) from tbl_111 where a > b; +select count(*) from tbl_111 where a >= b; +select count(*) from tbl_111 where a < b; +select count(*) from tbl_111 where a <= b; + +drop table tbl_111; +set behavior_compat_options = '';