gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/rowvalue2.test (about) 1 # 2016 June 17 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 the SELECT statement. 13 # 14 15 set testdir [file dirname $argv0] 16 source $testdir/tester.tcl 17 set ::testprefix rowvalue2 18 19 do_execsql_test 1.0 { 20 CREATE TABLE t1(a, b, c); 21 INSERT INTO t1 VALUES(0, 0, 0); 22 INSERT INTO t1 VALUES(0, 1, 1); 23 INSERT INTO t1 VALUES(1, 0, 2); 24 INSERT INTO t1 VALUES(1, 1, 3); 25 26 CREATE INDEX i1 ON t1(a, b); 27 } 28 29 do_execsql_test 1.1.1 { SELECT c FROM t1 WHERE (a, b) >= (1, 0) } {2 3} 30 do_execsql_test 1.1.2 { SELECT c FROM t1 WHERE (a, b) > (1, 0) } {3} 31 32 #------------------------------------------------------------------------- 33 34 do_execsql_test 2.0.1 { 35 CREATE TABLE t2(a INTEGER, b INTEGER, c INTEGER, d INTEGER); 36 CREATE INDEX i2 ON t2(a, b, c); 37 } 38 do_test 2.0.2 { 39 foreach a {0 1 2 3} { 40 foreach b {0 1 2 3} { 41 foreach c {0 1 2 3} { 42 execsql { INSERT INTO t2 VALUES($a, $b, $c, $c + $b*4 + $a*16); } 43 }}} 44 } {} 45 46 do_execsql_test 2.1 { 47 SELECT d FROM t2 WHERE (a, b) > (2, 2); 48 } [db eval { SELECT d FROM t2 WHERE a>2 OR (a=2 AND b>2) }] 49 50 do_execsql_test 2.2 { 51 SELECT d FROM t2 WHERE (a, b) >= (2, 2); 52 } [db eval { SELECT d FROM t2 WHERE a>2 OR (a=2 AND b>=2) }] 53 54 do_execsql_test 2.3 { 55 SELECT d FROM t2 WHERE a=1 AND (b, c) >= (1, 2); 56 } [db eval { SELECT d FROM t2 WHERE +a=1 AND (b>1 OR (b==1 AND c>=2)) }] 57 58 do_execsql_test 2.4 { 59 SELECT d FROM t2 WHERE a=1 AND (b, c) > (1, 2); 60 } [db eval { SELECT d FROM t2 WHERE +a=1 AND (b>1 OR (b==1 AND c>2)) }] 61 62 #------------------------------------------------------------------------- 63 64 set words { 65 airfare airfield airfields airflow airfoil 66 airfoils airframe airframes airily airing 67 airings airless airlift airlifts airline 68 airliner airlines airlock airlocks airmail 69 airmails airman airmen airplane airplanes 70 71 arraignment arraignments arraigns arrange arranged 72 arrangement arrangements arranger arrangers arranges 73 arranging arrant array arrayed arrays 74 arrears arrest arrested arrester arresters 75 arresting arrestingly arrestor arrestors arrests 76 77 edifices edit edited editing edition 78 editions editor editorial editorially editorials 79 editors edits educable educate educated 80 educates educating education educational educationally 81 educations educator educators eel eelgrass 82 } 83 84 do_test 3.0 { 85 execsql { CREATE TABLE t3(a, b, c, w); } 86 foreach w $words { 87 set a [string range $w 0 2] 88 set b [string range $w 3 5] 89 set c [string range $w 6 end] 90 execsql { INSERT INTO t3 VALUES($a, $b, $c, $w) } 91 } 92 } {} 93 94 95 foreach {tn idx} { 96 IDX1 {} 97 IDX2 { CREATE INDEX i3 ON t3(a, b, c); } 98 IDX3 { CREATE INDEX i3 ON t3(a, b); } 99 IDX4 { CREATE INDEX i3 ON t3(a); } 100 } { 101 execsql { DROP INDEX IF EXISTS i3 } 102 execsql $idx 103 104 foreach w $words { 105 set a [string range $w 0 2] 106 set b [string range $w 3 5] 107 set c [string range $w 6 end] 108 109 foreach op [list > >= < <= == IS] { 110 do_execsql_test 3.1.$tn.$w.$op [subst -novar { 111 SELECT rowid FROM t3 WHERE (a, b, c) [set op] ($a, $b, $c) 112 ORDER BY +rowid 113 }] [db eval [subst -novar { 114 SELECT rowid FROM t3 WHERE w [set op] $w ORDER BY +rowid 115 }]] 116 117 do_execsql_test 3.1.$tn.$w.$op.subselect [subst -novar { 118 SELECT rowid FROM t3 WHERE (a, b, c) [set op] ( 119 SELECT a, b, c FROM t3 WHERE w = $w 120 ) 121 ORDER BY +rowid 122 }] [db eval [subst -novar { 123 SELECT rowid FROM t3 WHERE w [set op] $w ORDER BY +rowid 124 }]] 125 } 126 127 } 128 } 129 130 #------------------------------------------------------------------------- 131 # 132 133 do_execsql_test 4.0 { 134 CREATE TABLE t4(a, b, c); 135 INSERT INTO t4 VALUES(NULL, NULL, NULL); 136 INSERT INTO t4 VALUES(NULL, NULL, 0); 137 INSERT INTO t4 VALUES(NULL, NULL, 1); 138 INSERT INTO t4 VALUES(NULL, 0, NULL); 139 INSERT INTO t4 VALUES(NULL, 0, 0); 140 INSERT INTO t4 VALUES(NULL, 0, 1); 141 INSERT INTO t4 VALUES(NULL, 1, NULL); 142 INSERT INTO t4 VALUES(NULL, 1, 0); 143 INSERT INTO t4 VALUES(NULL, 1, 1); 144 145 INSERT INTO t4 VALUES( 0, NULL, NULL); 146 INSERT INTO t4 VALUES( 0, NULL, 0); 147 INSERT INTO t4 VALUES( 0, NULL, 1); 148 INSERT INTO t4 VALUES( 0, 0, NULL); 149 INSERT INTO t4 VALUES( 0, 0, 0); 150 INSERT INTO t4 VALUES( 0, 0, 1); 151 INSERT INTO t4 VALUES( 0, 1, NULL); 152 INSERT INTO t4 VALUES( 0, 1, 0); 153 INSERT INTO t4 VALUES( 0, 1, 1); 154 155 INSERT INTO t4 VALUES( 1, NULL, NULL); 156 INSERT INTO t4 VALUES( 1, NULL, 0); 157 INSERT INTO t4 VALUES( 1, NULL, 1); 158 INSERT INTO t4 VALUES( 1, 0, NULL); 159 INSERT INTO t4 VALUES( 1, 0, 0); 160 INSERT INTO t4 VALUES( 1, 0, 1); 161 INSERT INTO t4 VALUES( 1, 1, NULL); 162 INSERT INTO t4 VALUES( 1, 1, 0); 163 INSERT INTO t4 VALUES( 1, 1, 1); 164 } 165 166 proc make_expr1 {cList vList op} { 167 return "([join $cList ,]) $op ([join $vList ,])" 168 } 169 170 proc make_expr3 {cList vList op} { 171 set n [llength $cList] 172 173 set aList [list] 174 foreach c [lrange $cList 0 end-1] v [lrange $vList 0 end-1] { 175 lappend aList "$c == $v" 176 } 177 lappend aList "[lindex $cList end] $op [lindex $vList end]" 178 179 return "([join $aList { AND }])" 180 } 181 182 proc make_expr2 {cList vList op} { 183 set ret "" 184 185 switch -- $op { 186 == - IS { 187 set aList [list] 188 foreach c $cList v $vList { lappend aList "($c $op $v)" } 189 set ret [join $aList " AND "] 190 } 191 192 < - > { 193 set oList [list] 194 for {set i 0} {$i < [llength $cList]} {incr i} { 195 lappend oList [make_expr3 [lrange $cList 0 $i] [lrange $vList 0 $i] $op] 196 } 197 set ret [join $oList " OR "] 198 } 199 200 <= - >= { 201 set o2 [string range $op 0 0] 202 set oList [list] 203 for {set i 0} {$i < [llength $cList]-1} {incr i} { 204 lappend oList [make_expr3 [lrange $cList 0 $i] [lrange $vList 0 $i] $o2] 205 } 206 lappend oList [make_expr3 $cList $vList $op] 207 set ret [join $oList " OR "] 208 } 209 210 211 default { 212 error "Unknown op: $op" 213 } 214 } 215 216 set ret 217 } 218 219 foreach {tn idx} { 220 IDX1 {} 221 IDX2 { CREATE INDEX i4 ON t4(a, b, c); } 222 IDX3 { CREATE INDEX i4 ON t4(a, b); } 223 IDX4 { CREATE INDEX i4 ON t4(a); } 224 } { 225 execsql { DROP INDEX IF EXISTS i4 } 226 execsql $idx 227 228 foreach {tn2 vector} { 229 1 {0 0 0} 230 2 {1 1 1} 231 3 {0 0 NULL} 232 4 {0 NULL 0} 233 5 {NULL 0 0} 234 6 {1 1 NULL} 235 7 {1 NULL 1} 236 8 {NULL 1 1} 237 } { 238 foreach op { IS == < <= > >= } { 239 set e1 [make_expr1 {a b c} $vector $op] 240 set e2 [make_expr2 {a b c} $vector $op] 241 242 do_execsql_test 4.$tn.$tn2.$op \ 243 "SELECT rowid FROM t4 WHERE $e2 ORDER BY +rowid" [ 244 db eval "SELECT rowid FROM t4 WHERE $e1 ORDER BY +rowid" 245 ] 246 } 247 } 248 } 249 250 do_execsql_test 5.0 { 251 CREATE TABLE r1(a TEXT, iB TEXT); 252 CREATE TABLE r2(x TEXT, zY INTEGER); 253 CREATE INDEX r1ab ON r1(a, iB); 254 255 INSERT INTO r1 VALUES(35, 35); 256 INSERT INTO r2 VALUES(35, 36); 257 INSERT INTO r2 VALUES(35, 4); 258 INSERT INTO r2 VALUES(35, 35); 259 } {} 260 261 foreach {tn lhs rhs} { 262 1 {x +zY} {a iB} 263 2 {x zY} {a iB} 264 3 {x zY} {a +iB} 265 4 {+x zY} {a iB} 266 5 {x zY} {+a iB} 267 } { 268 foreach op { IS == < <= > >= } { 269 set e1 [make_expr1 $lhs $rhs $op] 270 set e2 [make_expr2 $lhs $rhs $op] 271 do_execsql_test 5.$tn.$op \ 272 "SELECT * FROM r1, r2 WHERE $e2 ORDER BY iB" [db eval \ 273 "SELECT * FROM r1, r2 WHERE $e1 ORDER BY iB" 274 ] 275 } 276 } 277 278 279 finish_test