1# 2018-02-26 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# This file implements regression tests for SQLite library. The 12# focus of this file is testing expressions of the form 13# 14# x IS TRUE 15# x IS FALSE 16# x IS NOT TRUE 17# x IS NOT FALSE 18# 19# Tests are also included for the use of TRUE and FALSE as 20# literal values. 21 22set testdir [file dirname $argv0] 23source $testdir/tester.tcl 24 25do_execsql_test istrue-100 { 26 CREATE TABLE t1(x INTEGER PRIMARY KEY, y BOOLEAN); 27 INSERT INTO t1 VALUES(1, true),(2, false),(3, null); 28 SELECT x FROM t1 WHERE y IS TRUE; 29} {1} 30do_execsql_test istrue-110 { 31 SELECT x FROM t1 WHERE y IS FALSE; 32} {2} 33do_execsql_test istrue-120 { 34 SELECT x FROM t1 WHERE y IS NULL; 35} {3} 36do_execsql_test istrue-130 { 37 SELECT x FROM t1 WHERE y IS NOT TRUE; 38} {2 3} 39do_execsql_test istrue-140 { 40 SELECT x FROM t1 WHERE y IS NOT FALSE; 41} {1 3} 42do_execsql_test istrue-150 { 43 SELECT x FROM t1 WHERE y IS NOT NULL; 44} {1 2} 45unset -nocomplain X 46set X 9 47do_execsql_test istrue-160 { 48 SELECT x FROM t1 WHERE y IS TRUE OR (8==$X) 49} {1} 50do_execsql_test istrue-170 { 51 SELECT x FROM t1 WHERE y IS FALSE OR (8==$X) 52} {2} 53do_execsql_test istrue-180 { 54 SELECT x FROM t1 WHERE y IS NULL OR (8==$X); 55} {3} 56do_execsql_test istrue-190 { 57 SELECT x FROM t1 WHERE y IS NOT TRUE OR (8==$X); 58} {2 3} 59do_execsql_test istrue-200 { 60 SELECT x FROM t1 WHERE y IS NOT FALSE OR (8==$X); 61} {1 3} 62do_execsql_test istrue-210 { 63 SELECT x FROM t1 WHERE y IS NOT NULL OR (8==$X); 64} {1 2} 65 66do_execsql_test istrue-300 { 67 SELECT x, 68 y IS TRUE, y IS FALSE, y is NULL, 69 y IS NOT TRUE, y IS NOT FALSE, y IS NOT NULL, '|' 70 FROM t1 ORDER BY x; 71} {1 1 0 0 0 1 1 | 2 0 1 0 1 0 1 | 3 0 0 1 1 1 0 |} 72 73do_execsql_test istrue-400 { 74 SELECT x FROM t1 WHERE true; 75} {1 2 3} 76do_execsql_test istrue-410 { 77 SELECT x FROM t1 WHERE false; 78} {} 79 80do_execsql_test istrue-500 { 81 CREATE TABLE t2( 82 a INTEGER PRIMARY KEY, 83 b BOOLEAN DEFAULT true, 84 c BOOLEAN DEFAULT(true), 85 d BOOLEAN DEFAULT false, 86 e BOOLEAN DEFAULT(false) 87 ); 88 INSERT INTO t2 DEFAULT VALUES; 89 SELECT * FROM t2; 90} {1 1 1 0 0} 91do_execsql_test istrue-510 { 92 DROP TABLE t2; 93 CREATE TABLE t2( 94 a INTEGER PRIMARY KEY, 95 b BOOLEAN DEFAULT(not true), 96 c BOOLEAN DEFAULT(not false) 97 ); 98 INSERT INTO t2(a) VALUES(99); 99 SELECT * FROM t2; 100} {99 0 1} 101do_execsql_test istrue-520 { 102 DROP TABLE t2; 103 CREATE TABLE t2( 104 a INTEGER PRIMARY KEY, 105 b BOOLEAN CHECK(b IS TRUE), 106 c BOOLEAN CHECK(c IS FALSE), 107 d BOOLEAN CHECK(d IS NOT TRUE), 108 e BOOLEAN CHECK(e IS NOT FALSE) 109 ); 110 INSERT INTO t2 VALUES(1,true,false,null,null); 111 SELECT * FROM t2; 112} {1 1 0 {} {}} 113do_catchsql_test istrue-521 { 114 INSERT INTO t2 VALUES(2,false,false,null,null); 115} {1 {CHECK constraint failed: b IS TRUE}} 116do_catchsql_test istrue-522 { 117 INSERT INTO t2 VALUES(2,true,true,null,null); 118} {1 {CHECK constraint failed: c IS FALSE}} 119do_catchsql_test istrue-523 { 120 INSERT INTO t2 VALUES(2,true,false,true,null); 121} {1 {CHECK constraint failed: d IS NOT TRUE}} 122do_catchsql_test istrue-524 { 123 INSERT INTO t2 VALUES(2,true,false,null,false); 124} {1 {CHECK constraint failed: e IS NOT FALSE}} 125 126foreach {tn val} [list 1 NaN 2 -NaN 3 NaN0 4 -NaN0 5 Inf 6 -Inf] { 127 do_execsql_test istrue-600.$tn.1 { 128 DROP TABLE IF EXISTS t1; 129 CREATE TABLE t1(x); 130 } 131 do_test istrue-600.$tn.2 { 132 set ::STMT [sqlite3_prepare db "INSERT INTO t1 VALUES(?)" -1 TAIL] 133 sqlite3_bind_double $::STMT 1 $val 134 sqlite3_step $::STMT 135 sqlite3_reset $::STMT 136 sqlite3_finalize $::STMT 137 } {SQLITE_OK} 138 do_execsql_test istrue-600.$tn.3 { 139 SELECT x IS TRUE FROM t1; 140 } [expr {$tn in [list 5 6] ? {1} : {0}}] 141 do_execsql_test istrue-600.$tn.4 { 142 SELECT x IS FALSE FROM t1; 143 } {0} 144} 145 146do_execsql_test istrue-700 { 147 CREATE TABLE t7( 148 a INTEGER PRIMARY KEY, 149 b BOOLEAN DEFAULT false, 150 c BOOLEAN DEFAULT true 151 ); 152 INSERT INTO t7(a) VALUES(1); 153 INSERT INTO t7(a,b,c) VALUES(2,true,false); 154 ALTER TABLE t7 ADD COLUMN d BOOLEAN DEFAULT false; 155 ALTER TABLE t7 ADD COLUMN e BOOLEAN DEFAULT true; 156 INSERT INTO t7(a,b,c) VALUES(3,true,false); 157 INSERT INTO t7 VALUES(4,false,true,true,false); 158 SELECT *,'x' FROM t7 ORDER BY a; 159} {1 0 1 0 1 x 2 1 0 0 1 x 3 1 0 0 1 x 4 0 1 1 0 x} 160 161do_execsql_test istrue-710 { 162 SELECT 0.5 IS TRUE COLLATE NOCASE; 163 SELECT 0.5 IS TRUE COLLATE RTRIM; 164 SELECT 0.5 IS TRUE COLLATE BINARY; 165 166 SELECT 0.5 IS TRUE; 167 SELECT 0.5 COLLATE NOCASE IS TRUE; 168 SELECT 0.0 IS FALSE; 169 170 SELECT 0.0 IS FALSE COLLATE NOCASE; 171 SELECT 0.0 IS FALSE COLLATE RTRIM; 172 SELECT 0.0 IS FALSE COLLATE BINARY; 173} {1 1 1 1 1 1 1 1 1} 174 175# 2020-06-12 bug report from Chromium 176# https://bugs.chromium.org/p/chromium/issues/detail?id=1094247 177do_catchsql_test istrue-800 { 178 SELECT 9 IN (false.false); 179} {1 {no such column: false.false}} 180do_execsql_test istrue-810 { 181 CREATE TABLE t8(a INT, true INT, false INT, d INT); 182 INSERT INTO t8(a,true,false,d) VALUES(5,6,7,8),(4,3,2,1),('a','b','c','d'); 183 SELECT * FROM t8 ORDER BY false; 184} {4 3 2 1 5 6 7 8 a b c d} 185do_catchsql_test istrue-820 { 186 SELECT 9 IN (false.false) FROM t8; 187} {1 {no such column: false.false}} 188do_execsql_test istrue-830 { 189 CREATE TABLE false(true INT, false INT, x INT CHECK (5 IN (false.false))); 190} {} 191do_execsql_test istrue-840 { 192 INSERT INTO False VALUES(4,5,6); 193} {} 194do_catchsql_test istrue-841 { 195 INSERT INTO False VALUES(5,6,7); 196} {1 {CHECK constraint failed: 5 IN (false.false)}} 197do_execsql_test istrue-850 { 198 SELECT 9 IN (false.false) FROM false; 199} {0} 200do_execsql_test istrue-851 { 201 SELECT 5 IN (false.false) FROM false; 202} {1} 203 204finish_test 205