From 4194a92fcd7bdfc930198f1e1c5e620c40743213 Mon Sep 17 00:00:00 2001 From: luozihao <1165977584@qq.com> Date: Mon, 28 Aug 2023 20:00:36 +0800 Subject: [PATCH] =?UTF-8?q?fixed=20a6720f2=20from=20https://gitee.com/luo?= =?UTF-8?q?=5Fzihao5524/openGauss-server/pulls/4024=20=E4=BF=AE=E5=A4=8Din?= =?UTF-8?q?terval=E7=B1=BB=E5=9E=8B=E5=9C=A8=E5=AD=98=E5=82=A8=E8=BF=87?= =?UTF-8?q?=E7=A8=8B=E5=A4=8D=E5=88=B6=E6=B5=81=E7=A8=8B=E4=B8=AD=E8=B5=8B?= =?UTF-8?q?=E5=80=BC=E6=8A=A5=E9=94=99=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/pl/plpgsql/src/pl_exec.cpp | 3 +- src/test/regress/expected/interval.out | 55 ++++++++++++++++++++++++++ src/test/regress/sql/interval.sql | 41 ++++++++++++++++++- 3 files changed, 97 insertions(+), 2 deletions(-) diff --git a/src/common/pl/plpgsql/src/pl_exec.cpp b/src/common/pl/plpgsql/src/pl_exec.cpp index 7a90df25d6..9272009e16 100644 --- a/src/common/pl/plpgsql/src/pl_exec.cpp +++ b/src/common/pl/plpgsql/src/pl_exec.cpp @@ -11859,7 +11859,8 @@ static Datum exec_cast_value(PLpgSQL_execstate* estate, Datum value, Oid valtype /* get the implicit cast function from valtype to reqtype */ result = find_coercion_pathway(reqtype, valtype, COERCION_ASSIGNMENT, &funcid); if (funcid != InvalidOid && !(result == COERCION_PATH_COERCEVIAIO || result == COERCION_PATH_ARRAYCOERCE)) { - value = OidFunctionCall1(funcid, value); + value = (reqtype == INTERVALOID) ? + OidFunctionCall2(funcid, value, reqtypmod) : OidFunctionCall1(funcid, value); value = pl_coerce_type_typmod(value, reqtype, reqtypmod); } else { extval = convert_value_to_string(estate, value, valtype); diff --git a/src/test/regress/expected/interval.out b/src/test/regress/expected/interval.out index fbe5b481ad..adc32e086a 100644 --- a/src/test/regress/expected/interval.out +++ b/src/test/regress/expected/interval.out @@ -1310,3 +1310,58 @@ select '15'::bpchar(2)::INTERVAL YEAR; @ 15 years (1 row) +-- test abourt interval typmod in procedure +drop table if exists all_datatype_tbl; +NOTICE: table "all_datatype_tbl" does not exist, skipping +create table all_datatype_tbl( + c_id integer, + c_boolean boolean, + c_integer integer, c_bigint bigint, + c_real real, + c_decimal decimal(38), c_number number(38), + c_char char(50) default null, c_varchar varchar(50), c_clob clob, + c_blob blob, + c_timestamp timestamp, c_interval interval day to second) with (segment=on) ; +create or replace procedure pro_012() +as + sqlstat varchar(500); + v1 interval day to second; +begin + v1 := '12 12:3:4.1234'; + sqlstat := 'insert into all_datatype_tbl(c_interval) select :p1'; + execute immediate sqlstat using v1; +end; +/ +call pro_012(); + pro_012 +--------- + +(1 row) + +select c_interval from all_datatype_tbl; + c_interval +--------------------------------------- + @ 12 days 12 hours 3 mins 4.1234 secs +(1 row) + +drop procedure pro_012; +create or replace procedure pro_015() +as + sqlstat varchar(500); + v1 interval day to second; + r1 interval day to second; +begin + v1 := '12 12:3:4.1234'; + sqlstat := 'select :p1'; + execute immediate sqlstat into r1 using v1; + raise info 'result:%',v1; +end; +/ +call pro_015(); +INFO: result:@ 12 days 12 hours 3 mins 4.1234 secs + pro_015 +--------- + +(1 row) + +drop procedure pro_015; diff --git a/src/test/regress/sql/interval.sql b/src/test/regress/sql/interval.sql index 4b5f97bd11..58b9de6597 100644 --- a/src/test/regress/sql/interval.sql +++ b/src/test/regress/sql/interval.sql @@ -367,4 +367,43 @@ select '15'::float8::INTERVAL YEAR; select '15'::numeric::INTERVAL YEAR; select '15'::text::INTERVAL YEAR; select '15'::varchar::INTERVAL YEAR; -select '15'::bpchar(2)::INTERVAL YEAR; \ No newline at end of file +select '15'::bpchar(2)::INTERVAL YEAR; + +-- test abourt interval typmod in procedure +drop table if exists all_datatype_tbl; +create table all_datatype_tbl( + c_id integer, + c_boolean boolean, + c_integer integer, c_bigint bigint, + c_real real, + c_decimal decimal(38), c_number number(38), + c_char char(50) default null, c_varchar varchar(50), c_clob clob, + c_blob blob, + c_timestamp timestamp, c_interval interval day to second) with (segment=on) ; +create or replace procedure pro_012() +as + sqlstat varchar(500); + v1 interval day to second; +begin + v1 := '12 12:3:4.1234'; + sqlstat := 'insert into all_datatype_tbl(c_interval) select :p1'; + execute immediate sqlstat using v1; +end; +/ +call pro_012(); +select c_interval from all_datatype_tbl; +drop procedure pro_012; +create or replace procedure pro_015() +as + sqlstat varchar(500); + v1 interval day to second; + r1 interval day to second; +begin + v1 := '12 12:3:4.1234'; + sqlstat := 'select :p1'; + execute immediate sqlstat into r1 using v1; + raise info 'result:%',v1; +end; +/ +call pro_015(); +drop procedure pro_015; -- Gitee