From: drh Date: Sat, 13 Jun 2015 19:05:44 +0000 (+0000) Subject: Added test cases based on Bruce Momjian's talk on SQL NULLs. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0d86c10db3ee0467bc5315877fe1470b6b29afc0;p=thirdparty%2Fsqlite.git Added test cases based on Bruce Momjian's talk on SQL NULLs. FossilOrigin-Name: 68c168b5e57aebc1ffd79006068aa99e78b59ee0 --- diff --git a/manifest b/manifest index a67f6ab4f3..c4c2ea029c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sIS\sDISTINCT\sFROM\sand\sIS\sNOT\sDISTINCT\sFROM\soperators. -D 2015-06-13T11:48:52.517 +C Added\stest\scases\sbased\son\sBruce\sMomjian's\stalk\son\sSQL\sNULLs. +D 2015-06-13T19:05:44.010 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -787,6 +787,7 @@ F test/mmap1.test 1bfd611b9841eafb44f7d83c0788e146d84a33c9 F test/mmap2.test 9d6dd9ddb4ad2379f29cc78f38ce1e63ed418022 F test/mmap3.test c92273e16eb8d23c1d55c9815b446bb72ef0512e F test/mmapfault.test d4c9eff9cd8c2dc14bc43e71e042f175b0a26fe3 +F test/momjian1.test 81eb75ee46a4385be922b0e6af52d936213cb22e F test/multiplex.test efd015ca0b5b4a57dc9535b8feb1273eebeadb60 F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a F test/multiplex3.test d228f59eac91839a977eac19f21d053f03e4d101 @@ -1286,10 +1287,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P caf8f574e5c64da461c6dfba8a06cf3fb18aaa42 -R 82263371860b048ad46608f49acbed93 -T *branch * is-distinct-from -T *sym-is-distinct-from * -T -sym-trunk * +P 0be4478209fc3544152874fde2750ce86b410221 +R aa34463b472eb51d91292ad6ef6dc49a U drh -Z b6ee23a624f1d839afa2fd36813a2640 +Z e68b43ce2d2a7b57cd7747d8f8290458 diff --git a/manifest.uuid b/manifest.uuid index ecd92a094b..f04f1557eb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0be4478209fc3544152874fde2750ce86b410221 \ No newline at end of file +68c168b5e57aebc1ffd79006068aa99e78b59ee0 \ No newline at end of file diff --git a/test/momjian1.test b/test/momjian1.test new file mode 100644 index 0000000000..d6ea81fb0e --- /dev/null +++ b/test/momjian1.test @@ -0,0 +1,262 @@ +# 2015-06-12 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Test cases derived from Bruce Momjian's talk on NULL handling in SQL. +# http://momjian.us/main/writings/pgsql/nulls.pdf +# +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +db null nil +do_execsql_test momjian1-100 { + SELECT null; +} {nil} + +do_execsql_test momjian1-110 { + CREATE TABLE nulltest (x INTEGER, y INTEGER); + INSERT INTO nulltest VALUES (1,NULL); + SELECT * FROM nulltest; +} {1 nil} + +do_execsql_test momjian1-120 { + INSERT INTO nulltest (x) VALUES (2); + SELECT * FROM nulltest; +} {1 nil 2 nil} + +do_catchsql_test momjian1-130 { + CREATE TABLE nulltest2 (x INTEGER NOT NULL, y INTEGER NOT NULL); + INSERT INTO nulltest2 VALUES (3,NULL ) +} {1 {NOT NULL constraint failed: nulltest2.y}} +do_catchsql_test momjian1-131 { + INSERT INTO nulltest2 (x) VALUES (4); +} {1 {NOT NULL constraint failed: nulltest2.y}} + +do_execsql_test momjian1-140 { + SELECT NULL+1; +} {nil} +do_execsql_test momjian1-141 { + SELECT NULL || 'a'; +} {nil} +do_execsql_test momjian1-142 { + SELECT 'b' || NULL; +} {nil} + +do_execsql_test momjian1-150 { + CREATE TABLE inctest (x INTEGER); + INSERT INTO inctest VALUES (30), (40),(NULL); + SELECT x + 1 FROM inctest; +} {31 41 nil} + +do_execsql_test momjian1-160 { + SELECT NULL = 1; +} {nil} +do_execsql_test momjian1-161 { + SELECT NULL = ''; +} {nil} +do_execsql_test momjian1-162 { + SELECT NULL = NULL; +} {nil} +do_execsql_test momjian1-163 { + SELECT NULL < NULL + 1; +} {nil} + +do_execsql_test momjian1-170 { + SELECT 1 WHERE 1; +} {1} +do_execsql_test momjian1-171 { + SELECT 1 WHERE 0; +} {} +do_execsql_test momjian1-172 { + SELECT 1 WHERE NULL; +} {} + +do_execsql_test momjian1-180 { + SELECT 1 AND NULL; +} {nil} +do_execsql_test momjian1-181 { + SELECT NOT NULL; +} {nil} + +do_execsql_test momjian1-190 { + SELECT * FROM inctest WHERE x >= 0; +} {30 40} +do_execsql_test momjian1-191 { + SELECT * FROM inctest WHERE x < 0; +} {} +do_execsql_test momjian1-192 { + SELECT * FROM inctest WHERE x < 0 OR x >= 0; +} {30 40} + +do_execsql_test momjian1-200 { + SELECT * FROM inctest WHERE x <> 10; +} {30 40} +do_execsql_test momjian1-201 { + SELECT * FROM inctest WHERE x <> 10 OR x = 10; +} {30 40} + +do_execsql_test momjian1-210 { + SELECT 1 <> 2 AND 1 <> 3; +} {1} +do_execsql_test momjian1-211 { + SELECT 1 <> 2 AND 1 <> 3 AND 1 <> NULL; +} {nil} + +do_execsql_test momjian1-220 { + SELECT 'a' IN (SELECT NULL); +} {nil} +do_execsql_test momjian1-221 { + SELECT 'a' NOT IN (SELECT NULL); +} {nil} + +do_execsql_test momjian1-230 { + SELECT 'a' IN (SELECT 'a' UNION ALL SELECT NULL); +} {1} +do_execsql_test momjian1-231 { + SELECT 'a' NOT IN (SELECT 'a' UNION ALL SELECT NULL); +} {0} +do_execsql_test momjian1-232 { + SELECT 'a' IN (SELECT 'b' UNION ALL SELECT NULL); +} {nil} +do_execsql_test momjian1-233 { + SELECT 'a' NOT IN (SELECT 'b' UNION ALL SELECT NULL); +} {nil} + +do_execsql_test momjian1-240 { + SELECT 'a' = 'b' OR 'a' = NULL; +} {nil} +do_execsql_test momjian1-241 { + SELECT 'a' <> 'b' AND 'a' <> NULL; +} {nil} + +do_execsql_test momjian1-250 { + SELECT NULL = NULL; +} {nil} +do_execsql_test momjian1-251 { + SELECT NULL IS NULL; +} {1} +do_execsql_test momjian1-252 { + SELECT NULL IS NOT NULL; +} {0} + +do_execsql_test momjian1-260 { + SELECT * FROM inctest WHERE x IS NULL; +} {nil} +do_execsql_test momjian1-261 { + SELECT * FROM inctest WHERE x IS NOT NULL; +} {30 40} + +do_execsql_test momjian1-270 { + SELECT 2 IS DISTINCT FROM 1; + SELECT 2 IS NOT 1 +} {1 1} +do_execsql_test momjian1-271 { + SELECT NULL IS DISTINCT FROM 1; + SELECT NULL IS NOT 1; +} {1 1} +do_execsql_test momjian1-272 { + SELECT NULL IS DISTINCT FROM NULL; + SELECT NULL IS NOT NULL; +} {0 0} +do_execsql_test momjian1-273 { + SELECT NULL <> 1; +} {nil} + +do_execsql_test momjian1-280 { + -- SELECT * FROM inctest WHERE x IS DISTINCT FROM 30; + SELECT * FROM inctest WHERE x IS NOT 30; +} {40 nil} +do_execsql_test momjian1-281 { + -- SELECT * FROM inctest WHERE x IS NOT DISTINCT FROM 30; + SELECT * FROM inctest WHERE x IS 30; +} {30} + +do_execsql_test momjian1-300 { + CREATE TABLE disttest (x INTEGER, y INTEGER); + INSERT INTO disttest VALUES (1, 1), (2, 3), (NULL, NULL); + SELECT * FROM disttest where x IS NOT DISTINCT FROM y; + SELECT * FROM disttest WHERE x IS y; +} {1 1 nil nil 1 1 nil nil} + +do_execsql_test momjian1-310 { + WITH ordertest AS ( + SELECT NULL + UNION ALL + SELECT 2 + UNION ALL + SELECT 1 + UNION ALL + SELECT NULL + ) + SELECT * FROM ordertest + ORDER BY 1; +} {nil nil 1 2} + +do_execsql_test momjian1-320 { + CREATE TABLE uniqtest (x INTEGER); + CREATE UNIQUE INDEX i_uniqtest ON uniqtest (x); + INSERT INTO uniqtest VALUES (1),(NULL), (NULL); + SELECT * FROM uniqtest; +} {1 nil nil} + +do_execsql_test momjian1-330 { + CREATE TABLE aggtest (x INTEGER); + INSERT INTO aggtest VALUES (7), (8), (NULL); + SELECT COUNT(*), COUNT(x), SUM(x), MIN(x), MAX(x), AVG(x) FROM aggtest; +} {3 2 15 7 8 7.5} +do_execsql_test momjian1-331 { + DELETE FROM aggtest; + SELECT COUNT(*), COUNT(x), SUM(x), MIN(x), MAX(x), AVG(x) FROM aggtest; +} {0 0 nil nil nil nil} + +do_execsql_test momjian1-340 { + DELETE FROM aggtest; + INSERT INTO aggtest VALUES (7), (8), (NULL), (NULL); + SELECT x, COUNT(*), COUNT(x), SUM(x), MIN(x), MAX(x), AVG(x) + FROM aggtest + GROUP BY x ORDER BY x; +} {nil 2 0 nil nil nil nil 7 1 1 7 7 7 7.0 8 1 1 8 8 8 8.0} + +do_execsql_test momjian1-350 { + SELECT COALESCE(NULL, 0); +} {0} +do_execsql_test momjian1-351 { + SELECT COALESCE(NULL, 'I am null.'); +} {{I am null.}} + +do_execsql_test momjian1-352 { + CREATE TABLE nullmaptest(x TEXT); + INSERT INTO nullmaptest VALUES ('f'), ('g'), (NULL); + SELECT x, COALESCE(x, 'n/a') FROM nullmaptest; +} {f f g g nil n/a} +do_execsql_test momjian1-353 { + SELECT 'a' || COALESCE(NULL, '') || 'b'; +} {ab} +do_execsql_test momjian1-354 { + SELECT SUM(x), COALESCE(SUM(x), 0) FROM aggtest; +} {15 15} +do_execsql_test momjian1-355 { + DELETE FROM aggtest; + SELECT SUM(x), COALESCE(SUM(x), 0) FROM aggtest; +} {nil 0} + +do_execsql_test momjian1-360 { + CREATE TABLE emptytest (x INTEGER); + SELECT * from emptytest; +} {} +do_execsql_test momjian1-361 { + SELECT (SELECT * from emptytest); +} {nil} +do_execsql_test momjian1-362 { + SELECT (SELECT * from emptytest) IS NULL; +} {1} + + +finish_test