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 15set testdir [file dirname $argv0] 16source $testdir/tester.tcl 17set testprefix normalize 18 19foreach {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 75ifcapable normalize { 76do_test 200 { 77 execsql { 78 CREATE TABLE t1(a,b); 79 } 80} {} 81do_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} {} 87do_test 202 { 88 sqlite3_normalized_sql $STMT 89} {} 90do_test 203 { 91 sqlite3_finalize $STMT 92} {SQLITE_OK} 93 94do_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} {} 100do_test 211 { 101 sqlite3_normalized_sql $STMT 102} {SELECT a,b FROM t1 WHERE b=?ORDER BY a;} 103do_test 212 { 104 sqlite3_finalize $STMT 105} {SQLITE_OK} 106 107do_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]+$/} 111do_test 221 { 112 sqlite3_normalized_sql $STMT 113} {SELECT a,b FROM t1 WHERE b=?ORDER BY a;} 114do_test 222 { 115 sqlite3_finalize $STMT 116} {SQLITE_OK} 117 118do_test 297 { 119 execsql { 120 DROP TABLE t1; 121 } 122} {} 123do_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} {} 129do_test 299 { 130 sqlite3_create_function db 131} {SQLITE_OK} 132 133foreach {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(?,?,?);}} 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 do_test $tnum { 352 set code [catch { 353 set STMT [sqlite3_prepare_v3 $DB $sql -1 $flags TAIL] 354 sqlite3_normalized_sql $STMT 355 } res] 356 if {[info exists STMT]} { 357 sqlite3_finalize $STMT; unset STMT 358 } 359 list $code $res 360 } $norm 361} 362} 363 364finish_test 365