diff --git a/src/common/backend/utils/adt/formatting.cpp b/src/common/backend/utils/adt/formatting.cpp index 422df1f4bb84c807eb4baf06aa39a24c6ddfb7dd..0f1cb57f3bdf5a4fbb24efb63369fa15633fef4c 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 0fc7b2da0826a422d3eda06b7e0e6c226805cdd6..b6f44aef78c20e0b1ef0dc16e9e7a141a8f9b63d 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 15516dbf67d2dbfe50dca1cf33209e2ab72c182f..a78770a1305969678c98da6dfe26c2b805d0d1a0 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;