Merge branch 'prerelease' of ssh://git.zetetic.net/sqlcipher into prerelease
[sqlcipher.git] / test / normalize.test
blob29a5aabb2623b0cc9eaf9868664f7bbd7bce1360
1 # 2018-01-08
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
12 # Tests for the sqlite3_normalize() extension function.
15 set testdir [file dirname $argv0]
16 source $testdir/tester.tcl
17 set testprefix normalize
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=?;}
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);}
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=?;}
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=?;}
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;}
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(?,?,?);}
56   150
57   {SELECT x'abc'; -- illegal token}
58   {}
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=?;}
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
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]
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}
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]
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}
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}
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}
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=?;}}
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);}}
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=?;}}
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=?;}}
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;}}
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}}
176   350
177   {SELECT x'abc'; -- illegal token}
178   0x2
179   {1 {(1) unrecognized token: "x'abc'"}}
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=?;}}
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(?,?,?);}}
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();}}
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()}}
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(?);}}
207   430
208   {SELECT "a" FROM t1 WHERE "x" IN ("1","2",'3');}
209   0x2
210   {0 {SELECT a FROM t1 WHERE x IN(?,?,?);}}
212   440
213   {SELECT 'a' FROM t1 WHERE 'x';}
214   0x2
215   {0 {SELECT?FROM t1 WHERE?;}}
217   450
218   {SELECT [a] FROM t1 WHERE [x];}
219   0x2
220   {0 {SELECT a FROM t1 WHERE x;}}
222   460
223   {SELECT * FROM t1 WHERE x IN (x);}
224   0x2
225   {0 {SELECT*FROM t1 WHERE x IN(x);}}
227   470
228   {SELECT * FROM t1 WHERE x IN (x,a);}
229   0x2
230   {0 {SELECT*FROM t1 WHERE x IN(x,a);}}
232   480
233   {SELECT * FROM t1 WHERE x IN ([x],"a");}
234   0x2
235   {0 {SELECT*FROM t1 WHERE x IN(x,a);}}
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());}}
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);}}
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));}}
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;}}
257   570
258   {SELECT * FROM t1 WHERE x IN (1);}
259   0x2
260   {0 {SELECT*FROM t1 WHERE x IN(?,?,?);}}
262   580
263   {SELECT * FROM t1 WHERE x IN (1,2);}
264   0x2
265   {0 {SELECT*FROM t1 WHERE x IN(?,?,?);}}
267   590
268   {SELECT * FROM t1 WHERE x IN (1,2,3);}
269   0x2
270   {0 {SELECT*FROM t1 WHERE x IN(?,?,?);}}
272   600
273   {SELECT * FROM t1 WHERE x IN (1,2,3,4);}
274   0x2
275   {0 {SELECT*FROM t1 WHERE x IN(?,?,?);}}
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);}}
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(?,?,?));}}
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));}}
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)))));}}
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(?,?,?)))));}}
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(?,?,?);}}
311   670
312   {SELECT "col f", [col f] FROM t1;}
313   0x2
314   {0 {SELECT"col f","col f"FROM t1;}}
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";}}
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?);}}
326   700
327   {SELECT rowid, oid, _rowid_ FROM t1;}
328   0x2
329   {0 {SELECT rowid,oid,_rowid_ FROM t1;}}
331   710
332   {SELECT x FROM t1 WHERE x IS NULL;}
333   0x2
334   {0 {SELECT x FROM t1 WHERE x IS NULL;}}
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;}}
341   750
342   {SELECT x FROM t1 WHERE x = NULL;}
343   0x2
344   {0 {SELECT x FROM t1 WHERE x=?;}}
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,?);}}
351   800
352   {ATTACH "normalize800.db" AS somefile;}
353   0x2
354   {0 {ATTACH"normalize800.db"AS somefile;}}
356   810
357   {ATTACH DATABASE "normalize810.db" AS somefile;}
358   0x2
359   {0 {ATTACH DATABASE"normalize810.db"AS somefile;}}
361   900
362   {INSERT INTO t1 (x) VALUES("sl1"), (1), ("sl2"), ('i');}
363   0x2
364   {0 {INSERT INTO t1(x)VALUES(?),(?),(?),(?);}}
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(?,?,?);}}
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(?,?,?);}}
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
394 finish_test