mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
542320c2bd
The previous coding in get_const_expr() tried to avoid quoting integer, float, and numeric literals if at all possible. While that looks nice, it means that dumped expressions might re-parse to something that's semantically equivalent but not the exact same parsetree; for example a FLOAT8 constant would re-parse as a NUMERIC constant with a cast to FLOAT8. Though the result would be the same after constant-folding, this is problematic in certain contexts. In particular, Jeff Davis pointed out that this could cause unexpected failures in ALTER INHERIT operations because of child tables having not-exactly-equivalent CHECK expressions. Therefore, favor correctness over legibility and dump such constants in quotes except in the limited cases where they'll be interpreted as the same type even without any casting. This results in assorted small changes in the regression test outputs, and will affect display of user-defined views and rules similarly. The odds of that causing problems in the field seem non-negligible; given the lack of previous complaints, it seems best not to change this in the back branches.
208 lines
3.2 KiB
Plaintext
208 lines
3.2 KiB
Plaintext
-- numeric check
|
|
CREATE TABLE numerictmp (a numeric);
|
|
\copy numerictmp from 'data/int8.data'
|
|
\copy numerictmp from 'data/numeric.data'
|
|
\copy numerictmp from 'data/float8.data'
|
|
SET enable_seqscan=on;
|
|
SELECT count(*) FROM numerictmp WHERE a < -1890.0;
|
|
count
|
|
-------
|
|
505
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a <= -1890.0;
|
|
count
|
|
-------
|
|
506
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a = -1890.0;
|
|
count
|
|
-------
|
|
1
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a >= -1890.0;
|
|
count
|
|
-------
|
|
597
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a > -1890.0;
|
|
count
|
|
-------
|
|
596
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a < 'NaN' ;
|
|
count
|
|
-------
|
|
1100
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a <= 'NaN' ;
|
|
count
|
|
-------
|
|
1102
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a = 'NaN' ;
|
|
count
|
|
-------
|
|
2
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a >= 'NaN' ;
|
|
count
|
|
-------
|
|
2
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a > 'NaN' ;
|
|
count
|
|
-------
|
|
0
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a < 0 ;
|
|
count
|
|
-------
|
|
523
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a <= 0 ;
|
|
count
|
|
-------
|
|
526
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a = 0 ;
|
|
count
|
|
-------
|
|
3
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a >= 0 ;
|
|
count
|
|
-------
|
|
579
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a > 0 ;
|
|
count
|
|
-------
|
|
576
|
|
(1 row)
|
|
|
|
CREATE INDEX numericidx ON numerictmp USING gist ( a );
|
|
SET enable_seqscan=off;
|
|
SELECT count(*) FROM numerictmp WHERE a < -1890.0;
|
|
count
|
|
-------
|
|
505
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a <= -1890.0;
|
|
count
|
|
-------
|
|
506
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a = -1890.0;
|
|
count
|
|
-------
|
|
1
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a >= -1890.0;
|
|
count
|
|
-------
|
|
597
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a > -1890.0;
|
|
count
|
|
-------
|
|
596
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a < 'NaN' ;
|
|
count
|
|
-------
|
|
1100
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a <= 'NaN' ;
|
|
count
|
|
-------
|
|
1102
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a = 'NaN' ;
|
|
count
|
|
-------
|
|
2
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a >= 'NaN' ;
|
|
count
|
|
-------
|
|
2
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a > 'NaN' ;
|
|
count
|
|
-------
|
|
0
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a < 0 ;
|
|
count
|
|
-------
|
|
523
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a <= 0 ;
|
|
count
|
|
-------
|
|
526
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a = 0 ;
|
|
count
|
|
-------
|
|
3
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a >= 0 ;
|
|
count
|
|
-------
|
|
579
|
|
(1 row)
|
|
|
|
SELECT count(*) FROM numerictmp WHERE a > 0 ;
|
|
count
|
|
-------
|
|
576
|
|
(1 row)
|
|
|
|
-- Test index-only scans
|
|
SET enable_bitmapscan=off;
|
|
EXPLAIN (COSTS OFF)
|
|
SELECT * FROM numerictmp WHERE a BETWEEN 1 AND 300 ORDER BY a;
|
|
QUERY PLAN
|
|
---------------------------------------------------------------------
|
|
Sort
|
|
Sort Key: a
|
|
-> Index Only Scan using numericidx on numerictmp
|
|
Index Cond: ((a >= '1'::numeric) AND (a <= '300'::numeric))
|
|
(4 rows)
|
|
|
|
SELECT * FROM numerictmp WHERE a BETWEEN 1 AND 300 ORDER BY a;
|
|
a
|
|
------------
|
|
204.035430
|
|
207.400532
|
|
(2 rows)
|
|
|