Expand AND/OR regression tests around NULL handling.
Previously there were no tests verifying that NULL handling in AND/OR was correct (i.e. that NULL rather than false is returned if expression doesn't return true). Author: Andres Freund
This commit is contained in:
parent
4f63e85eb1
commit
1e22166e5e
@ -465,6 +465,88 @@ FROM booltbl3 ORDER BY o;
|
|||||||
null | f | t | f | t | t | f
|
null | f | t | f | t | t | f
|
||||||
(3 rows)
|
(3 rows)
|
||||||
|
|
||||||
|
-- Test to make sure short-circuiting and NULL handling is
|
||||||
|
-- correct. Use a table as source to prevent constant simplification
|
||||||
|
-- to interfer.
|
||||||
|
CREATE TABLE booltbl4(isfalse bool, istrue bool, isnul bool);
|
||||||
|
INSERT INTO booltbl4 VALUES (false, true, null);
|
||||||
|
\pset null '(null)'
|
||||||
|
-- AND expression need to return null if there's any nulls and not all
|
||||||
|
-- of the value are true
|
||||||
|
SELECT istrue AND isnul AND istrue FROM booltbl4;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
(null)
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT istrue AND istrue AND isnul FROM booltbl4;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
(null)
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT isnul AND istrue AND istrue FROM booltbl4;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
(null)
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT isfalse AND isnul AND istrue FROM booltbl4;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT istrue AND isfalse AND isnul FROM booltbl4;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT isnul AND istrue AND isfalse FROM booltbl4;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- OR expression need to return null if there's any nulls and none
|
||||||
|
-- of the value is true
|
||||||
|
SELECT isfalse OR isnul OR isfalse FROM booltbl4;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
(null)
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT isfalse OR isfalse OR isnul FROM booltbl4;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
(null)
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT isnul OR isfalse OR isfalse FROM booltbl4;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
(null)
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT isfalse OR isnul OR istrue FROM booltbl4;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT istrue OR isfalse OR isnul FROM booltbl4;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT isnul OR istrue OR isfalse FROM booltbl4;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Clean up
|
-- Clean up
|
||||||
-- Many tables are retained by the regression test, but these do not seem
|
-- Many tables are retained by the regression test, but these do not seem
|
||||||
@ -474,3 +556,4 @@ FROM booltbl3 ORDER BY o;
|
|||||||
DROP TABLE BOOLTBL1;
|
DROP TABLE BOOLTBL1;
|
||||||
DROP TABLE BOOLTBL2;
|
DROP TABLE BOOLTBL2;
|
||||||
DROP TABLE BOOLTBL3;
|
DROP TABLE BOOLTBL3;
|
||||||
|
DROP TABLE BOOLTBL4;
|
||||||
|
@ -219,6 +219,33 @@ SELECT
|
|||||||
b IS NOT UNKNOWN AS isnotunknown
|
b IS NOT UNKNOWN AS isnotunknown
|
||||||
FROM booltbl3 ORDER BY o;
|
FROM booltbl3 ORDER BY o;
|
||||||
|
|
||||||
|
|
||||||
|
-- Test to make sure short-circuiting and NULL handling is
|
||||||
|
-- correct. Use a table as source to prevent constant simplification
|
||||||
|
-- to interfer.
|
||||||
|
CREATE TABLE booltbl4(isfalse bool, istrue bool, isnul bool);
|
||||||
|
INSERT INTO booltbl4 VALUES (false, true, null);
|
||||||
|
\pset null '(null)'
|
||||||
|
|
||||||
|
-- AND expression need to return null if there's any nulls and not all
|
||||||
|
-- of the value are true
|
||||||
|
SELECT istrue AND isnul AND istrue FROM booltbl4;
|
||||||
|
SELECT istrue AND istrue AND isnul FROM booltbl4;
|
||||||
|
SELECT isnul AND istrue AND istrue FROM booltbl4;
|
||||||
|
SELECT isfalse AND isnul AND istrue FROM booltbl4;
|
||||||
|
SELECT istrue AND isfalse AND isnul FROM booltbl4;
|
||||||
|
SELECT isnul AND istrue AND isfalse FROM booltbl4;
|
||||||
|
|
||||||
|
-- OR expression need to return null if there's any nulls and none
|
||||||
|
-- of the value is true
|
||||||
|
SELECT isfalse OR isnul OR isfalse FROM booltbl4;
|
||||||
|
SELECT isfalse OR isfalse OR isnul FROM booltbl4;
|
||||||
|
SELECT isnul OR isfalse OR isfalse FROM booltbl4;
|
||||||
|
SELECT isfalse OR isnul OR istrue FROM booltbl4;
|
||||||
|
SELECT istrue OR isfalse OR isnul FROM booltbl4;
|
||||||
|
SELECT isnul OR istrue OR isfalse FROM booltbl4;
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Clean up
|
-- Clean up
|
||||||
-- Many tables are retained by the regression test, but these do not seem
|
-- Many tables are retained by the regression test, but these do not seem
|
||||||
@ -231,3 +258,5 @@ DROP TABLE BOOLTBL1;
|
|||||||
DROP TABLE BOOLTBL2;
|
DROP TABLE BOOLTBL2;
|
||||||
|
|
||||||
DROP TABLE BOOLTBL3;
|
DROP TABLE BOOLTBL3;
|
||||||
|
|
||||||
|
DROP TABLE BOOLTBL4;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user