From 8d029d2edf8b4b7e97073a5c64d776813142ea30 Mon Sep 17 00:00:00 2001 From: zhubin79 <18784715772@163.com> Date: Tue, 10 Sep 2024 16:57:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=AE=E7=82=B9=E6=95=B0=E5=AD=97=E9=9D=A2?= =?UTF-8?q?=E9=87=8F=E6=BA=A2=E5=87=BA=E4=B8=BA0=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/parser/scan.l | 11 +-- src/test/regress/expected/float_literals.out | 95 ++++++++++++++++++-- src/test/regress/expected/hw_datatype.out | 16 ++-- src/test/regress/expected/hw_datatype_2.out | 16 ++-- src/test/regress/sql/float_literals.sql | 41 +++++++++ 5 files changed, 150 insertions(+), 29 deletions(-) diff --git a/src/common/backend/parser/scan.l b/src/common/backend/parser/scan.l index f258dd91a..8165b09f0 100755 --- a/src/common/backend/parser/scan.l +++ b/src/common/backend/parser/scan.l @@ -1636,15 +1636,10 @@ handle_float_overflow(char *token, core_yyscan_t yyscanner) } errno = 0; - val = strtod(result, &endptr); + val = strtod(result, &endptr); - // if val < 1E-130, we assume it is 0 - if (val != 0 && log10(val) < -130) { - result = "0"; - } else if (errno == ERANGE) { - if (val == 0.0) { - result = "0"; - } else { + if (errno == ERANGE) { + if (val == 0.0 || val >= HUGE_VAL || val <= -HUGE_VAL) { yyerror("number overflow"); } } diff --git a/src/test/regress/expected/float_literals.out b/src/test/regress/expected/float_literals.out index 3864c7a73..e8b90d149 100644 --- a/src/test/regress/expected/float_literals.out +++ b/src/test/regress/expected/float_literals.out @@ -30,15 +30,25 @@ ERROR: number overflow at or near "1.79E+400" LINE 1: SELECT 1.79E+400; ^ SELECT 1.79E-400; - ?column? ----------- - 0 -(1 row) - +ERROR: number overflow at or near "1.79E-400" +LINE 1: SELECT 1.79E-400; + ^ SELECT -1.79E+400; ERROR: number overflow at or near "1.79E+400" LINE 1: SELECT -1.79E+400; ^ +SELECT 1E-307; + ?column? +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + .0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +(1 row) + +SELECT 1E-308; + ?column? +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + .00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +(1 row) + SELECT '0.0'; ?column? ---------- @@ -81,6 +91,18 @@ SELECT '-1.79E+400'; -1.79E+400 (1 row) +SELECT '1E-307'; + ?column? +---------- + 1E-307 +(1 row) + +SELECT '1E-308'; + ?column? +---------- + 1E-308 +(1 row) + SELECT '0.0'::float8; float8 -------- @@ -120,6 +142,18 @@ ERROR: "-1.79E+400" is out of range for type double precision LINE 1: SELECT '-1.79E+400'::float8; ^ CONTEXT: referenced column: float8 +SELECT '1E-307'::float8; + float8 +-------- + 1e-307 +(1 row) + +SELECT '1E-308'::float8; + float8 +-------- + 1e-308 +(1 row) + SELECT TO_BINARY_FLOAT(3.14 DEFAULT y ON CONVERSION ERROR); ERROR: column "y" does not exist LINE 1: SELECT TO_BINARY_FLOAT(3.14 DEFAULT y ON CONVERSION ERROR); @@ -215,6 +249,9 @@ ERROR: number overflow at or near "3.14E+400" LINE 1: INSERT INTO t_float_literals VALUES (7, 3.14E+400); ^ INSERT INTO t_float_literals VALUES (8, 3.14E-400); +ERROR: number overflow at or near "3.14E-400" +LINE 1: INSERT INTO t_float_literals VALUES (8, 3.14E-400); + ^ INSERT INTO t_float_literals VALUES (9, -3.14E+400); ERROR: number overflow at or near "3.14E+400" LINE 1: INSERT INTO t_float_literals VALUES (9, -3.14E+400); @@ -240,8 +277,7 @@ SELECT * FROM t_float_literals ORDER bY id; 4 | -3.14e+40 5 | 3.14e+40 6 | -3.14e+40 - 8 | 0 -(7 rows) +(6 rows) UPDATE t_float_iterals SET c1 = 1.79E+400 WHERE id = 1; ERROR: number overflow at or near "1.79E+400" @@ -263,6 +299,51 @@ SELECT * FROM t_float_iterals ORDER BY c1; ERROR: relation "t_float_iterals" does not exist on datanode1 LINE 1: SELECT * FROM t_float_iterals ORDER BY c1; ^ +create table llvm_enh +( + l_bool boolean default false, + l_tint tinyint default 255, + l_sint smallint default 32767, + l_int integer default 2147483647, + l_bint bigint default 9223372036854775807, + l_num1 numeric(18,0) default 999999999999999999, + l_num2 numeric(19,19) default 0.9223372036854775807, + l_num3 numeric(38,0) default 99999999999999999999999999999999999999, + l_flo1 float4 default 999999, + l_flo2 float8 default 1E-307, + l_char char(39) default '170141183460469231731687303715884105728', + l_vchar varchar(40) default '-170141183460469231731687303715884105728', + l_text text default '-170141183460469231731687303715884105729', + l_date date default '2016-10-18', + l_time time default '21:21:21', + l_times timestamp default '2003-04-12 04:05:06', + l_timez timestamp with time zone default '2003-04-12 04:05:06 pst', + l_oid oid default 12345 +) ; +insert into llvm_enh(l_bool) values(true); +insert into llvm_enh(l_tint) values(0); +insert into llvm_enh(l_sint) values(-32768); +insert into llvm_enh(l_int) values(-2147483648); +insert into llvm_enh(l_bint) values(-9223372036854775808); +insert into llvm_enh(l_num1) values(-999999999999999999); +insert into llvm_enh(l_num2) values(-0.9223372036854775808); +insert into llvm_enh(l_num3) values(-99999999999999999999999999999999999999); +insert into llvm_enh(l_flo1) values(-999999); +insert into llvm_enh(l_flo2) values(1E+308); +select l_flo2,l_flo1 from llvm_enh where l_flo2 < l_flo1-999998 order by 1,2; + l_flo2 | l_flo1 +--------+-------- + 1e-307 | 999999 + 1e-307 | 999999 + 1e-307 | 999999 + 1e-307 | 999999 + 1e-307 | 999999 + 1e-307 | 999999 + 1e-307 | 999999 + 1e-307 | 999999 +(8 rows) + drop table t_float_literals; +drop table llvm_enh; \c regression drop database float_literals; diff --git a/src/test/regress/expected/hw_datatype.out b/src/test/regress/expected/hw_datatype.out index 2ad8c0da0..502000a34 100644 --- a/src/test/regress/expected/hw_datatype.out +++ b/src/test/regress/expected/hw_datatype.out @@ -222,19 +222,21 @@ CREATE TABLE test_type( INSERT INTO test_type VALUES(15.23448); INSERT INTO test_type VALUES(1E-323); INSERT INTO test_type VALUES(1E-324); +ERROR: number overflow at or near "1E-324" +LINE 1: INSERT INTO test_type VALUES(1E-324); + ^ INSERT INTO test_type VALUES(1E+308); INSERT INTO test_type VALUES(1E+309); ERROR: number overflow at or near "1E+309" LINE 1: INSERT INTO test_type VALUES(1E+309); ^ SELECT * FROM test_type order by 1; - my_double ------------ - 0 - 0 - 15.23448 - 1e+308 -(4 rows) + my_double +----------------------- + 9.88131291682493e-324 + 15.23448 + 1e+308 +(3 rows) DROP TABLE test_type; /* g.Type BINARY_INTEGER */ diff --git a/src/test/regress/expected/hw_datatype_2.out b/src/test/regress/expected/hw_datatype_2.out index b922236c0..e29e13e34 100644 --- a/src/test/regress/expected/hw_datatype_2.out +++ b/src/test/regress/expected/hw_datatype_2.out @@ -663,19 +663,21 @@ CREATE TABLE test_type( INSERT INTO test_type VALUES(15.23448); INSERT INTO test_type VALUES(1E-323); INSERT INTO test_type VALUES(1E-324); +ERROR: number overflow at or near "1E-324" +LINE 1: INSERT INTO test_type VALUES(1E-324); + ^ INSERT INTO test_type VALUES(1E+308); INSERT INTO test_type VALUES(1E+309); ERROR: number overflow at or near "1E+309" LINE 1: INSERT INTO test_type VALUES(1E+309); ^ SELECT * FROM test_type order by 1; - my_double ------------ - 0 - 0 - 15.23448 - 1e+308 -(4 rows) + my_double +----------------------- + 9.88131291682493e-324 + 15.23448 + 1e+308 +(3 rows) DROP TABLE test_type; /* g.Type BINARY_INTEGER */ diff --git a/src/test/regress/sql/float_literals.sql b/src/test/regress/sql/float_literals.sql index 26d5feffb..f111710cc 100644 --- a/src/test/regress/sql/float_literals.sql +++ b/src/test/regress/sql/float_literals.sql @@ -9,6 +9,8 @@ SELECT -3.142596; SELECT 1.79E+400; SELECT 1.79E-400; SELECT -1.79E+400; +SELECT 1E-307; +SELECT 1E-308; SELECT '0.0'; SELECT '-0.0'; @@ -17,6 +19,8 @@ SELECT '-3.142596'; SELECT '1.79E+400'; SELECT '1.79E-400'; SELECT '-1.79E+400'; +SELECT '1E-307'; +SELECT '1E-308'; SELECT '0.0'::float8; SELECT '-0.0'::float8; @@ -25,6 +29,8 @@ SELECT '-3.142596'::float8; SELECT '1.79E+400'::float8; SELECT '1.79E-400'::float8; SELECT '-1.79E+400'::float8; +SELECT '1E-307'::float8; +SELECT '1E-308'::float8; SELECT TO_BINARY_FLOAT(3.14 DEFAULT y ON CONVERSION ERROR); SELECT TO_BINARY_FLOAT(-3.14 DEFAULT + ON CONVERSION ERROR); @@ -71,6 +77,41 @@ UPDATE t_float_iterals SET c1 = 1.79E+40 WHERE id = 3; UPDATE t_float_iterals SET c1 = '1.79E+40'::float8 WHERE id = 4; SELECT * FROM t_float_iterals ORDER BY c1; +create table llvm_enh +( + l_bool boolean default false, + l_tint tinyint default 255, + l_sint smallint default 32767, + l_int integer default 2147483647, + l_bint bigint default 9223372036854775807, + l_num1 numeric(18,0) default 999999999999999999, + l_num2 numeric(19,19) default 0.9223372036854775807, + l_num3 numeric(38,0) default 99999999999999999999999999999999999999, + l_flo1 float4 default 999999, + l_flo2 float8 default 1E-307, + l_char char(39) default '170141183460469231731687303715884105728', + l_vchar varchar(40) default '-170141183460469231731687303715884105728', + l_text text default '-170141183460469231731687303715884105729', + l_date date default '2016-10-18', + l_time time default '21:21:21', + l_times timestamp default '2003-04-12 04:05:06', + l_timez timestamp with time zone default '2003-04-12 04:05:06 pst', + l_oid oid default 12345 +) ; +insert into llvm_enh(l_bool) values(true); +insert into llvm_enh(l_tint) values(0); +insert into llvm_enh(l_sint) values(-32768); +insert into llvm_enh(l_int) values(-2147483648); +insert into llvm_enh(l_bint) values(-9223372036854775808); +insert into llvm_enh(l_num1) values(-999999999999999999); +insert into llvm_enh(l_num2) values(-0.9223372036854775808); +insert into llvm_enh(l_num3) values(-99999999999999999999999999999999999999); +insert into llvm_enh(l_flo1) values(-999999); +insert into llvm_enh(l_flo2) values(1E+308); + +select l_flo2,l_flo1 from llvm_enh where l_flo2 < l_flo1-999998 order by 1,2; + drop table t_float_literals; +drop table llvm_enh; \c regression drop database float_literals; \ No newline at end of file