Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(246)

Side by Side Diff: third_party/sqlite/src/test/triggerC.test

Issue 949043002: Add //third_party/sqlite to dirs_to_snapshot, remove net_sql.patch (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/sqlite/src/test/triggerA.test ('k') | third_party/sqlite/src/test/triggerD.test » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # 2009 August 24 1 # 2009 August 24
2 # 2 #
3 # The author disclaims copyright to this source code. In place of 3 # The author disclaims copyright to this source code. In place of
4 # a legal notice', here is a blessing: 4 # a legal notice', here is a blessing:
5 # 5 #
6 # May you do good and not evil. 6 # May you do good and not evil.
7 # May you find forgiveness for yourself and forgive others. 7 # May you find forgiveness for yourself and forgive others.
8 # May you share freely, never taking more than you give. 8 # May you share freely, never taking more than you give.
9 # 9 #
10 #*********************************************************************** 10 #***********************************************************************
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE, c, d, e); 150 CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE, c, d, e);
151 CREATE INDEX t1cd ON t1(c,d); 151 CREATE INDEX t1cd ON t1(c,d);
152 CREATE TRIGGER t1r1 AFTER UPDATE ON t1 BEGIN UPDATE cnt SET n=n+1; END; 152 CREATE TRIGGER t1r1 AFTER UPDATE ON t1 BEGIN UPDATE cnt SET n=n+1; END;
153 INSERT INTO t1 VALUES(1,2,3,4,5); 153 INSERT INTO t1 VALUES(1,2,3,4,5);
154 INSERT INTO t1 VALUES(6,7,8,9,10); 154 INSERT INTO t1 VALUES(6,7,8,9,10);
155 INSERT INTO t1 VALUES(11,12,13,14,15); 155 INSERT INTO t1 VALUES(11,12,13,14,15);
156 } 156 }
157 } {} 157 } {}
158 do_test triggerC-1.15 { 158 do_test triggerC-1.15 {
159 catchsql { UPDATE OR ROLLBACK t1 SET a=100 } 159 catchsql { UPDATE OR ROLLBACK t1 SET a=100 }
160 } {1 {PRIMARY KEY must be unique}} 160 } {1 {UNIQUE constraint failed: t1.a}}
161 161
162 162
163 #------------------------------------------------------------------------- 163 #-------------------------------------------------------------------------
164 # This block of tests, triggerC-2.*, tests that recursive trigger 164 # This block of tests, triggerC-2.*, tests that recursive trigger
165 # programs (triggers that fire themselves) work. More specifically, 165 # programs (triggers that fire themselves) work. More specifically,
166 # this block focuses on recursive INSERT triggers. 166 # this block focuses on recursive INSERT triggers.
167 # 167 #
168 do_test triggerC-2.1.0 { 168 do_test triggerC-2.1.0 {
169 execsql { 169 execsql {
170 CREATE TABLE t2(a PRIMARY KEY); 170 CREATE TABLE t2(a PRIMARY KEY);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 INSERT OR IGNORE INTO t2 VALUES(new.a); 215 INSERT OR IGNORE INTO t2 VALUES(new.a);
216 END; 216 END;
217 } {1 {too many levels of trigger recursion}} 217 } {1 {too many levels of trigger recursion}}
218 } { 218 } {
219 do_test triggerC-2.1.$n { 219 do_test triggerC-2.1.$n {
220 catchsql { DROP TRIGGER t2_trig } 220 catchsql { DROP TRIGGER t2_trig }
221 execsql { DELETE FROM t2 } 221 execsql { DELETE FROM t2 }
222 execsql $tdefn 222 execsql $tdefn
223 catchsql { 223 catchsql {
224 INSERT INTO t2 VALUES(10); 224 INSERT INTO t2 VALUES(10);
225 SELECT * FROM t2; 225 SELECT * FROM t2 ORDER BY rowid;
226 } 226 }
227 } $rc 227 } $rc
228 } 228 }
229 229
230 do_test triggerC-2.2 { 230 do_test triggerC-2.2 {
231 execsql { 231 execsql "
232 CREATE TABLE t22(x); 232 CREATE TABLE t22(x);
233 233
234 CREATE TRIGGER t22a AFTER INSERT ON t22 BEGIN 234 CREATE TRIGGER t22a AFTER INSERT ON t22 BEGIN
235 INSERT INTO t22 SELECT x + (SELECT max(x) FROM t22) FROM t22; 235 INSERT INTO t22 SELECT x + (SELECT max(x) FROM t22) FROM t22;
236 END; 236 END;
237 CREATE TRIGGER t22b BEFORE INSERT ON t22 BEGIN 237 CREATE TRIGGER t22b BEFORE INSERT ON t22 BEGIN
238 SELECT CASE WHEN (SELECT count(*) FROM t22) >= 100 238 SELECT CASE WHEN (SELECT count(*) FROM t22) >= [expr $SQLITE_MAX_TRIGGER_D EPTH / 2]
239 THEN RAISE(IGNORE) 239 THEN RAISE(IGNORE)
240 ELSE NULL END; 240 ELSE NULL END;
241 END; 241 END;
242 242
243 INSERT INTO t22 VALUES(1); 243 INSERT INTO t22 VALUES(1);
244 SELECT count(*) FROM t22; 244 SELECT count(*) FROM t22;
245 } 245 "
246 } {100} 246 } [list [expr $SQLITE_MAX_TRIGGER_DEPTH / 2]]
247 247
248 do_test triggerC-2.3 { 248 do_test triggerC-2.3 {
249 execsql { 249 execsql "
250 CREATE TABLE t23(x PRIMARY KEY); 250 CREATE TABLE t23(x PRIMARY KEY);
251 251
252 CREATE TRIGGER t23a AFTER INSERT ON t23 BEGIN 252 CREATE TRIGGER t23a AFTER INSERT ON t23 BEGIN
253 INSERT INTO t23 VALUES(new.x + 1); 253 INSERT INTO t23 VALUES(new.x + 1);
254 END; 254 END;
255 255
256 CREATE TRIGGER t23b BEFORE INSERT ON t23 BEGIN 256 CREATE TRIGGER t23b BEFORE INSERT ON t23 BEGIN
257 SELECT CASE WHEN new.x>500 257 SELECT CASE WHEN new.x>[expr $SQLITE_MAX_TRIGGER_DEPTH / 2]
258 THEN RAISE(IGNORE) 258 THEN RAISE(IGNORE)
259 ELSE NULL END; 259 ELSE NULL END;
260 END; 260 END;
261 261
262 INSERT INTO t23 VALUES(1); 262 INSERT INTO t23 VALUES(1);
263 SELECT count(*) FROM t23; 263 SELECT count(*) FROM t23;
264 } 264 "
265 } {500} 265 } [list [expr $SQLITE_MAX_TRIGGER_DEPTH / 2]]
266 266
267 267
268 #----------------------------------------------------------------------- 268 #-----------------------------------------------------------------------
269 # This block of tests, triggerC-3.*, test that SQLite throws an exception 269 # This block of tests, triggerC-3.*, test that SQLite throws an exception
270 # when it detects excessive recursion. 270 # when it detects excessive recursion.
271 # 271 #
272 do_test triggerC-3.1.1 { 272 do_test triggerC-3.1.1 {
273 execsql { 273 execsql {
274 CREATE TABLE t3(a, b); 274 CREATE TABLE t3(a, b);
275 CREATE TRIGGER t3i AFTER INSERT ON t3 BEGIN 275 CREATE TRIGGER t3i AFTER INSERT ON t3 BEGIN
276 DELETE FROM t3 WHERE rowid = new.rowid; 276 DELETE FROM t3 WHERE rowid = new.rowid;
277 END; 277 END;
278 CREATE TRIGGER t3d AFTER DELETE ON t3 BEGIN 278 CREATE TRIGGER t3d AFTER DELETE ON t3 BEGIN
279 INSERT INTO t3 VALUES(old.a, old.b); 279 INSERT INTO t3 VALUES(old.a, old.b);
280 END; 280 END;
281 } 281 }
282 } {} 282 } {}
283 do_test triggerC-3.1.2 { 283 do_test triggerC-3.1.2 {
284 catchsql { INSERT INTO t3 VALUES(0,0) } 284 catchsql { INSERT INTO t3 VALUES(0,0) }
285 } {1 {too many levels of trigger recursion}} 285 } {1 {too many levels of trigger recursion}}
286 do_test triggerC-3.1.3 { 286 do_test triggerC-3.1.3 {
287 execsql { SELECT * FROM t3 } 287 execsql { SELECT * FROM t3 }
288 } {} 288 } {}
289 289
290 do_test triggerC-3.2.1 { 290 do_test triggerC-3.2.1 {
291 execsql { 291 execsql "
292 CREATE TABLE t3b(x); 292 CREATE TABLE t3b(x);
293 CREATE TRIGGER t3bi AFTER INSERT ON t3b WHEN new.x<2000 BEGIN 293 CREATE TRIGGER t3bi AFTER INSERT ON t3b WHEN new.x<[expr $SQLITE_MAX_TRIGGER _DEPTH * 2] BEGIN
294 INSERT INTO t3b VALUES(new.x+1); 294 INSERT INTO t3b VALUES(new.x+1);
295 END; 295 END;
296 } 296 "
297 catchsql { 297 catchsql {
298 INSERT INTO t3b VALUES(1); 298 INSERT INTO t3b VALUES(1);
299 } 299 }
300 } {1 {too many levels of trigger recursion}} 300 } {1 {too many levels of trigger recursion}}
301 do_test triggerC-3.2.2 { 301 do_test triggerC-3.2.2 {
302 db eval {SELECT * FROM t3b} 302 db eval {SELECT * FROM t3b}
303 } {} 303 } {}
304 304
305 do_test triggerC-3.3.1 { 305 do_test triggerC-3.3.1 {
306 catchsql { 306 catchsql "
307 INSERT INTO t3b VALUES(1001); 307 INSERT INTO t3b VALUES([expr $SQLITE_MAX_TRIGGER_DEPTH + 1]);
308 } 308 "
309 } {0 {}} 309 } {0 {}}
310 do_test triggerC-3.3.2 { 310 do_test triggerC-3.3.2 {
311 db eval {SELECT count(*), max(x), min(x) FROM t3b} 311 db eval {SELECT count(*), max(x), min(x) FROM t3b}
312 } {1000 2000 1001} 312 } [list $SQLITE_MAX_TRIGGER_DEPTH [expr $SQLITE_MAX_TRIGGER_DEPTH * 2] [expr $SQ LITE_MAX_TRIGGER_DEPTH + 1]]
313 313
314 do_test triggerC-3.4.1 { 314 do_test triggerC-3.4.1 {
315 catchsql { 315 catchsql "
316 DELETE FROM t3b; 316 DELETE FROM t3b;
317 INSERT INTO t3b VALUES(999); 317 INSERT INTO t3b VALUES([expr $SQLITE_MAX_TRIGGER_DEPTH - 1]);
318 } 318 "
319 } {1 {too many levels of trigger recursion}} 319 } {1 {too many levels of trigger recursion}}
320 do_test triggerC-3.4.2 { 320 do_test triggerC-3.4.2 {
321 db eval {SELECT count(*), max(x), min(x) FROM t3b} 321 db eval {SELECT count(*), max(x), min(x) FROM t3b}
322 } {0 {} {}} 322 } {0 {} {}}
323 323
324 do_test triggerC-3.5.1 { 324 do_test triggerC-3.5.1 {
325 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 100 325 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH [expr $SQLITE_MAX_TRIGGER_DEPTH / 10]
326 catchsql { 326 catchsql "
327 INSERT INTO t3b VALUES(1901); 327 INSERT INTO t3b VALUES([expr ($SQLITE_MAX_TRIGGER_DEPTH * 2) - ($SQLITE_MAX_ TRIGGER_DEPTH / 10) + 1]);
328 } 328 "
329 } {0 {}} 329 } {0 {}}
330 do_test triggerC-3.5.2 { 330 do_test triggerC-3.5.2 {
331 db eval {SELECT count(*), max(x), min(x) FROM t3b} 331 db eval {SELECT count(*), max(x), min(x) FROM t3b}
332 } {100 2000 1901} 332 } [list [expr $SQLITE_MAX_TRIGGER_DEPTH / 10] [expr $SQLITE_MAX_TRIGGER_DEPTH * 2] [expr ($SQLITE_MAX_TRIGGER_DEPTH * 2) - ($SQLITE_MAX_TRIGGER_DEPTH / 10) + 1] ]
333 333
334 do_test triggerC-3.5.3 { 334 do_test triggerC-3.5.3 {
335 catchsql { 335 catchsql "
336 DELETE FROM t3b; 336 DELETE FROM t3b;
337 INSERT INTO t3b VALUES(1900); 337 INSERT INTO t3b VALUES([expr ($SQLITE_MAX_TRIGGER_DEPTH * 2) - ($SQLITE_MAX_ TRIGGER_DEPTH / 10)]);
338 } 338 "
339 } {1 {too many levels of trigger recursion}} 339 } {1 {too many levels of trigger recursion}}
340 do_test triggerC-3.5.4 { 340 do_test triggerC-3.5.4 {
341 db eval {SELECT count(*), max(x), min(x) FROM t3b} 341 db eval {SELECT count(*), max(x), min(x) FROM t3b}
342 } {0 {} {}} 342 } {0 {} {}}
343 343
344 do_test triggerC-3.6.1 { 344 do_test triggerC-3.6.1 {
345 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 1 345 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 1
346 catchsql { 346 catchsql "
347 INSERT INTO t3b VALUES(2000); 347 INSERT INTO t3b VALUES([expr $SQLITE_MAX_TRIGGER_DEPTH * 2]);
348 } 348 "
349 } {0 {}} 349 } {0 {}}
350 do_test triggerC-3.6.2 { 350 do_test triggerC-3.6.2 {
351 db eval {SELECT count(*), max(x), min(x) FROM t3b} 351 db eval {SELECT count(*), max(x), min(x) FROM t3b}
352 } {1 2000 2000} 352 } [list 1 [expr $SQLITE_MAX_TRIGGER_DEPTH * 2] [expr $SQLITE_MAX_TRIGGER_DEPTH * 2]]
353 353
354 do_test triggerC-3.6.3 { 354 do_test triggerC-3.6.3 {
355 catchsql { 355 catchsql "
356 DELETE FROM t3b; 356 DELETE FROM t3b;
357 INSERT INTO t3b VALUES(1999); 357 INSERT INTO t3b VALUES([expr ($SQLITE_MAX_TRIGGER_DEPTH * 2) - 1]);
358 } 358 "
359 } {1 {too many levels of trigger recursion}} 359 } {1 {too many levels of trigger recursion}}
360 do_test triggerC-3.6.4 { 360 do_test triggerC-3.6.4 {
361 db eval {SELECT count(*), max(x), min(x) FROM t3b} 361 db eval {SELECT count(*), max(x), min(x) FROM t3b}
362 } {0 {} {}} 362 } {0 {} {}}
363 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH 1000 363 sqlite3_limit db SQLITE_LIMIT_TRIGGER_DEPTH $SQLITE_MAX_TRIGGER_DEPTH
364 364
365 365
366 #----------------------------------------------------------------------- 366 #-----------------------------------------------------------------------
367 # This next block of tests, triggerC-4.*, checks that affinity 367 # This next block of tests, triggerC-4.*, checks that affinity
368 # transformations and constraint processing is performed at the correct 368 # transformations and constraint processing is performed at the correct
369 # times relative to BEFORE and AFTER triggers. 369 # times relative to BEFORE and AFTER triggers.
370 # 370 #
371 # For an INSERT statement, for each row to be inserted: 371 # For an INSERT statement, for each row to be inserted:
372 # 372 #
373 # 1. Apply affinities to non-rowid values to be inserted. 373 # 1. Apply affinities to non-rowid values to be inserted.
374 # 2. Fire BEFORE triggers. 374 # 2. Fire BEFORE triggers.
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
540 2 integer 9 text 9 integer 9.0 real 540 2 integer 9 text 9 integer 9.0 real
541 2 integer 9.1 text 9.1 real 9.1 real 541 2 integer 9.1 text 9.1 real 9.1 real
542 2 integer 9 text 9 integer 9.0 real 542 2 integer 9 text 9 integer 9.0 real
543 2 integer 9.1 text 9.1 real 9.1 real 543 2 integer 9.1 text 9.1 real 9.1 real
544 } 544 }
545 } { 545 } {
546 do_test triggerC-4.1.$n { 546 do_test triggerC-4.1.$n {
547 eval concat [execsql " 547 eval concat [execsql "
548 DELETE FROM log; 548 DELETE FROM log;
549 $insert ; 549 $insert ;
550 SELECT * FROM log; 550 SELECT * FROM log ORDER BY rowid;
551 "] 551 "]
552 } [join $log " "] 552 } [join $log " "]
553 } 553 }
554 554
555 #------------------------------------------------------------------------- 555 #-------------------------------------------------------------------------
556 # This block of tests, triggerC-5.*, test that DELETE triggers are fired 556 # This block of tests, triggerC-5.*, test that DELETE triggers are fired
557 # if a row is deleted as a result of OR REPLACE conflict resolution. 557 # if a row is deleted as a result of OR REPLACE conflict resolution.
558 # 558 #
559 do_test triggerC-5.1.0 { 559 do_test triggerC-5.1.0 {
560 execsql { 560 execsql {
(...skipping 16 matching lines...) Expand all
577 3 "UPDATE OR REPLACE t5 SET a = 2 WHERE a = 3" {2 b 3} {1 a 2 c} 577 3 "UPDATE OR REPLACE t5 SET a = 2 WHERE a = 3" {2 b 3} {1 a 2 c}
578 4 "INSERT OR REPLACE INTO t5 VALUES(4, 'b')" {2 b 3} {1 a 3 c 4 b} 578 4 "INSERT OR REPLACE INTO t5 VALUES(4, 'b')" {2 b 3} {1 a 3 c 4 b}
579 5 "UPDATE OR REPLACE t5 SET b = 'b' WHERE b = 'c'" {2 b 3} {1 a 3 b} 579 5 "UPDATE OR REPLACE t5 SET b = 'b' WHERE b = 'c'" {2 b 3} {1 a 3 b}
580 6 "INSERT OR REPLACE INTO t5 VALUES(2, 'c')" {2 b 3 3 c 2} {1 a 2 c} 580 6 "INSERT OR REPLACE INTO t5 VALUES(2, 'c')" {2 b 3 3 c 2} {1 a 2 c}
581 7 "UPDATE OR REPLACE t5 SET a=1, b='b' WHERE a = 3" {1 a 3 2 b 2} {1 b} 581 7 "UPDATE OR REPLACE t5 SET a=1, b='b' WHERE a = 3" {1 a 3 2 b 2} {1 b}
582 } { 582 } {
583 do_test triggerC-5.1.$n { 583 do_test triggerC-5.1.$n {
584 execsql " 584 execsql "
585 BEGIN; 585 BEGIN;
586 $dml ; 586 $dml ;
587 SELECT * FROM t5g; 587 SELECT * FROM t5g ORDER BY rowid;
588 SELECT * FROM t5; 588 SELECT * FROM t5 ORDER BY rowid;
589 ROLLBACK; 589 ROLLBACK;
590 " 590 "
591 } [concat $t5g $t5] 591 } [concat $t5g $t5]
592 } 592 }
593 do_test triggerC-5.2.0 { 593 do_test triggerC-5.2.0 {
594 execsql { 594 execsql {
595 DROP TRIGGER t5t; 595 DROP TRIGGER t5t;
596 CREATE TRIGGER t5t AFTER DELETE ON t5 BEGIN 596 CREATE TRIGGER t5t AFTER DELETE ON t5 BEGIN
597 INSERT INTO t5g VALUES(old.a, old.b, (SELECT count(*) FROM t5)); 597 INSERT INTO t5g VALUES(old.a, old.b, (SELECT count(*) FROM t5));
598 END; 598 END;
599 } 599 }
600 } {} 600 } {}
601 foreach {n dml t5g t5} { 601 foreach {n dml t5g t5} {
602 1 "DELETE FROM t5 WHERE a=2" {2 b 2} {1 a 3 c} 602 1 "DELETE FROM t5 WHERE a=2" {2 b 2} {1 a 3 c}
603 2 "INSERT OR REPLACE INTO t5 VALUES(2, 'd')" {2 b 2} {1 a 2 d 3 c} 603 2 "INSERT OR REPLACE INTO t5 VALUES(2, 'd')" {2 b 2} {1 a 2 d 3 c}
604 3 "UPDATE OR REPLACE t5 SET a = 2 WHERE a = 3" {2 b 2} {1 a 2 c} 604 3 "UPDATE OR REPLACE t5 SET a = 2 WHERE a = 3" {2 b 2} {1 a 2 c}
605 4 "INSERT OR REPLACE INTO t5 VALUES(4, 'b')" {2 b 2} {1 a 3 c 4 b} 605 4 "INSERT OR REPLACE INTO t5 VALUES(4, 'b')" {2 b 2} {1 a 3 c 4 b}
606 5 "UPDATE OR REPLACE t5 SET b = 'b' WHERE b = 'c'" {2 b 2} {1 a 3 b} 606 5 "UPDATE OR REPLACE t5 SET b = 'b' WHERE b = 'c'" {2 b 2} {1 a 3 b}
607 6 "INSERT OR REPLACE INTO t5 VALUES(2, 'c')" {2 b 2 3 c 1} {1 a 2 c} 607 6 "INSERT OR REPLACE INTO t5 VALUES(2, 'c')" {2 b 2 3 c 1} {1 a 2 c}
608 7 "UPDATE OR REPLACE t5 SET a=1, b='b' WHERE a = 3" {1 a 2 2 b 1} {1 b} 608 7 "UPDATE OR REPLACE t5 SET a=1, b='b' WHERE a = 3" {1 a 2 2 b 1} {1 b}
609 } { 609 } {
610 do_test triggerC-5.2.$n { 610 do_test triggerC-5.2.$n {
611 execsql " 611 execsql "
612 BEGIN; 612 BEGIN;
613 $dml ; 613 $dml ;
614 SELECT * FROM t5g; 614 SELECT * FROM t5g ORDER BY rowid;
615 SELECT * FROM t5; 615 SELECT * FROM t5 ORDER BY rowid;
616 ROLLBACK; 616 ROLLBACK;
617 " 617 "
618 } [concat $t5g $t5] 618 } [concat $t5g $t5]
619 } 619 }
620 do_test triggerC-5.3.0 { 620 do_test triggerC-5.3.0 {
621 execsql { PRAGMA recursive_triggers = off } 621 execsql { PRAGMA recursive_triggers = off }
622 } {} 622 } {}
623 foreach {n dml t5g t5} { 623 foreach {n dml t5g t5} {
624 1 "DELETE FROM t5 WHERE a=2" {2 b 2} {1 a 3 c} 624 1 "DELETE FROM t5 WHERE a=2" {2 b 2} {1 a 3 c}
625 2 "INSERT OR REPLACE INTO t5 VALUES(2, 'd')" {} {1 a 2 d 3 c} 625 2 "INSERT OR REPLACE INTO t5 VALUES(2, 'd')" {} {1 a 2 d 3 c}
626 3 "UPDATE OR REPLACE t5 SET a = 2 WHERE a = 3" {} {1 a 2 c} 626 3 "UPDATE OR REPLACE t5 SET a = 2 WHERE a = 3" {} {1 a 2 c}
627 4 "INSERT OR REPLACE INTO t5 VALUES(4, 'b')" {} {1 a 3 c 4 b} 627 4 "INSERT OR REPLACE INTO t5 VALUES(4, 'b')" {} {1 a 3 c 4 b}
628 5 "UPDATE OR REPLACE t5 SET b = 'b' WHERE b = 'c'" {} {1 a 3 b} 628 5 "UPDATE OR REPLACE t5 SET b = 'b' WHERE b = 'c'" {} {1 a 3 b}
629 6 "INSERT OR REPLACE INTO t5 VALUES(2, 'c')" {} {1 a 2 c} 629 6 "INSERT OR REPLACE INTO t5 VALUES(2, 'c')" {} {1 a 2 c}
630 7 "UPDATE OR REPLACE t5 SET a=1, b='b' WHERE a = 3" {} {1 b} 630 7 "UPDATE OR REPLACE t5 SET a=1, b='b' WHERE a = 3" {} {1 b}
631 } { 631 } {
632 do_test triggerC-5.3.$n { 632 do_test triggerC-5.3.$n {
633 execsql " 633 execsql "
634 BEGIN; 634 BEGIN;
635 $dml ; 635 $dml ;
636 SELECT * FROM t5g; 636 SELECT * FROM t5g ORDER BY rowid;
637 SELECT * FROM t5; 637 SELECT * FROM t5 ORDER BY rowid;
638 ROLLBACK; 638 ROLLBACK;
639 " 639 "
640 } [concat $t5g $t5] 640 } [concat $t5g $t5]
641 } 641 }
642 do_test triggerC-5.3.8 { 642 do_test triggerC-5.3.8 {
643 execsql { PRAGMA recursive_triggers = on } 643 execsql { PRAGMA recursive_triggers = on }
644 } {} 644 } {}
645 645
646 #------------------------------------------------------------------------- 646 #-------------------------------------------------------------------------
647 # This block of tests, triggerC-6.*, tests that "PRAGMA recursive_triggers" 647 # This block of tests, triggerC-6.*, tests that "PRAGMA recursive_triggers"
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
911 CREATE TRIGGER tv2 INSTEAD OF INSERT ON v2 BEGIN 911 CREATE TRIGGER tv2 INSTEAD OF INSERT ON v2 BEGIN
912 INSERT INTO log VALUES(new.a, new.b); 912 INSERT INTO log VALUES(new.a, new.b);
913 END; 913 END;
914 INSERT INTO v2 DEFAULT VALUES; 914 INSERT INTO v2 DEFAULT VALUES;
915 SELECT a, b, a IS NULL, b IS NULL FROM log; 915 SELECT a, b, a IS NULL, b IS NULL FROM log;
916 } 916 }
917 } {{} {} 1 1} 917 } {{} {} 1 1}
918 918
919 do_test triggerC-12.1 { 919 do_test triggerC-12.1 {
920 db close 920 db close
921 file delete -force test.db 921 forcedelete test.db
922 sqlite3 db test.db 922 sqlite3 db test.db
923 923
924 execsql { 924 execsql {
925 CREATE TABLE t1(a, b); 925 CREATE TABLE t1(a, b);
926 INSERT INTO t1 VALUES(1, 2); 926 INSERT INTO t1 VALUES(1, 2);
927 INSERT INTO t1 VALUES(3, 4); 927 INSERT INTO t1 VALUES(3, 4);
928 INSERT INTO t1 VALUES(5, 6); 928 INSERT INTO t1 VALUES(5, 6);
929 CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN SELECT 1 ; END ; 929 CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN SELECT 1 ; END ;
930 SELECT count(*) FROM sqlite_master; 930 SELECT count(*) FROM sqlite_master;
931 } 931 }
(...skipping 10 matching lines...) Expand all
942 CREATE TABLE t12(a, b); 942 CREATE TABLE t12(a, b);
943 INSERT INTO t12 VALUES(1, 2); 943 INSERT INTO t12 VALUES(1, 2);
944 CREATE TRIGGER tr12 AFTER UPDATE ON t12 BEGIN 944 CREATE TRIGGER tr12 AFTER UPDATE ON t12 BEGIN
945 UPDATE t12 SET a=new.a+1, b=new.b+1; 945 UPDATE t12 SET a=new.a+1, b=new.b+1;
946 END; 946 END;
947 } {} 947 } {}
948 do_catchsql_test triggerC-13.2 { 948 do_catchsql_test triggerC-13.2 {
949 UPDATE t12 SET a=a+1, b=b+1; 949 UPDATE t12 SET a=a+1, b=b+1;
950 } {1 {too many levels of trigger recursion}} 950 } {1 {too many levels of trigger recursion}}
951 951
952 #-------------------------------------------------------------------------
953 # The following tests seek to verify that constant values (i.e. literals)
954 # are not factored out of loops within trigger programs. SQLite does
955 # not factor constants out of loops within trigger programs as it may only
956 # do so in code generated before the first table or index is opened. And
957 # by the time a trigger program is coded, at least one table or index has
958 # always been opened.
959 #
960 # At one point, due to a bug allowing constant factoring within triggers,
961 # the following SQL would produce the wrong result.
962 #
963 set SQL {
964 CREATE TABLE t1(a, b, c);
965 CREATE INDEX i1 ON t1(a, c);
966 CREATE INDEX i2 ON t1(b, c);
967 INSERT INTO t1 VALUES(1, 2, 3);
952 968
969 CREATE TABLE t2(e, f);
970 CREATE INDEX i3 ON t2(e);
971 INSERT INTO t2 VALUES(1234567, 3);
972
973 CREATE TABLE empty(x);
974 CREATE TABLE not_empty(x);
975 INSERT INTO not_empty VALUES(2);
976
977 CREATE TABLE t4(x);
978 CREATE TABLE t5(g, h, i);
979
980 CREATE TRIGGER trig BEFORE INSERT ON t4 BEGIN
981 INSERT INTO t5 SELECT * FROM t1 WHERE
982 (a IN (SELECT x FROM empty) OR b IN (SELECT x FROM not_empty))
983 AND c IN (SELECT f FROM t2 WHERE e=1234567);
984 END;
985
986 INSERT INTO t4 VALUES(0);
987 SELECT * FROM t5;
988 }
989
990 reset_db
991 do_execsql_test triggerC-14.1 $SQL {1 2 3}
992 reset_db
993 optimization_control db factor-constants 0
994 do_execsql_test triggerC-14.2 $SQL {1 2 3}
953 995
954 finish_test 996 finish_test
OLDNEW
« no previous file with comments | « third_party/sqlite/src/test/triggerA.test ('k') | third_party/sqlite/src/test/triggerD.test » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698