增加浮点数特殊值显示GUC控制

This commit is contained in:
wangpingyun
2024-07-25 16:00:22 +08:00
parent 2c6ec0bc34
commit b5c04bb6dd
6 changed files with 150 additions and 67 deletions

View File

@ -359,6 +359,7 @@ wdr_snapshot_retention_days|int|1,8|NULL|NULL|
wdr_snapshot_query_timeout|int|100,2147483647|s|NULL| wdr_snapshot_query_timeout|int|100,2147483647|s|NULL|
enable_wdr_snapshot|bool|0,0|NULL|NULL| enable_wdr_snapshot|bool|0,0|NULL|NULL|
enable_set_variable_b_format|bool|0,0|NULL|NULL| enable_set_variable_b_format|bool|0,0|NULL|NULL|
enable_binary_special_o_format|bool|0,0|NULL|NULL|
enable_asp|bool|0,0|NULL|NULL| enable_asp|bool|0,0|NULL|NULL|
enable_startwith_debug|bool|0,0|NULL|NULL| enable_startwith_debug|bool|0,0|NULL|NULL|
enable_stmt_track|bool|0,0|NULL|NULL| enable_stmt_track|bool|0,0|NULL|NULL|

View File

@ -397,18 +397,30 @@ Datum float4out(PG_FUNCTION_ARGS)
errno_t rc = EOK; errno_t rc = EOK;
if (isnan(num)) { if (isnan(num)) {
rc = strcpy_s(ascii, MAXFLOATWIDTH + 1, "NaN"); if (u_sess->attr.attr_sql.enable_binary_special_o_format) {
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "Nan");
} else {
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "NaN");
}
securec_check_ss(rc, "\0", "\0"); securec_check_ss(rc, "\0", "\0");
PG_RETURN_CSTRING(ascii); PG_RETURN_CSTRING(ascii);
} }
switch (is_infinite(num)) { switch (is_infinite(num)) {
case 1: case 1:
rc = strcpy_s(ascii, MAXFLOATWIDTH + 1, "Infinity"); if (u_sess->attr.attr_sql.enable_binary_special_o_format) {
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "Inf");
} else {
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "Infinity");
}
securec_check_ss(rc, "\0", "\0"); securec_check_ss(rc, "\0", "\0");
break; break;
case -1: case -1:
rc = strcpy_s(ascii, MAXFLOATWIDTH + 1, "-Infinity"); if (u_sess->attr.attr_sql.enable_binary_special_o_format) {
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "-Inf");
} else {
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "-Infinity");
}
securec_check_ss(rc, "\0", "\0"); securec_check_ss(rc, "\0", "\0");
break; break;
default: { default: {
@ -627,17 +639,29 @@ Datum float8out(PG_FUNCTION_ARGS)
errno_t rc = EOK; errno_t rc = EOK;
if (isnan(num)) { if (isnan(num)) {
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "NaN"); if (u_sess->attr.attr_sql.enable_binary_special_o_format) {
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "Nan");
} else {
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "NaN");
}
securec_check(rc, "\0", "\0"); securec_check(rc, "\0", "\0");
PG_RETURN_CSTRING(ascii); PG_RETURN_CSTRING(ascii);
} }
switch (is_infinite(num)) { switch (is_infinite(num)) {
case 1: case 1:
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "Infinity"); if (u_sess->attr.attr_sql.enable_binary_special_o_format) {
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "Inf");
} else {
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "Infinity");
}
securec_check(rc, "\0", "\0"); securec_check(rc, "\0", "\0");
break; break;
case -1: case -1:
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "-Infinity"); if (u_sess->attr.attr_sql.enable_binary_special_o_format) {
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "-Inf");
} else {
rc = strcpy_s(ascii, MAXDOUBLEWIDTH + 1, "-Infinity");
}
securec_check(rc, "\0", "\0"); securec_check(rc, "\0", "\0");
break; break;
default: { default: {

View File

@ -663,6 +663,17 @@ static void InitSqlConfigureNamesBool()
NULL, NULL,
NULL, NULL,
NULL}, NULL},
{{"enable_binary_special_o_format",
PGC_USERSET,
NODE_ALL,
QUERY_TUNING_COST,
gettext_noop("Allows the user to specify the value of a double-precision floating-point parameter."),
NULL},
&u_sess->attr.attr_sql.enable_binary_special_o_format,
false,
NULL,
NULL,
NULL},
{{"enable_seqscan", {{"enable_seqscan",
PGC_USERSET, PGC_USERSET,
NODE_ALL, NODE_ALL,

View File

@ -127,6 +127,7 @@ typedef struct knl_session_attr_sql {
bool enable_light_proxy; bool enable_light_proxy;
bool enable_pbe_optimization; bool enable_pbe_optimization;
bool enable_cluster_resize; bool enable_cluster_resize;
bool enable_binary_special_o_format;
bool lo_compat_privileges; bool lo_compat_privileges;
bool quote_all_identifiers; bool quote_all_identifiers;
bool enforce_a_behavior; bool enforce_a_behavior;

View File

@ -433,16 +433,53 @@ ERROR: syntax error at or near "/"
LINE 1: SELECT 4.0f / 2.0; LINE 1: SELECT 4.0f / 2.0;
^ ^
set float_suffix_acceptance to on; set float_suffix_acceptance to on;
SELECT CONCAT('The value is ', TO_CHAR(BINARY_DOUBLE_INFINITY)) AS result;
result
-----------------------
The value is Infinity
(1 row)
SELECT CONCAT('The value is ', TO_CHAR(-BINARY_DOUBLE_INFINITY)) AS result;
result
------------------------
The value is -Infinity
(1 row)
SELECT CONCAT('The value is ', TO_CHAR(-BINARY_DOUBLE_NAN)) AS result;
result
------------------
The value is NaN
(1 row)
set enable_binary_special_o_format to on;
SELECT CONCAT('The value is ', TO_CHAR(BINARY_DOUBLE_INFINITY)) AS result;
result
------------------
The value is Inf
(1 row)
SELECT CONCAT('The value is ', TO_CHAR(-BINARY_DOUBLE_INFINITY)) AS result;
result
-------------------
The value is -Inf
(1 row)
SELECT CONCAT('The value is ', TO_CHAR(-BINARY_DOUBLE_NAN)) AS result;
result
------------------
The value is Nan
(1 row)
SELECT BINARY_DOUBLE_INFINITY; SELECT BINARY_DOUBLE_INFINITY;
binary_double_infinity binary_double_infinity
------------------------ ------------------------
Infinity Inf
(1 row) (1 row)
SELECT BINARY_DOUBLE_NAN; SELECT BINARY_DOUBLE_NAN;
binary_double_nan binary_double_nan
------------------- -------------------
NaN Nan
(1 row) (1 row)
CREATE TABLE test_table ( CREATE TABLE test_table (
@ -454,7 +491,7 @@ VALUES (1, BINARY_DOUBLE_NAN);
SELECT * FROM test_table WHERE float_value = BINARY_DOUBLE_NAN; SELECT * FROM test_table WHERE float_value = BINARY_DOUBLE_NAN;
id | float_value id | float_value
----+------------- ----+-------------
1 | NaN 1 | Nan
(1 row) (1 row)
INSERT INTO test_table (id, float_value) INSERT INTO test_table (id, float_value)
@ -462,75 +499,75 @@ VALUES (2, BINARY_DOUBLE_INFINITY);
SELECT * FROM test_table WHERE float_value = BINARY_DOUBLE_INFINITY; SELECT * FROM test_table WHERE float_value = BINARY_DOUBLE_INFINITY;
id | float_value id | float_value
----+------------- ----+-------------
2 | Infinity 2 | Inf
(1 row) (1 row)
SELECT float_value + 1 FROM test_table WHERE id = 1; SELECT float_value + 1 FROM test_table WHERE id = 1;
?column? ?column?
---------- ----------
NaN Nan
(1 row) (1 row)
SELECT float_value * 2 FROM test_table WHERE id = 2; SELECT float_value * 2 FROM test_table WHERE id = 2;
?column? ?column?
---------- ----------
Infinity Inf
(1 row) (1 row)
SELECT * FROM test_table WHERE float_value = BINARY_DOUBLE_NAN OR float_value = BINARY_DOUBLE_INFINITY; SELECT * FROM test_table WHERE float_value = BINARY_DOUBLE_NAN OR float_value = BINARY_DOUBLE_INFINITY;
id | float_value id | float_value
----+------------- ----+-------------
1 | NaN 1 | Nan
2 | Infinity 2 | Inf
(2 rows) (2 rows)
DROP TABLE test_table; DROP TABLE test_table;
SELECT ABS(binary_double_infinity); SELECT ABS(binary_double_infinity);
abs abs
---------- -----
Infinity Inf
(1 row) (1 row)
SELECT CEIL(binary_double_infinity); SELECT CEIL(binary_double_infinity);
ceil ceil
---------- ------
Infinity Inf
(1 row) (1 row)
SELECT SQRT(binary_double_infinity); SELECT SQRT(binary_double_infinity);
sqrt sqrt
---------- ------
Infinity Inf
(1 row) (1 row)
SELECT FLOOR(binary_double_infinity); SELECT FLOOR(binary_double_infinity);
floor floor
---------- -------
Infinity Inf
(1 row) (1 row)
SELECT SQRT(binary_double_infinity); SELECT SQRT(binary_double_infinity);
sqrt sqrt
---------- ------
Infinity Inf
(1 row) (1 row)
SELECT EXP(binary_double_infinity); SELECT EXP(binary_double_infinity);
exp exp
---------- -----
Infinity Inf
(1 row) (1 row)
SELECT LOG(binary_double_infinity); SELECT LOG(binary_double_infinity);
log log
---------- -----
Infinity Inf
(1 row) (1 row)
SELECT POWER(binary_double_infinity, 2); SELECT POWER(binary_double_infinity, 2);
power power
---------- -------
Infinity Inf
(1 row) (1 row)
SELECT SIN(binary_double_infinity); SELECT SIN(binary_double_infinity);
@ -539,55 +576,55 @@ CONTEXT: referenced column: sin
SELECT ABS(binary_double_nan); SELECT ABS(binary_double_nan);
abs abs
----- -----
NaN Nan
(1 row) (1 row)
SELECT CEIL(binary_double_nan); SELECT CEIL(binary_double_nan);
ceil ceil
------ ------
NaN Nan
(1 row) (1 row)
SELECT SQRT(binary_double_nan); SELECT SQRT(binary_double_nan);
sqrt sqrt
------ ------
NaN Nan
(1 row) (1 row)
SELECT FLOOR(binary_double_nan); SELECT FLOOR(binary_double_nan);
floor floor
------- -------
NaN Nan
(1 row) (1 row)
SELECT SQRT(binary_double_nan); SELECT SQRT(binary_double_nan);
sqrt sqrt
------ ------
NaN Nan
(1 row) (1 row)
SELECT EXP(binary_double_nan); SELECT EXP(binary_double_nan);
exp exp
----- -----
NaN Nan
(1 row) (1 row)
SELECT LOG(binary_double_nan); SELECT LOG(binary_double_nan);
log log
----- -----
NaN Nan
(1 row) (1 row)
SELECT POWER(binary_double_nan, 2); SELECT POWER(binary_double_nan, 2);
power power
------- -------
NaN Nan
(1 row) (1 row)
SELECT SIN(binary_double_nan); SELECT SIN(binary_double_nan);
sin sin
----- -----
NaN Nan
(1 row) (1 row)
-- 创建自定义函数 -- 创建自定义函数
@ -668,49 +705,49 @@ SELECT (binary_double_infinity > 0.0) OR (binary_double_nan < binary_double_infi
SELECT binary_double_infinity + 1.0; -- 返回正无穷大 SELECT binary_double_infinity + 1.0; -- 返回正无穷大
?column? ?column?
---------- ----------
Infinity Inf
(1 row) (1 row)
SELECT binary_double_nan + 1.0; -- 返回 NaN SELECT binary_double_nan + 1.0; -- 返回 NaN
?column? ?column?
---------- ----------
NaN Nan
(1 row) (1 row)
SELECT binary_double_infinity - binary_double_infinity; -- 返回 NaN SELECT binary_double_infinity - binary_double_infinity; -- 返回 NaN
?column? ?column?
---------- ----------
NaN Nan
(1 row) (1 row)
SELECT binary_double_nan - 1.0; -- 返回 NaN SELECT binary_double_nan - 1.0; -- 返回 NaN
?column? ?column?
---------- ----------
NaN Nan
(1 row) (1 row)
SELECT binary_double_infinity * binary_double_infinity; -- 返回正无穷大 SELECT binary_double_infinity * binary_double_infinity; -- 返回正无穷大
?column? ?column?
---------- ----------
Infinity Inf
(1 row) (1 row)
SELECT binary_double_nan * 1.0; -- 返回 NaN SELECT binary_double_nan * 1.0; -- 返回 NaN
?column? ?column?
---------- ----------
NaN Nan
(1 row) (1 row)
SELECT binary_double_infinity / binary_double_infinity; -- 返回 NaN SELECT binary_double_infinity / binary_double_infinity; -- 返回 NaN
?column? ?column?
---------- ----------
NaN Nan
(1 row) (1 row)
SELECT binary_double_nan / 1.0; -- 返回 NaN SELECT binary_double_nan / 1.0; -- 返回 NaN
?column? ?column?
---------- ----------
NaN Nan
(1 row) (1 row)
CREATE TABLE T1(binary_double_nan INT); CREATE TABLE T1(binary_double_nan INT);
@ -718,15 +755,15 @@ INSERT INTO T1 VALUES(1),(2),(3);
SELECT binary_double_nan; SELECT binary_double_nan;
binary_double_nan binary_double_nan
------------------- -------------------
NaN Nan
(1 row) (1 row)
SELECT binary_double_nan FROM T1; SELECT binary_double_nan FROM T1;
binary_double_nan binary_double_nan
------------------- -------------------
NaN Nan
NaN Nan
NaN Nan
(3 rows) (3 rows)
SELECT T1.binary_double_nan FROM T1; SELECT T1.binary_double_nan FROM T1;
@ -770,19 +807,19 @@ insert into t1 values(binary_double_nan);
select avg(id) from t1; select avg(id) from t1;
avg avg
----- -----
NaN Nan
(1 row) (1 row)
select sum(id) from t1; select sum(id) from t1;
sum sum
----- -----
NaN Nan
(1 row) (1 row)
select max(id) from t1; select max(id) from t1;
max max
----- -----
NaN Nan
(1 row) (1 row)
select min(id) from t1; select min(id) from t1;
@ -800,9 +837,9 @@ insert into t1 values(3.14),(10),(15);
select binary_double_nan from t1; select binary_double_nan from t1;
binary_double_nan binary_double_nan
------------------- -------------------
NaN Nan
NaN Nan
NaN Nan
(3 rows) (3 rows)
select t1.binary_double_nan from t1; select t1.binary_double_nan from t1;
@ -820,7 +857,7 @@ insert into t1 values (100,9);
select * from t1; select * from t1;
binary_double_infinity | id binary_double_infinity | id
------------------------+---- ------------------------+----
Infinity | 10 Inf | 10
100 | 9 100 | 9
(2 rows) (2 rows)
@ -832,7 +869,7 @@ select * from t1 where binary_double_infinity = 100;
select * from t1 where binary_double_infinity = binary_double_infinity; select * from t1 where binary_double_infinity = binary_double_infinity;
binary_double_infinity | id binary_double_infinity | id
------------------------+---- ------------------------+----
Infinity | 10 Inf | 10
100 | 9 100 | 9
(2 rows) (2 rows)

View File

@ -157,6 +157,15 @@ SELECT 4.0f / 2.0;
set float_suffix_acceptance to on; set float_suffix_acceptance to on;
SELECT CONCAT('The value is ', TO_CHAR(BINARY_DOUBLE_INFINITY)) AS result;
SELECT CONCAT('The value is ', TO_CHAR(-BINARY_DOUBLE_INFINITY)) AS result;
SELECT CONCAT('The value is ', TO_CHAR(-BINARY_DOUBLE_NAN)) AS result;
set enable_binary_special_o_format to on;
SELECT CONCAT('The value is ', TO_CHAR(BINARY_DOUBLE_INFINITY)) AS result;
SELECT CONCAT('The value is ', TO_CHAR(-BINARY_DOUBLE_INFINITY)) AS result;
SELECT CONCAT('The value is ', TO_CHAR(-BINARY_DOUBLE_NAN)) AS result;
SELECT BINARY_DOUBLE_INFINITY; SELECT BINARY_DOUBLE_INFINITY;
SELECT BINARY_DOUBLE_NAN; SELECT BINARY_DOUBLE_NAN;