github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/nulls1.test (about) 1 # 2019 August 10 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. 12 # 13 14 set testdir [file dirname $argv0] 15 source $testdir/tester.tcl 16 set testprefix nulls1 17 18 do_execsql_test 1.0 { 19 DROP TABLE IF EXISTS t3; 20 CREATE TABLE t3(a INTEGER); 21 INSERT INTO t3 VALUES(NULL), (10), (30), (20), (NULL); 22 } {} 23 24 for {set a 0} {$a < 3} {incr a} { 25 foreach {tn limit} { 26 1 "" 27 2 "LIMIT 10" 28 } { 29 do_execsql_test 1.$a.$tn.1 " 30 SELECT a FROM t3 ORDER BY a nULLS FIRST $limit 31 " {{} {} 10 20 30} 32 33 do_execsql_test 1.$a.$tn.2 " 34 SELECT a FROM t3 ORDER BY a nULLS LAST $limit 35 " {10 20 30 {} {}} 36 37 do_execsql_test 1.$a.$tn.3 " 38 SELECT a FROM t3 ORDER BY a DESC nULLS FIRST $limit 39 " {{} {} 30 20 10} 40 41 do_execsql_test 1.$a.$tn.4 " 42 SELECT a FROM t3 ORDER BY a DESC nULLS LAST $limit 43 " {30 20 10 {} {}} 44 } 45 46 switch $a { 47 0 { 48 execsql { CREATE INDEX i1 ON t3(a) } 49 } 50 1 { 51 execsql { DROP INDEX i1 ; CREATE INDEX i1 ON t3(a DESC) } 52 } 53 } 54 } 55 56 #------------------------------------------------------------------------- 57 reset_db 58 do_execsql_test 2.0 { 59 CREATE TABLE t2(a, b, c); 60 CREATE INDEX i2 ON t2(a, b); 61 INSERT INTO t2 VALUES(1, 1, 1); 62 INSERT INTO t2 VALUES(1, NULL, 2); 63 INSERT INTO t2 VALUES(1, NULL, 3); 64 INSERT INTO t2 VALUES(1, 4, 4); 65 } 66 67 do_execsql_test 2.1 { 68 SELECT * FROM t2 WHERE a=1 ORDER BY b NULLS LAST 69 } { 70 1 1 1 1 4 4 1 {} 2 1 {} 3 71 } 72 73 do_execsql_test 2.2 { 74 SELECT * FROM t2 WHERE a=1 ORDER BY b DESC NULLS FIRST 75 } { 76 1 {} 3 77 1 {} 2 78 1 4 4 79 1 1 1 80 } 81 82 #------------------------------------------------------------------------- 83 # 84 reset_db 85 do_execsql_test 3.0 { 86 CREATE TABLE t1(a, b, c, d, UNIQUE (b)); 87 } 88 foreach {tn sql err} { 89 1 { CREATE INDEX i1 ON t1(a ASC NULLS LAST) } LAST 90 2 { CREATE INDEX i1 ON t1(a ASC NULLS FIRST) } FIRST 91 3 { CREATE INDEX i1 ON t1(a, b ASC NULLS LAST) } LAST 92 4 { CREATE INDEX i1 ON t1(a, b ASC NULLS FIRST) } FIRST 93 5 { CREATE INDEX i1 ON t1(a DESC NULLS LAST) } LAST 94 6 { CREATE INDEX i1 ON t1(a DESC NULLS FIRST) } FIRST 95 7 { CREATE INDEX i1 ON t1(a, b DESC NULLS LAST) } LAST 96 8 { CREATE INDEX i1 ON t1(a, b DESC NULLS FIRST) } FIRST 97 9 { CREATE TABLE t2(a, b, PRIMARY KEY(a DESC, b NULLS FIRST)) } FIRST 98 10 { CREATE TABLE t2(a, b, UNIQUE(a DESC NULLS FIRST, b)) } FIRST 99 11 { INSERT INTO t1 VALUES(1, 2, 3, 4) 100 ON CONFLICT (b DESC NULLS LAST) DO UPDATE SET a = a+1 } LAST 101 12 { 102 CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN 103 INSERT INTO t1 VALUES(1, 2, 3, 4) 104 ON CONFLICT (b DESC NULLS FIRST) DO UPDATE SET a = a+1; 105 END 106 } FIRST 107 } { 108 do_catchsql_test 3.1.$tn $sql "1 {unsupported use of NULLS $err}" 109 } 110 111 do_execsql_test 3.2 { 112 CREATE TABLE first(nulls, last); 113 INSERT INTO first(last, nulls) VALUES(100,200), (300,400), (200,300); 114 SELECT * FROM first ORDER BY nulls; 115 } { 116 200 100 117 300 200 118 400 300 119 } 120 121 #------------------------------------------------------------------------- 122 # 123 ifcapable vtab { 124 register_echo_module db 125 do_execsql_test 4.0 { 126 CREATE TABLE tx(a INTEGER PRIMARY KEY, b, c); 127 CREATE INDEX i1 ON tx(b); 128 INSERT INTO tx VALUES(1, 1, 1); 129 INSERT INTO tx VALUES(2, NULL, 2); 130 INSERT INTO tx VALUES(3, 3, 3); 131 INSERT INTO tx VALUES(4, NULL, 4); 132 INSERT INTO tx VALUES(5, 5, 5); 133 CREATE VIRTUAL TABLE te USING echo(tx); 134 } 135 136 do_execsql_test 4.1 { 137 SELECT * FROM tx ORDER BY b NULLS FIRST; 138 } {2 {} 2 4 {} 4 1 1 1 3 3 3 5 5 5} 139 do_execsql_test 4.2 { 140 SELECT * FROM te ORDER BY b NULLS FIRST; 141 } {2 {} 2 4 {} 4 1 1 1 3 3 3 5 5 5} 142 143 do_execsql_test 4.3 { 144 SELECT * FROM tx ORDER BY b NULLS LAST; 145 } {1 1 1 3 3 3 5 5 5 2 {} 2 4 {} 4} 146 do_execsql_test 4.4 { 147 SELECT * FROM te ORDER BY b NULLS LAST; 148 } {1 1 1 3 3 3 5 5 5 2 {} 2 4 {} 4} 149 } 150 151 #------------------------------------------------------------------------- 152 # 153 do_execsql_test 5.0 { 154 CREATE TABLE t4(a, b, c); 155 INSERT INTO t4 VALUES(1, 1, 11); 156 INSERT INTO t4 VALUES(1, 2, 12); 157 INSERT INTO t4 VALUES(1, NULL, 1); 158 159 INSERT INTO t4 VALUES(2, NULL, 1); 160 INSERT INTO t4 VALUES(2, 2, 12); 161 INSERT INTO t4 VALUES(2, 1, 11); 162 163 INSERT INTO t4 VALUES(3, NULL, 1); 164 INSERT INTO t4 VALUES(3, 2, 12); 165 INSERT INTO t4 VALUES(3, NULL, 3); 166 } 167 168 do_execsql_test 5.1 { 169 SELECT * FROM t4 WHERE a IN (1, 2, 3) ORDER BY a, b NULLS LAST 170 } { 171 1 1 11 1 2 12 1 {} 1 172 2 1 11 2 2 12 2 {} 1 173 3 2 12 3 {} 1 3 {} 3 174 } 175 do_execsql_test 5.2 { 176 CREATE INDEX t4ab ON t4(a, b); 177 SELECT * FROM t4 WHERE a IN (1, 2, 3) ORDER BY a, b NULLS LAST 178 } { 179 1 1 11 1 2 12 1 {} 1 180 2 1 11 2 2 12 2 {} 1 181 3 2 12 3 {} 1 3 {} 3 182 } 183 do_eqp_test 5.3 { 184 SELECT * FROM t4 WHERE a IN (1, 2, 3) ORDER BY a, b NULLS LAST 185 } { 186 QUERY PLAN 187 `--SEARCH t4 USING INDEX t4ab (a=?) 188 } 189 190 do_execsql_test 5.4 { 191 SELECT * FROM t4 WHERE a IN (1, 2, 3) ORDER BY a DESC, b DESC NULLS FIRST 192 } { 193 3 {} 3 3 {} 1 3 2 12 194 2 {} 1 2 2 12 2 1 11 195 1 {} 1 1 2 12 1 1 11 196 } 197 do_eqp_test 5.5 { 198 SELECT * FROM t4 WHERE a IN (1, 2, 3) ORDER BY a DESC, b DESC NULLS FIRST 199 } { 200 QUERY PLAN 201 `--SEARCH t4 USING INDEX t4ab (a=?) 202 } 203 204 #------------------------------------------------------------------------- 205 # 206 do_execsql_test 6.0 { 207 CREATE TABLE t5(a, b, c); 208 WITH s(i) AS ( 209 VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<200 210 ) 211 INSERT INTO t5 SELECT i%2, CASE WHEN (i%10)==0 THEN NULL ELSE i END, i FROM s; 212 } 213 214 set res1 [db eval { SELECT a,b FROM t5 WHERE a=1 ORDER BY b NULLS LAST, c }] 215 set res2 [db eval { 216 SELECT a,b FROM t5 WHERE a=1 ORDER BY b DESC NULLS FIRST, c DESC 217 }] 218 219 do_execsql_test 6.1.1 { 220 CREATE INDEX t5ab ON t5(a, b, c); 221 SELECT a,b FROM t5 WHERE a=1 ORDER BY b NULLS LAST, c; 222 } $res1 223 do_eqp_test 6.1.2 { 224 SELECT a,b FROM t5 WHERE a=1 ORDER BY b NULLS LAST, c; 225 } { 226 QUERY PLAN 227 `--SEARCH t5 USING COVERING INDEX t5ab (a=?) 228 } 229 do_execsql_test 6.2.1 { 230 SELECT a,b FROM t5 WHERE a=1 ORDER BY b DESC NULLS FIRST, c DESC 231 } $res2 232 do_eqp_test 6.2.2 { 233 SELECT a,b FROM t5 WHERE a=1 ORDER BY b DESC NULLS FIRST, c DESC 234 } { 235 QUERY PLAN 236 `--SEARCH t5 USING COVERING INDEX t5ab (a=?) 237 } 238 239 #------------------------------------------------------------------------- 240 do_execsql_test 7.0 { 241 CREATE TABLE t71(a, b, c); 242 CREATE INDEX t71abc ON t71(a, b, c); 243 244 SELECT * FROM t71 WHERE a=1 AND b=2 ORDER BY c NULLS LAST; 245 SELECT * FROM t71 WHERE a=1 AND b=2 ORDER BY c DESC NULLS FIRST; 246 247 SELECT * FROM t71 ORDER BY a NULLS LAST; 248 SELECT * FROM t71 ORDER BY a DESC NULLS FIRST; 249 } 250 251 # 2019-12-18 gramfuzz1 find 252 # NULLS LAST not allows on an INTEGER PRIMARY KEY. 253 # 254 do_catchsql_test 8.0 { 255 CREATE TABLE t80(a, b INTEGER, PRIMARY KEY(b NULLS LAST)) WITHOUT ROWID; 256 } {1 {unsupported use of NULLS LAST}} 257 258 #------------------------------------------------------------------------- 259 reset_db 260 do_execsql_test 9.0 { 261 CREATE TABLE v0 (c1, c2, c3); 262 CREATE INDEX v3 ON v0 (c1, c2, c3); 263 } 264 do_execsql_test 9.1 { 265 ANALYZE sqlite_master; 266 INSERT INTO sqlite_stat1 VALUES('v0','v3','648 324 81'); 267 ANALYZE sqlite_master; 268 } 269 270 do_execsql_test 9.2 { 271 INSERT INTO v0 VALUES 272 (1, 10, 'b'), 273 (1, 10, 'd'), 274 (1, 10, NULL), 275 (2, 10, 'a'), 276 (2, 10, NULL), 277 (1, 10, 'c'), 278 (2, 10, 'b'), 279 (1, 10, 'a'), 280 (1, 10, NULL), 281 (2, 10, NULL), 282 (2, 10, 'd'), 283 (2, 10, 'c'); 284 } 285 286 do_execsql_test 9.3 { 287 SELECT c1, c2, ifnull(c3, 'NULL') FROM v0 288 WHERE c2=10 ORDER BY c1, c3 NULLS LAST 289 } { 290 1 10 a 1 10 b 1 10 c 1 10 d 1 10 NULL 1 10 NULL 291 2 10 a 2 10 b 2 10 c 2 10 d 2 10 NULL 2 10 NULL 292 } 293 294 do_eqp_test 9.4 { 295 SELECT c1, c2, ifnull(c3, 'NULL') FROM v0 296 WHERE c2=10 ORDER BY c1, c3 NULLS LAST 297 } {SEARCH v0 USING COVERING INDEX v3 (ANY(c1) AND c2=?)} 298 299 300 # 2020-03-01 ticket e12a0ae526bb51c7 301 # NULLS LAST on a LEFT JOIN 302 # 303 reset_db 304 do_execsql_test 10.10 { 305 CREATE TABLE t1(x); 306 INSERT INTO t1(x) VALUES('X'); 307 CREATE TABLE t2(c, d); 308 CREATE INDEX t2dc ON t2(d, c); 309 SELECT c FROM t1 LEFT JOIN t2 ON d=NULL ORDER BY d, c NULLS LAST; 310 } {{}} 311 do_execsql_test 10.20 { 312 INSERT INTO t2(c,d) VALUES(5,'X'),(6,'Y'),(7,'Z'),(3,'A'),(4,'B'); 313 SELECT c FROM t1 LEFT JOIN t2 ON d=x ORDER BY d, c NULLS LAST; 314 } {5} 315 do_execsql_test 10.30 { 316 UPDATE t2 SET d='X'; 317 UPDATE t2 SET c=NULL WHERE c=6; 318 SELECT c FROM t1 LEFT JOIN t2 ON d=x ORDER BY d NULLS FIRST, c NULLS FIRST; 319 } {{} 3 4 5 7} 320 do_execsql_test 10.40 { 321 SELECT c FROM t1 LEFT JOIN t2 ON d=x ORDER BY d NULLS LAST, c NULLS LAST; 322 } {3 4 5 7 {}} 323 do_execsql_test 10.41 { 324 SELECT c FROM t1 LEFT JOIN t2 ON d=x ORDER BY c NULLS LAST; 325 } {3 4 5 7 {}} 326 do_execsql_test 10.42 { 327 SELECT c FROM t1 LEFT JOIN t2 ON d=x ORDER BY +d NULLS LAST, +c NULLS LAST; 328 } {3 4 5 7 {}} 329 do_execsql_test 10.50 { 330 INSERT INTO t1(x) VALUES(NULL),('Y'); 331 SELECT x, c, d, '|' FROM t1 LEFT JOIN t2 ON d=x 332 ORDER BY d NULLS LAST, c NULLS LAST; 333 } {X 3 X | X 4 X | X 5 X | X 7 X | X {} X | {} {} {} | Y {} {} |} 334 do_execsql_test 10.51 { 335 SELECT x, c, d, '|' FROM t1 LEFT JOIN t2 ON d=x 336 ORDER BY +d NULLS LAST, +c NULLS LAST; 337 } {X 3 X | X 4 X | X 5 X | X 7 X | X {} X | {} {} {} | Y {} {} |} 338 339 340 341 342 343 finish_test