- add sources.
[platform/framework/web/crosswalk.git] / src / third_party / sqlite / src / test / check.test
1 # 2005 November 2
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 CHECK constraints
13 #
14 # $Id: check.test,v 1.13 2009/06/05 17:09:12 drh Exp $
15
16 set testdir [file dirname $argv0]
17 source $testdir/tester.tcl
18
19 # Only run these tests if the build includes support for CHECK constraints
20 ifcapable !check {
21   finish_test
22   return
23 }
24
25 do_test check-1.1 {
26   execsql {
27     CREATE TABLE t1(
28       x INTEGER CHECK( x<5 ),
29       y REAL CHECK( y>x )
30     );
31   }
32 } {}
33 do_test check-1.2 {
34   execsql {
35     INSERT INTO t1 VALUES(3,4);
36     SELECT * FROM t1;
37   }  
38 } {3 4.0}
39 do_test check-1.3 {
40   catchsql {
41     INSERT INTO t1 VALUES(6,7);
42   }
43 } {1 {constraint failed}}
44 do_test check-1.4 {
45   execsql {
46     SELECT * FROM t1;
47   }  
48 } {3 4.0}
49 do_test check-1.5 {
50   catchsql {
51     INSERT INTO t1 VALUES(4,3);
52   }
53 } {1 {constraint failed}}
54 do_test check-1.6 {
55   execsql {
56     SELECT * FROM t1;
57   }  
58 } {3 4.0}
59 do_test check-1.7 {
60   catchsql {
61     INSERT INTO t1 VALUES(NULL,6);
62   }
63 } {0 {}}
64 do_test check-1.8 {
65   execsql {
66     SELECT * FROM t1;
67   }  
68 } {3 4.0 {} 6.0}
69 do_test check-1.9 {
70   catchsql {
71     INSERT INTO t1 VALUES(2,NULL);
72   }
73 } {0 {}}
74 do_test check-1.10 {
75   execsql {
76     SELECT * FROM t1;
77   }  
78 } {3 4.0 {} 6.0 2 {}}
79 do_test check-1.11 {
80   execsql {
81     DELETE FROM t1 WHERE x IS NULL OR x!=3;
82     UPDATE t1 SET x=2 WHERE x==3;
83     SELECT * FROM t1;
84   }
85 } {2 4.0}
86 do_test check-1.12 {
87   catchsql {
88     UPDATE t1 SET x=7 WHERE x==2
89   }
90 } {1 {constraint failed}}
91 do_test check-1.13 {
92   execsql {
93     SELECT * FROM t1;
94   }
95 } {2 4.0}
96 do_test check-1.14 {
97   catchsql {
98     UPDATE t1 SET x=5 WHERE x==2
99   }
100 } {1 {constraint failed}}
101 do_test check-1.15 {
102   execsql {
103     SELECT * FROM t1;
104   }
105 } {2 4.0}
106 do_test check-1.16 {
107   catchsql {
108     UPDATE t1 SET x=4, y=11 WHERE x==2
109   }
110 } {0 {}}
111 do_test check-1.17 {
112   execsql {
113     SELECT * FROM t1;
114   }
115 } {4 11.0}
116
117 do_test check-2.1 {
118   execsql {
119     CREATE TABLE t2(
120       x INTEGER CHECK( typeof(coalesce(x,0))=="integer" ),
121       y REAL CHECK( typeof(coalesce(y,0.1))=='real' ),
122       z TEXT CHECK( typeof(coalesce(z,''))=='text' )
123     );
124   }
125 } {}
126 do_test check-2.2 {
127   execsql {
128     INSERT INTO t2 VALUES(1,2.2,'three');
129     SELECT * FROM t2;
130   }
131 } {1 2.2 three}
132 db close
133 sqlite3 db test.db
134 do_test check-2.3 {
135   execsql {
136     INSERT INTO t2 VALUES(NULL, NULL, NULL);
137     SELECT * FROM t2;
138   }
139 } {1 2.2 three {} {} {}}
140 do_test check-2.4 {
141   catchsql {
142     INSERT INTO t2 VALUES(1.1, NULL, NULL);
143   }
144 } {1 {constraint failed}}
145 do_test check-2.5 {
146   catchsql {
147     INSERT INTO t2 VALUES(NULL, 5, NULL);
148   }
149 } {1 {constraint failed}}
150 do_test check-2.6 {
151   catchsql {
152     INSERT INTO t2 VALUES(NULL, NULL, 3.14159);
153   }
154 } {1 {constraint failed}}
155
156 ifcapable subquery {
157   do_test check-3.1 {
158     catchsql {
159       CREATE TABLE t3(
160         x, y, z,
161         CHECK( x<(SELECT min(x) FROM t1) )
162       );
163     }
164   } {1 {subqueries prohibited in CHECK constraints}}
165 }
166
167 do_test check-3.2 {
168   execsql {
169     SELECT name FROM sqlite_master ORDER BY name
170   }
171 } {t1 t2}
172 do_test check-3.3 {
173   catchsql {
174     CREATE TABLE t3(
175       x, y, z,
176       CHECK( q<x )
177     );
178   }
179 } {1 {no such column: q}}
180 do_test check-3.4 {
181   execsql {
182     SELECT name FROM sqlite_master ORDER BY name
183   }
184 } {t1 t2}
185 do_test check-3.5 {
186   catchsql {
187     CREATE TABLE t3(
188       x, y, z,
189       CHECK( t2.x<x )
190     );
191   }
192 } {1 {no such column: t2.x}}
193 do_test check-3.6 {
194   execsql {
195     SELECT name FROM sqlite_master ORDER BY name
196   }
197 } {t1 t2}
198 do_test check-3.7 {
199   catchsql {
200     CREATE TABLE t3(
201       x, y, z,
202       CHECK( t3.x<25 )
203     );
204   }
205 } {0 {}}
206 do_test check-3.8 {
207   execsql {
208     INSERT INTO t3 VALUES(1,2,3);
209     SELECT * FROM t3;
210   }
211 } {1 2 3}
212 do_test check-3.9 {
213   catchsql {
214     INSERT INTO t3 VALUES(111,222,333);
215   }
216 } {1 {constraint failed}}
217
218 do_test check-4.1 {
219   execsql {
220     CREATE TABLE t4(x, y,
221       CHECK (
222            x+y==11
223         OR x*y==12
224         OR x/y BETWEEN 5 AND 8
225         OR -x==y+10
226       )
227     );
228   }
229 } {}
230 do_test check-4.2 {
231   execsql {
232     INSERT INTO t4 VALUES(1,10);
233     SELECT * FROM t4
234   }
235 } {1 10}
236 do_test check-4.3 {
237   execsql {
238     UPDATE t4 SET x=4, y=3;
239     SELECT * FROM t4
240   }
241 } {4 3}
242 do_test check-4.4 {
243   execsql {
244     UPDATE t4 SET x=12, y=2;
245     SELECT * FROM t4
246   }
247 } {12 2}
248 do_test check-4.5 {
249   execsql {
250     UPDATE t4 SET x=12, y=-22;
251     SELECT * FROM t4
252   }
253 } {12 -22}
254 do_test check-4.6 {
255   catchsql {
256     UPDATE t4 SET x=0, y=1;
257   }
258 } {1 {constraint failed}}
259 do_test check-4.7 {
260   execsql {
261     SELECT * FROM t4;
262   }
263 } {12 -22}
264 do_test check-4.8 {
265   execsql {
266     PRAGMA ignore_check_constraints=ON;
267     UPDATE t4 SET x=0, y=1;
268     SELECT * FROM t4;
269   }
270 } {0 1}
271 do_test check-4.9 {
272   catchsql {
273     PRAGMA ignore_check_constraints=OFF;
274     UPDATE t4 SET x=0, y=2;
275   }
276 } {1 {constraint failed}}
277 ifcapable vacuum {
278   do_test check_4.10 {
279     catchsql {
280       VACUUM
281     }
282   } {0 {}}
283 }
284
285 do_test check-5.1 {
286   catchsql {
287     CREATE TABLE t5(x, y,
288       CHECK( x*y<:abc )
289     );
290   }
291 } {1 {parameters prohibited in CHECK constraints}}
292 do_test check-5.2 {
293   catchsql {
294     CREATE TABLE t5(x, y,
295       CHECK( x*y<? )
296     );
297   }
298 } {1 {parameters prohibited in CHECK constraints}}
299
300 ifcapable conflict {
301
302 do_test check-6.1 {
303   execsql {SELECT * FROM t1}
304 } {4 11.0}
305 do_test check-6.2 {
306   execsql {
307     UPDATE OR IGNORE t1 SET x=5;
308     SELECT * FROM t1;
309   }
310 } {4 11.0}
311 do_test check-6.3 {
312   execsql {
313     INSERT OR IGNORE INTO t1 VALUES(5,4.0);
314     SELECT * FROM t1;
315   }
316 } {4 11.0}
317 do_test check-6.4 {
318   execsql {
319     INSERT OR IGNORE INTO t1 VALUES(2,20.0);
320     SELECT * FROM t1;
321   }
322 } {4 11.0 2 20.0}
323 do_test check-6.5 {
324   catchsql {
325     UPDATE OR FAIL t1 SET x=7-x, y=y+1;
326   }
327 } {1 {constraint failed}}
328 do_test check-6.6 {
329   execsql {
330     SELECT * FROM t1;
331   }
332 } {3 12.0 2 20.0}
333 do_test check-6.7 {
334   catchsql {
335     BEGIN;
336     INSERT INTO t1 VALUES(1,30.0);
337     INSERT OR ROLLBACK INTO t1 VALUES(8,40.0);
338   }
339 } {1 {constraint failed}}
340 do_test check-6.8 {
341   catchsql {
342     COMMIT;
343   }
344 } {1 {cannot commit - no transaction is active}}
345 do_test check-6.9 {
346   execsql {
347     SELECT * FROM t1
348   }
349 } {3 12.0 2 20.0}
350
351 do_test check-6.11 {
352   execsql {SELECT * FROM t1}
353 } {3 12.0 2 20.0}
354 do_test check-6.12 {
355   catchsql {
356     REPLACE INTO t1 VALUES(6,7);
357   }
358 } {1 {constraint failed}}
359 do_test check-6.13 {
360   execsql {SELECT * FROM t1}
361 } {3 12.0 2 20.0}
362 do_test check-6.14 {
363   catchsql {
364     INSERT OR IGNORE INTO t1 VALUES(6,7);
365   }
366 } {0 {}}
367 do_test check-6.15 {
368   execsql {SELECT * FROM t1}
369 } {3 12.0 2 20.0}
370
371
372 }
373
374 finish_test