blob: d2867a096ebc588dc63cba3572682e1eae658822 [file] [log] [blame]
drhffe07b22005-11-03 00:41:17 +00001# 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#
drhdda70fe2009-06-05 17:09:11 +000014# $Id: check.test,v 1.13 2009/06/05 17:09:12 drh Exp $
drhffe07b22005-11-03 00:41:17 +000015
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18
19# Only run these tests if the build includes support for CHECK constraints
20ifcapable !check {
21 finish_test
22 return
23}
24
25do_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} {}
33do_test check-1.2 {
34 execsql {
35 INSERT INTO t1 VALUES(3,4);
36 SELECT * FROM t1;
37 }
drh8a512562005-11-14 22:29:05 +000038} {3 4.0}
drhffe07b22005-11-03 00:41:17 +000039do_test check-1.3 {
40 catchsql {
41 INSERT INTO t1 VALUES(6,7);
42 }
43} {1 {constraint failed}}
44do_test check-1.4 {
45 execsql {
46 SELECT * FROM t1;
47 }
drh8a512562005-11-14 22:29:05 +000048} {3 4.0}
drhffe07b22005-11-03 00:41:17 +000049do_test check-1.5 {
50 catchsql {
51 INSERT INTO t1 VALUES(4,3);
52 }
53} {1 {constraint failed}}
54do_test check-1.6 {
55 execsql {
56 SELECT * FROM t1;
57 }
drh8a512562005-11-14 22:29:05 +000058} {3 4.0}
drhffe07b22005-11-03 00:41:17 +000059do_test check-1.7 {
60 catchsql {
61 INSERT INTO t1 VALUES(NULL,6);
62 }
drh6275b882005-11-03 01:22:30 +000063} {0 {}}
drhffe07b22005-11-03 00:41:17 +000064do_test check-1.8 {
65 execsql {
66 SELECT * FROM t1;
67 }
drh8a512562005-11-14 22:29:05 +000068} {3 4.0 {} 6.0}
drhffe07b22005-11-03 00:41:17 +000069do_test check-1.9 {
70 catchsql {
71 INSERT INTO t1 VALUES(2,NULL);
72 }
drh6275b882005-11-03 01:22:30 +000073} {0 {}}
drhffe07b22005-11-03 00:41:17 +000074do_test check-1.10 {
75 execsql {
76 SELECT * FROM t1;
77 }
drh8a512562005-11-14 22:29:05 +000078} {3 4.0 {} 6.0 2 {}}
drhffe07b22005-11-03 00:41:17 +000079do_test check-1.11 {
80 execsql {
drh6275b882005-11-03 01:22:30 +000081 DELETE FROM t1 WHERE x IS NULL OR x!=3;
drhffe07b22005-11-03 00:41:17 +000082 UPDATE t1 SET x=2 WHERE x==3;
83 SELECT * FROM t1;
84 }
drh8a512562005-11-14 22:29:05 +000085} {2 4.0}
drhffe07b22005-11-03 00:41:17 +000086do_test check-1.12 {
87 catchsql {
88 UPDATE t1 SET x=7 WHERE x==2
89 }
90} {1 {constraint failed}}
91do_test check-1.13 {
92 execsql {
93 SELECT * FROM t1;
94 }
drh8a512562005-11-14 22:29:05 +000095} {2 4.0}
drhffe07b22005-11-03 00:41:17 +000096do_test check-1.14 {
97 catchsql {
98 UPDATE t1 SET x=5 WHERE x==2
99 }
100} {1 {constraint failed}}
101do_test check-1.15 {
102 execsql {
103 SELECT * FROM t1;
104 }
drh8a512562005-11-14 22:29:05 +0000105} {2 4.0}
drhffe07b22005-11-03 00:41:17 +0000106do_test check-1.16 {
107 catchsql {
108 UPDATE t1 SET x=4, y=11 WHERE x==2
109 }
110} {0 {}}
111do_test check-1.17 {
112 execsql {
113 SELECT * FROM t1;
114 }
drh8a512562005-11-14 22:29:05 +0000115} {4 11.0}
drhffe07b22005-11-03 00:41:17 +0000116
117do_test check-2.1 {
118 execsql {
119 CREATE TABLE t2(
120 x INTEGER CHECK( typeof(coalesce(x,0))=="integer" ),
drhd9da78a2009-03-24 15:08:09 +0000121 y REAL CHECK( typeof(coalesce(y,0.1))=='real' ),
122 z TEXT CHECK( typeof(coalesce(z,''))=='text' )
drhffe07b22005-11-03 00:41:17 +0000123 );
124 }
125} {}
126do_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}
drhd9da78a2009-03-24 15:08:09 +0000132db close
133sqlite3 db test.db
drhffe07b22005-11-03 00:41:17 +0000134do_test check-2.3 {
135 execsql {
136 INSERT INTO t2 VALUES(NULL, NULL, NULL);
137 SELECT * FROM t2;
138 }
139} {1 2.2 three {} {} {}}
140do_test check-2.4 {
141 catchsql {
142 INSERT INTO t2 VALUES(1.1, NULL, NULL);
143 }
144} {1 {constraint failed}}
145do_test check-2.5 {
146 catchsql {
147 INSERT INTO t2 VALUES(NULL, 5, NULL);
148 }
149} {1 {constraint failed}}
150do_test check-2.6 {
151 catchsql {
152 INSERT INTO t2 VALUES(NULL, NULL, 3.14159);
153 }
154} {1 {constraint failed}}
155
danielk19771576cd92006-01-14 08:02:28 +0000156ifcapable 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
drh06f65412005-11-03 02:03:13 +0000167do_test check-3.2 {
168 execsql {
169 SELECT name FROM sqlite_master ORDER BY name
170 }
171} {t1 t2}
172do_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}}
180do_test check-3.4 {
181 execsql {
182 SELECT name FROM sqlite_master ORDER BY name
183 }
184} {t1 t2}
185do_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}}
193do_test check-3.6 {
194 execsql {
195 SELECT name FROM sqlite_master ORDER BY name
196 }
197} {t1 t2}
198do_test check-3.7 {
199 catchsql {
200 CREATE TABLE t3(
201 x, y, z,
202 CHECK( t3.x<25 )
203 );
204 }
205} {0 {}}
206do_test check-3.8 {
207 execsql {
208 INSERT INTO t3 VALUES(1,2,3);
209 SELECT * FROM t3;
210 }
211} {1 2 3}
212do_test check-3.9 {
213 catchsql {
214 INSERT INTO t3 VALUES(111,222,333);
215 }
216} {1 {constraint failed}}
217
218do_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} {}
230do_test check-4.2 {
231 execsql {
232 INSERT INTO t4 VALUES(1,10);
233 SELECT * FROM t4
234 }
235} {1 10}
236do_test check-4.3 {
237 execsql {
238 UPDATE t4 SET x=4, y=3;
239 SELECT * FROM t4
240 }
241} {4 3}
shanehf33a7a82009-12-31 19:48:29 +0000242do_test check-4.4 {
drh06f65412005-11-03 02:03:13 +0000243 execsql {
244 UPDATE t4 SET x=12, y=2;
245 SELECT * FROM t4
246 }
247} {12 2}
shanehf33a7a82009-12-31 19:48:29 +0000248do_test check-4.5 {
drh06f65412005-11-03 02:03:13 +0000249 execsql {
250 UPDATE t4 SET x=12, y=-22;
251 SELECT * FROM t4
252 }
253} {12 -22}
shanehf33a7a82009-12-31 19:48:29 +0000254do_test check-4.6 {
drh06f65412005-11-03 02:03:13 +0000255 catchsql {
256 UPDATE t4 SET x=0, y=1;
257 }
258} {1 {constraint failed}}
shanehf33a7a82009-12-31 19:48:29 +0000259do_test check-4.7 {
drh06f65412005-11-03 02:03:13 +0000260 execsql {
261 SELECT * FROM t4;
262 }
263} {12 -22}
shanehf33a7a82009-12-31 19:48:29 +0000264do_test check-4.8 {
drh0cd2d4c2005-11-03 02:15:02 +0000265 execsql {
266 PRAGMA ignore_check_constraints=ON;
267 UPDATE t4 SET x=0, y=1;
268 SELECT * FROM t4;
269 }
270} {0 1}
shanehf33a7a82009-12-31 19:48:29 +0000271do_test check-4.9 {
drh0cd2d4c2005-11-03 02:15:02 +0000272 catchsql {
273 PRAGMA ignore_check_constraints=OFF;
274 UPDATE t4 SET x=0, y=2;
275 }
276} {1 {constraint failed}}
danielk19773bdca9c2006-01-17 09:35:01 +0000277ifcapable vacuum {
shanehf33a7a82009-12-31 19:48:29 +0000278 do_test check_4.10 {
danielk19773bdca9c2006-01-17 09:35:01 +0000279 catchsql {
280 VACUUM
281 }
282 } {0 {}}
283}
drh0cd2d4c2005-11-03 02:15:02 +0000284
drh4284fb02005-11-03 12:33:28 +0000285do_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}}
292do_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
danielk19774b2688a2006-06-20 11:01:07 +0000300ifcapable conflict {
301
drhaa01c7e2006-03-15 16:26:10 +0000302do_test check-6.1 {
303 execsql {SELECT * FROM t1}
304} {4 11.0}
305do_test check-6.2 {
306 execsql {
307 UPDATE OR IGNORE t1 SET x=5;
308 SELECT * FROM t1;
309 }
310} {4 11.0}
311do_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}
317do_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}
323do_test check-6.5 {
324 catchsql {
325 UPDATE OR FAIL t1 SET x=7-x, y=y+1;
326 }
327} {1 {constraint failed}}
328do_test check-6.6 {
329 execsql {
330 SELECT * FROM t1;
331 }
332} {3 12.0 2 20.0}
333do_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}}
340do_test check-6.8 {
341 catchsql {
342 COMMIT;
343 }
344} {1 {cannot commit - no transaction is active}}
345do_test check-6.9 {
346 execsql {
347 SELECT * FROM t1
348 }
349} {3 12.0 2 20.0}
350
drh2e06c672007-07-23 19:39:46 +0000351do_test check-6.11 {
352 execsql {SELECT * FROM t1}
353} {3 12.0 2 20.0}
354do_test check-6.12 {
355 catchsql {
356 REPLACE INTO t1 VALUES(6,7);
357 }
358} {1 {constraint failed}}
359do_test check-6.13 {
360 execsql {SELECT * FROM t1}
361} {3 12.0 2 20.0}
362do_test check-6.14 {
363 catchsql {
364 INSERT OR IGNORE INTO t1 VALUES(6,7);
365 }
366} {0 {}}
367do_test check-6.15 {
368 execsql {SELECT * FROM t1}
369} {3 12.0 2 20.0}
370
371
danielk19774b2688a2006-06-20 11:01:07 +0000372}
drh06f65412005-11-03 02:03:13 +0000373
drhffe07b22005-11-03 00:41:17 +0000374finish_test