From 8c4c712bc45a5d83499cea8b8a7d8c0257a57203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=97=E9=87=8C=E5=AF=BB=E4=BB=96=E5=8D=83=E7=99=BE?= =?UTF-8?q?=E5=BA=A6?= <783479891@qq.com> Date: Tue, 31 Dec 2024 13:39:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dto=5Fnumber=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=95=B0=E6=8D=AE=E5=BA=93=E5=A5=94=E6=BA=83?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/utils/adt/formatting.cpp | 2 ++ src/test/regress/expected/to_number_default.out | 6 ++++++ src/test/regress/sql/to_number_default.sql | 5 ++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/common/backend/utils/adt/formatting.cpp b/src/common/backend/utils/adt/formatting.cpp index 422df1f4bb..0f1cb57f3b 100644 --- a/src/common/backend/utils/adt/formatting.cpp +++ b/src/common/backend/utils/adt/formatting.cpp @@ -7095,6 +7095,7 @@ Datum numeric_to_text_number(PG_FUNCTION_ARGS) // Number description: fmt NUMDesc numDesc; bool shouldFree = false; + fmt = PG_GETARG_TEXT_P(4); int len = VARSIZE(fmt) - VARHDRSZ; FormatNode* format = NUM_cache(len, &numDesc, fmt, &shouldFree); // Integer digits @@ -7177,6 +7178,7 @@ Datum numeric_to_default_without_defaultval(PG_FUNCTION_ARGS) result = to_numeric_number_internal_without_fmt(default_num_val, PG_GET_COLLATION(), &resultNull); } else { + fmt = PG_GETARG_TEXT_P(4); result = to_numeric_to_number_internal(default_num_val, fmt, PG_GET_COLLATION(), &resultNull); } diff --git a/src/test/regress/expected/to_number_default.out b/src/test/regress/expected/to_number_default.out index 0fc7b2da08..b6f44aef78 100644 --- a/src/test/regress/expected/to_number_default.out +++ b/src/test/regress/expected/to_number_default.out @@ -280,6 +280,12 @@ SELECT TO_NUMBER(3.14 DEFAULT c1 ON CONVERSION ERROR) FROM tonumber ORDER By c1; 3.14 (7 rows) +SELECT to_number('<1234>' DEFAULT 999 ON CONVERSION ERROR,'PR9999999'); +ERROR: "9" must be ahead of "PR" +CONTEXT: referenced column: to_number +SELECT TO_NUMBER('1234.56' default 999 on conversion error ,'99.99'); +ERROR: Exceeding the maximum value required by fmt +CONTEXT: referenced column: to_number SELECT TO_NUMBER(c2 DEFAULT 3.14 ON CONVERSION ERROR) FROM tonumber ORDER By c1; to_number ----------------------------------------- diff --git a/src/test/regress/sql/to_number_default.sql b/src/test/regress/sql/to_number_default.sql index 15516dbf67..a78770a130 100644 --- a/src/test/regress/sql/to_number_default.sql +++ b/src/test/regress/sql/to_number_default.sql @@ -60,6 +60,8 @@ SELECT TO_NUMBER(c1 DEFAULT NULL ON CONVERSION ERROR) FROM tonumber ORDER By c1; SELECT TO_NUMBER('abd' DEFAULT c1 ON CONVERSION ERROR) FROM tonumber ORDER By c1; -- error, Default param can't be ColumnRef SELECT TO_NUMBER(3.14 DEFAULT c1 ON CONVERSION ERROR) FROM tonumber ORDER By c1; -- error, Default param can't be ColumnRef +SELECT to_number('<1234>' DEFAULT 999 ON CONVERSION ERROR,'PR9999999'); +SELECT TO_NUMBER('1234.56' default 999 on conversion error ,'99.99'); SELECT TO_NUMBER(c2 DEFAULT 3.14 ON CONVERSION ERROR) FROM tonumber ORDER By c1; SELECT TO_NUMBER(c2 DEFAULT '3.14' ON CONVERSION ERROR) FROM tonumber ORDER By c1; @@ -278,9 +280,10 @@ EXECUTE default_param_num_text(27, 6.666666, '1.79769313486231E+100'); EXECUTE default_param_num_text(28, 1.79769313486231E+400, '6.666666'); EXECUTE default_param_num_text(29, 6.666666, '1.79769313486231E+400'); + SELECT * FROM tonumber_exec ORDER BY c1; DROP TABLE tonumber; DROP TABLE tonumber_exec; -drop schema if exists func_to_number cascade; \ No newline at end of file +drop schema if exists func_to_number cascade; -- Gitee