gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/normalize.test (about) 1 # 2018-01-08 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 # 12 # Tests for the sqlite3_normalize() extension function. 13 # 14 15 set testdir [file dirname $argv0] 16 source $testdir/tester.tcl 17 set testprefix normalize 18 19 foreach {tnum sql norm} { 20 100 21 {SELECT * FROM t1 WHERE a IN (1) AND b=51.42} 22 {select*from t1 where a in(?,?,?)and b=?;} 23 24 110 25 {SELECT a, b+15, c FROM t1 WHERE d NOT IN (SELECT x FROM t2);} 26 {select a,b+?,c from t1 where d not in(select x from t2);} 27 28 120 29 { SELECT NULL, b FROM t1 -- comment text 30 WHERE d IN (WITH t(a) AS (VALUES(5)) /* CTE */ 31 SELECT a FROM t) 32 OR e='hello'; 33 } 34 {select?,b from t1 where d in(with t(a)as(values(?))select a from t)or e=?;} 35 36 121 37 {/*Initial comment*/ 38 -- another comment line 39 SELECT NULL /* comment */ , b FROM t1 -- comment text 40 WHERE d IN (WITH t(a) AS (VALUES(5)) /* CTE */ 41 SELECT a FROM t) 42 OR e='hello'; 43 } 44 {select?,b from t1 where d in(with t(a)as(values(?))select a from t)or e=?;} 45 46 130 47 {/* Query containing parameters */ 48 SELECT x,$::abc(15),y,@abc,z,?99,w FROM t1 /* Trailing comment */} 49 {select x,?,y,?,z,?,w from t1;} 50 51 140 52 {/* Long list on the RHS of IN */ 53 SELECT 15 IN (1,2,3,(SELECT * FROM t1),'xyz',x'abcd',22*(x+5),null);} 54 {select?in(?,?,?);} 55 56 150 57 {SELECT x'abc'; -- illegal token} 58 {} 59 60 160 61 {SELECT a,NULL,b FROM t1 WHERE c IS NOT NULL or D is null or e=5} 62 {select a,?,b from t1 where c is not null or d is null or e=?;} 63 64 170 65 {/* IN list exactly 5 bytes long */ 66 SELECT * FROM t1 WHERE x IN (1,2,3);} 67 {select*from t1 where x in(?,?,?);} 68 180 69 { } 70 {} 71 } { 72 do_test $tnum [list sqlite3_normalize $sql] $norm 73 } 74 75 ifcapable normalize { 76 do_test 200 { 77 execsql { 78 CREATE TABLE t1(a,b); 79 } 80 } {} 81 do_test 201 { 82 set STMT [sqlite3_prepare_v3 $DB \ 83 "SELECT a, b FROM t1 WHERE b = ? ORDER BY a;" -1 0 TAIL] 84 85 sqlite3_bind_null $STMT 1 86 } {} 87 do_test 202 { 88 sqlite3_normalized_sql $STMT 89 } {SELECT a,b FROM t1 WHERE b=?ORDER BY a;} 90 do_test 203 { 91 sqlite3_finalize $STMT 92 } {SQLITE_OK} 93 94 do_test 210 { 95 set STMT [sqlite3_prepare_v3 $DB \ 96 "SELECT a, b FROM t1 WHERE b = ? ORDER BY a;" -1 2 TAIL] 97 98 sqlite3_bind_null $STMT 1 99 } {} 100 do_test 211 { 101 sqlite3_normalized_sql $STMT 102 } {SELECT a,b FROM t1 WHERE b=?ORDER BY a;} 103 do_test 212 { 104 sqlite3_finalize $STMT 105 } {SQLITE_OK} 106 107 do_test 220 { 108 set STMT [sqlite3_prepare_v3 $DB \ 109 "SELECT a, b FROM t1 WHERE b = 'a' ORDER BY a;" -1 2 TAIL] 110 } {/^[0-9A-Fa-f]+$/} 111 do_test 221 { 112 sqlite3_normalized_sql $STMT 113 } {SELECT a,b FROM t1 WHERE b=?ORDER BY a;} 114 do_test 222 { 115 sqlite3_finalize $STMT 116 } {SQLITE_OK} 117 118 do_test 297 { 119 execsql { 120 DROP TABLE t1; 121 } 122 } {} 123 do_test 298 { 124 execsql { 125 CREATE TABLE t1(a,b,c,d,e,"col f",w,x,y,z); 126 CREATE TABLE t2(x,"col y"); 127 } 128 } {} 129 do_test 299 { 130 sqlite3_create_function db 131 } {SQLITE_OK} 132 133 foreach {tnum sql flags norm} { 134 300 135 {SELECT * FROM t1 WHERE a IN (1) AND b=51.42} 136 0x2 137 {0 {SELECT*FROM t1 WHERE a IN(?,?,?)AND b=?;}} 138 139 310 140 {SELECT a, b+15, c FROM t1 WHERE d NOT IN (SELECT x FROM t2);} 141 0x2 142 {0 {SELECT a,b+?,c FROM t1 WHERE d NOT IN(SELECT x FROM t2);}} 143 144 320 145 { SELECT NULL, b FROM t1 -- comment text 146 WHERE d IN (WITH t(a) AS (VALUES(5)) /* CTE */ 147 SELECT a FROM t) 148 OR e='hello'; 149 } 150 0x2 151 {0 {SELECT?,b FROM t1 WHERE d IN(WITH t(a)AS(VALUES(?))SELECT a FROM t)OR e=?;}} 152 153 321 154 {/*Initial comment*/ 155 -- another comment line 156 SELECT NULL /* comment */ , b FROM t1 -- comment text 157 WHERE d IN (WITH t(a) AS (VALUES(5)) /* CTE */ 158 SELECT a FROM t) 159 OR e='hello'; 160 } 161 0x2 162 {0 {SELECT?,b FROM t1 WHERE d IN(WITH t(a)AS(VALUES(?))SELECT a FROM t)OR e=?;}} 163 164 330 165 {/* Query containing parameters */ 166 SELECT x,$::abc(15),y,@abc,z,?99,w FROM t1 /* Trailing comment */} 167 0x2 168 {0 {SELECT x,?,y,?,z,?,w FROM t1;}} 169 170 340 171 {/* Long list on the RHS of IN */ 172 SELECT 15 IN (1,2,3,(SELECT * FROM t1),'xyz',x'abcd',22*(x+5),null);} 173 0x2 174 {1 {(1) no such column: x}} 175 176 350 177 {SELECT x'abc'; -- illegal token} 178 0x2 179 {1 {(1) unrecognized token: "x'abc'"}} 180 181 360 182 {SELECT a,NULL,b FROM t1 WHERE c IS NOT NULL or D is null or e=5} 183 0x2 184 {0 {SELECT a,?,b FROM t1 WHERE c IS NOT NULL OR d IS NULL OR e=?;}} 185 186 370 187 {/* IN list exactly 5 bytes long */ 188 SELECT * FROM t1 WHERE x IN (1,2,3);} 189 0x2 190 {0 {SELECT*FROM t1 WHERE x IN(?,?,?);}} 191 192 400 193 {SELECT a FROM t1 WHERE x IN (1,2,3) AND sqlite_version();} 194 0x2 195 {0 {SELECT a FROM t1 WHERE x IN(?,?,?)AND sqlite_version();}} 196 197 410 198 {SELECT a FROM t1 WHERE x IN (1,2,3) AND hex8();} 199 0x2 200 {1 {(1) wrong number of arguments to function hex8()}} 201 202 420 203 {SELECT a FROM t1 WHERE x IN (1,2,3) AND hex8('abc');} 204 0x2 205 {0 {SELECT a FROM t1 WHERE x IN(?,?,?)AND hex8(?);}} 206 207 430 208 {SELECT "a" FROM t1 WHERE "x" IN ("1","2",'3');} 209 0x2 210 {0 {SELECT a FROM t1 WHERE x IN(?,?,?);}} 211 212 440 213 {SELECT 'a' FROM t1 WHERE 'x';} 214 0x2 215 {0 {SELECT?FROM t1 WHERE?;}} 216 217 450 218 {SELECT [a] FROM t1 WHERE [x];} 219 0x2 220 {0 {SELECT a FROM t1 WHERE x;}} 221 222 460 223 {SELECT * FROM t1 WHERE x IN (x);} 224 0x2 225 {0 {SELECT*FROM t1 WHERE x IN(x);}} 226 227 470 228 {SELECT * FROM t1 WHERE x IN (x,a);} 229 0x2 230 {0 {SELECT*FROM t1 WHERE x IN(x,a);}} 231 232 480 233 {SELECT * FROM t1 WHERE x IN ([x],"a");} 234 0x2 235 {0 {SELECT*FROM t1 WHERE x IN(x,a);}} 236 237 500 238 {SELECT * FROM t1 WHERE x IN ([x],"a",'b',sqlite_version());} 239 0x2 240 {0 {SELECT*FROM t1 WHERE x IN(x,a,?,sqlite_version());}} 241 242 520 243 {SELECT * FROM t1 WHERE x IN (SELECT x FROM t1);} 244 0x2 245 {0 {SELECT*FROM t1 WHERE x IN(SELECT x FROM t1);}} 246 247 540 248 {SELECT * FROM t1 WHERE x IN ((SELECT x FROM t1));} 249 0x2 250 {0 {SELECT*FROM t1 WHERE x IN((SELECT x FROM t1));}} 251 252 550 253 {SELECT a, a+1, a||'b', a+"b" FROM t1;} 254 0x2 255 {0 {SELECT a,a+?,a||?,a+b FROM t1;}} 256 257 570 258 {SELECT * FROM t1 WHERE x IN (1);} 259 0x2 260 {0 {SELECT*FROM t1 WHERE x IN(?,?,?);}} 261 262 580 263 {SELECT * FROM t1 WHERE x IN (1,2);} 264 0x2 265 {0 {SELECT*FROM t1 WHERE x IN(?,?,?);}} 266 267 590 268 {SELECT * FROM t1 WHERE x IN (1,2,3);} 269 0x2 270 {0 {SELECT*FROM t1 WHERE x IN(?,?,?);}} 271 272 600 273 {SELECT * FROM t1 WHERE x IN (1,2,3,4);} 274 0x2 275 {0 {SELECT*FROM t1 WHERE x IN(?,?,?);}} 276 277 610 278 {SELECT * FROM t1 WHERE x IN (SELECT x FROM t1);} 279 0x2 280 {0 {SELECT*FROM t1 WHERE x IN(SELECT x FROM t1);}} 281 282 620 283 {SELECT * FROM t1 WHERE x IN (SELECT x FROM t1 WHERE x IN (1,2,3));} 284 0x2 285 {0 {SELECT*FROM t1 WHERE x IN(SELECT x FROM t1 WHERE x IN(?,?,?));}} 286 287 630 288 {SELECT * FROM t1 WHERE x IN (SELECT x FROM t1 WHERE x IN (x));} 289 0x2 290 {0 {SELECT*FROM t1 WHERE x IN(SELECT x FROM t1 WHERE x IN(x));}} 291 292 640 293 {SELECT x FROM t1 WHERE x IN (SELECT x FROM t1 WHERE x IN ( 294 SELECT x FROM t1 WHERE x IN (SELECT x FROM t1 WHERE x IN ( 295 SELECT x FROM t1 WHERE x IN (x)))));} 296 0x2 297 {0 {SELECT x FROM t1 WHERE x IN(SELECT x FROM t1 WHERE x IN(SELECT x FROM t1 WHERE x IN(SELECT x FROM t1 WHERE x IN(SELECT x FROM t1 WHERE x IN(x)))));}} 298 299 650 300 {SELECT x FROM t1 WHERE x IN (SELECT x FROM t1 WHERE x IN ( 301 SELECT x FROM t1 WHERE x IN (SELECT x FROM t1 WHERE x IN ( 302 SELECT x FROM t1 WHERE x IN (1)))));} 303 0x2 304 {0 {SELECT x FROM t1 WHERE x IN(SELECT x FROM t1 WHERE x IN(SELECT x FROM t1 WHERE x IN(SELECT x FROM t1 WHERE x IN(SELECT x FROM t1 WHERE x IN(?,?,?)))));}} 305 306 660 307 {SELECT x FROM t1 WHERE x IN (1) UNION ALL SELECT x FROM t1 WHERE x IN (1);} 308 0x2 309 {0 {SELECT x FROM t1 WHERE x IN(?,?,?)UNION ALL SELECT x FROM t1 WHERE x IN(?,?,?);}} 310 311 670 312 {SELECT "col f", [col f] FROM t1;} 313 0x2 314 {0 {SELECT"col f","col f"FROM t1;}} 315 316 680 317 {SELECT a, "col f" FROM t1 LEFT OUTER JOIN t2 ON [t1].[col f] == [t2].[col y];} 318 0x2 319 {0 {SELECT a,"col f"FROM t1 LEFT OUTER JOIN t2 ON t1."col f"==t2."col y";}} 320 321 690 322 {SELECT * FROM ( WITH x AS ( SELECT * FROM t1 WHERE x IN ( 1)) SELECT 10);} 323 0x2 324 {0 {SELECT*FROM(WITH x AS(SELECT*FROM t1 WHERE x IN(?,?,?))SELECT?);}} 325 326 700 327 {SELECT rowid, oid, _rowid_ FROM t1;} 328 0x2 329 {0 {SELECT rowid,oid,_rowid_ FROM t1;}} 330 331 710 332 {SELECT x FROM t1 WHERE x IS NULL;} 333 0x2 334 {0 {SELECT x FROM t1 WHERE x IS NULL;}} 335 336 740 337 {SELECT x FROM t1 WHERE x IS NOT NULL;} 338 0x2 339 {0 {SELECT x FROM t1 WHERE x IS NOT NULL;}} 340 341 750 342 {SELECT x FROM t1 WHERE x = NULL;} 343 0x2 344 {0 {SELECT x FROM t1 WHERE x=?;}} 345 346 760 347 {SELECT x FROM t1 WHERE x IN ([x] IS NOT NULL, NULL, 1, 'a', "b", x'00');} 348 0x2 349 {0 {SELECT x FROM t1 WHERE x IN(x IS NOT NULL,?,?,?,b,?);}} 350 351 800 352 {ATTACH "normalize800.db" AS somefile;} 353 0x2 354 {0 {ATTACH"normalize800.db"AS somefile;}} 355 356 810 357 {ATTACH DATABASE "normalize810.db" AS somefile;} 358 0x2 359 {0 {ATTACH DATABASE"normalize810.db"AS somefile;}} 360 361 900 362 {INSERT INTO t1 (x) VALUES("sl1"), (1), ("sl2"), ('i');} 363 0x2 364 {0 {INSERT INTO t1(x)VALUES(?),(?),(?),(?);}} 365 366 910 367 {UPDATE t1 SET x = "sl1" WHERE x IN (1, "sl2", 'i');} 368 0x2 369 {0 {UPDATE t1 SET x=?WHERE x IN(?,?,?);}} 370 371 920 372 {UPDATE t1 SET x = "y" WHERE x IN (1, "sl1", 'i');} 373 0x2 374 {0 {UPDATE t1 SET x=y WHERE x IN(?,?,?);}} 375 376 930 377 {DELETE FROM t1 WHERE x IN (1, "sl1", 'i');} 378 0x2 379 {0 {DELETE FROM t1 WHERE x IN(?,?,?);}} 380 } { 381 do_test $tnum { 382 set code [catch { 383 set STMT [sqlite3_prepare_v3 $DB $sql -1 $flags TAIL] 384 sqlite3_normalized_sql $STMT 385 } res] 386 if {[info exists STMT]} { 387 sqlite3_finalize $STMT; unset STMT 388 } 389 list $code $res 390 } $norm 391 } 392 } 393 394 finish_test