浮点数字面量溢出为0修改

This commit is contained in:
zhubin79
2024-09-10 16:57:51 +08:00
parent 360596beff
commit 8d029d2edf
5 changed files with 150 additions and 29 deletions

View File

@ -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");
}
}

View File

@ -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;

View File

@ -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 */

View File

@ -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 */

View File

@ -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;