Annotation of embedaddon/sqlite3/test/trigger1.test, revision 1.1
1.1 ! misho 1: # The author disclaims copyright to this source code. In place of
! 2: # a legal notice, here is a blessing:
! 3: #
! 4: # May you do good and not evil.
! 5: # May you find forgiveness for yourself and forgive others.
! 6: # May you share freely, never taking more than you give.
! 7: #
! 8: #***********************************************************************
! 9: #
! 10: # This file tests creating and dropping triggers, and interaction thereof
! 11: # with the database COMMIT/ROLLBACK logic.
! 12: #
! 13: # 1. CREATE and DROP TRIGGER tests
! 14: # trig-1.1: Error if table does not exist
! 15: # trig-1.2: Error if trigger already exists
! 16: # trig-1.3: Created triggers are deleted if the transaction is rolled back
! 17: # trig-1.4: DROP TRIGGER removes trigger
! 18: # trig-1.5: Dropped triggers are restored if the transaction is rolled back
! 19: # trig-1.6: Error if dropped trigger doesn't exist
! 20: # trig-1.7: Dropping the table automatically drops all triggers
! 21: # trig-1.8: A trigger created on a TEMP table is not inserted into sqlite_master
! 22: # trig-1.9: Ensure that we cannot create a trigger on sqlite_master
! 23: # trig-1.10:
! 24: # trig-1.11:
! 25: # trig-1.12: Ensure that INSTEAD OF triggers cannot be created on tables
! 26: # trig-1.13: Ensure that AFTER triggers cannot be created on views
! 27: # trig-1.14: Ensure that BEFORE triggers cannot be created on views
! 28: #
! 29:
! 30: set testdir [file dirname $argv0]
! 31: source $testdir/tester.tcl
! 32: ifcapable {!trigger} {
! 33: finish_test
! 34: return
! 35: }
! 36:
! 37: do_test trigger1-1.1.1 {
! 38: catchsql {
! 39: CREATE TRIGGER trig UPDATE ON no_such_table BEGIN
! 40: SELECT * from sqlite_master;
! 41: END;
! 42: }
! 43: } {1 {no such table: main.no_such_table}}
! 44:
! 45: ifcapable tempdb {
! 46: do_test trigger1-1.1.2 {
! 47: catchsql {
! 48: CREATE TEMP TRIGGER trig UPDATE ON no_such_table BEGIN
! 49: SELECT * from sqlite_master;
! 50: END;
! 51: }
! 52: } {1 {no such table: no_such_table}}
! 53: }
! 54:
! 55: execsql {
! 56: CREATE TABLE t1(a);
! 57: }
! 58: do_test trigger1-1.1.3 {
! 59: catchsql {
! 60: CREATE TRIGGER trig UPDATE ON t1 FOR EACH STATEMENT BEGIN
! 61: SELECT * FROM sqlite_master;
! 62: END;
! 63: }
! 64: } {1 {near "STATEMENT": syntax error}}
! 65: execsql {
! 66: CREATE TRIGGER tr1 INSERT ON t1 BEGIN
! 67: INSERT INTO t1 values(1);
! 68: END;
! 69: }
! 70: do_test trigger1-1.2.0 {
! 71: catchsql {
! 72: CREATE TRIGGER IF NOT EXISTS tr1 DELETE ON t1 BEGIN
! 73: SELECT * FROM sqlite_master;
! 74: END
! 75: }
! 76: } {0 {}}
! 77: do_test trigger1-1.2.1 {
! 78: catchsql {
! 79: CREATE TRIGGER tr1 DELETE ON t1 BEGIN
! 80: SELECT * FROM sqlite_master;
! 81: END
! 82: }
! 83: } {1 {trigger tr1 already exists}}
! 84: do_test trigger1-1.2.2 {
! 85: catchsql {
! 86: CREATE TRIGGER "tr1" DELETE ON t1 BEGIN
! 87: SELECT * FROM sqlite_master;
! 88: END
! 89: }
! 90: } {1 {trigger "tr1" already exists}}
! 91: do_test trigger1-1.2.3 {
! 92: catchsql {
! 93: CREATE TRIGGER [tr1] DELETE ON t1 BEGIN
! 94: SELECT * FROM sqlite_master;
! 95: END
! 96: }
! 97: } {1 {trigger [tr1] already exists}}
! 98:
! 99: do_test trigger1-1.3 {
! 100: catchsql {
! 101: BEGIN;
! 102: CREATE TRIGGER tr2 INSERT ON t1 BEGIN
! 103: SELECT * from sqlite_master; END;
! 104: ROLLBACK;
! 105: CREATE TRIGGER tr2 INSERT ON t1 BEGIN
! 106: SELECT * from sqlite_master; END;
! 107: }
! 108: } {0 {}}
! 109:
! 110: do_test trigger1-1.4 {
! 111: catchsql {
! 112: DROP TRIGGER IF EXISTS tr1;
! 113: CREATE TRIGGER tr1 DELETE ON t1 BEGIN
! 114: SELECT * FROM sqlite_master;
! 115: END
! 116: }
! 117: } {0 {}}
! 118:
! 119: do_test trigger1-1.5 {
! 120: execsql {
! 121: BEGIN;
! 122: DROP TRIGGER tr2;
! 123: ROLLBACK;
! 124: DROP TRIGGER tr2;
! 125: }
! 126: } {}
! 127:
! 128: do_test trigger1-1.6.1 {
! 129: catchsql {
! 130: DROP TRIGGER IF EXISTS biggles;
! 131: }
! 132: } {0 {}}
! 133:
! 134: do_test trigger1-1.6.2 {
! 135: catchsql {
! 136: DROP TRIGGER biggles;
! 137: }
! 138: } {1 {no such trigger: biggles}}
! 139:
! 140: do_test trigger1-1.7 {
! 141: catchsql {
! 142: DROP TABLE t1;
! 143: DROP TRIGGER tr1;
! 144: }
! 145: } {1 {no such trigger: tr1}}
! 146:
! 147: ifcapable tempdb {
! 148: execsql {
! 149: CREATE TEMP TABLE temp_table(a);
! 150: }
! 151: do_test trigger1-1.8 {
! 152: execsql {
! 153: CREATE TRIGGER temp_trig UPDATE ON temp_table BEGIN
! 154: SELECT * from sqlite_master;
! 155: END;
! 156: SELECT count(*) FROM sqlite_master WHERE name = 'temp_trig';
! 157: }
! 158: } {0}
! 159: }
! 160:
! 161: do_test trigger1-1.9 {
! 162: catchsql {
! 163: CREATE TRIGGER tr1 AFTER UPDATE ON sqlite_master BEGIN
! 164: SELECT * FROM sqlite_master;
! 165: END;
! 166: }
! 167: } {1 {cannot create trigger on system table}}
! 168:
! 169: # Check to make sure that a DELETE statement within the body of
! 170: # a trigger does not mess up the DELETE that caused the trigger to
! 171: # run in the first place.
! 172: #
! 173: do_test trigger1-1.10 {
! 174: execsql {
! 175: create table t1(a,b);
! 176: insert into t1 values(1,'a');
! 177: insert into t1 values(2,'b');
! 178: insert into t1 values(3,'c');
! 179: insert into t1 values(4,'d');
! 180: create trigger r1 after delete on t1 for each row begin
! 181: delete from t1 WHERE a=old.a+2;
! 182: end;
! 183: delete from t1 where a=1 OR a=3;
! 184: select * from t1;
! 185: drop table t1;
! 186: }
! 187: } {2 b 4 d}
! 188:
! 189: do_test trigger1-1.11 {
! 190: execsql {
! 191: create table t1(a,b);
! 192: insert into t1 values(1,'a');
! 193: insert into t1 values(2,'b');
! 194: insert into t1 values(3,'c');
! 195: insert into t1 values(4,'d');
! 196: create trigger r1 after update on t1 for each row begin
! 197: delete from t1 WHERE a=old.a+2;
! 198: end;
! 199: update t1 set b='x-' || b where a=1 OR a=3;
! 200: select * from t1;
! 201: drop table t1;
! 202: }
! 203: } {1 x-a 2 b 4 d}
! 204:
! 205: # Ensure that we cannot create INSTEAD OF triggers on tables
! 206: do_test trigger1-1.12 {
! 207: catchsql {
! 208: create table t1(a,b);
! 209: create trigger t1t instead of update on t1 for each row begin
! 210: delete from t1 WHERE a=old.a+2;
! 211: end;
! 212: }
! 213: } {1 {cannot create INSTEAD OF trigger on table: main.t1}}
! 214:
! 215: ifcapable view {
! 216: # Ensure that we cannot create BEFORE triggers on views
! 217: do_test trigger1-1.13 {
! 218: catchsql {
! 219: create view v1 as select * from t1;
! 220: create trigger v1t before update on v1 for each row begin
! 221: delete from t1 WHERE a=old.a+2;
! 222: end;
! 223: }
! 224: } {1 {cannot create BEFORE trigger on view: main.v1}}
! 225: # Ensure that we cannot create AFTER triggers on views
! 226: do_test trigger1-1.14 {
! 227: catchsql {
! 228: drop view v1;
! 229: create view v1 as select * from t1;
! 230: create trigger v1t AFTER update on v1 for each row begin
! 231: delete from t1 WHERE a=old.a+2;
! 232: end;
! 233: }
! 234: } {1 {cannot create AFTER trigger on view: main.v1}}
! 235: } ;# ifcapable view
! 236:
! 237: # Check for memory leaks in the trigger parser
! 238: #
! 239: do_test trigger1-2.1 {
! 240: catchsql {
! 241: CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
! 242: SELECT * FROM; -- Syntax error
! 243: END;
! 244: }
! 245: } {1 {near ";": syntax error}}
! 246: do_test trigger1-2.2 {
! 247: catchsql {
! 248: CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
! 249: SELECT * FROM t1;
! 250: SELECT * FROM; -- Syntax error
! 251: END;
! 252: }
! 253: } {1 {near ";": syntax error}}
! 254:
! 255: # Create a trigger that refers to a table that might not exist.
! 256: #
! 257: ifcapable tempdb {
! 258: do_test trigger1-3.1 {
! 259: execsql {
! 260: CREATE TEMP TABLE t2(x,y);
! 261: }
! 262: catchsql {
! 263: CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
! 264: INSERT INTO t2 VALUES(NEW.a,NEW.b);
! 265: END;
! 266: }
! 267: } {0 {}}
! 268: do_test trigger-3.2 {
! 269: catchsql {
! 270: INSERT INTO t1 VALUES(1,2);
! 271: SELECT * FROM t2;
! 272: }
! 273: } {1 {no such table: main.t2}}
! 274: do_test trigger-3.3 {
! 275: db close
! 276: set rc [catch {sqlite3 db test.db} err]
! 277: if {$rc} {lappend rc $err}
! 278: set rc
! 279: } {0}
! 280: do_test trigger-3.4 {
! 281: catchsql {
! 282: INSERT INTO t1 VALUES(1,2);
! 283: SELECT * FROM t2;
! 284: }
! 285: } {1 {no such table: main.t2}}
! 286: do_test trigger-3.5 {
! 287: catchsql {
! 288: CREATE TEMP TABLE t2(x,y);
! 289: INSERT INTO t1 VALUES(1,2);
! 290: SELECT * FROM t2;
! 291: }
! 292: } {1 {no such table: main.t2}}
! 293: do_test trigger-3.6 {
! 294: catchsql {
! 295: DROP TRIGGER r1;
! 296: CREATE TEMP TRIGGER r1 AFTER INSERT ON t1 BEGIN
! 297: INSERT INTO t2 VALUES(NEW.a,NEW.b);
! 298: END;
! 299: INSERT INTO t1 VALUES(1,2);
! 300: SELECT * FROM t2;
! 301: }
! 302: } {0 {1 2}}
! 303: do_test trigger-3.7 {
! 304: execsql {
! 305: DROP TABLE t2;
! 306: CREATE TABLE t2(x,y);
! 307: SELECT * FROM t2;
! 308: }
! 309: } {}
! 310:
! 311: # There are two versions of trigger-3.8 and trigger-3.9. One that uses
! 312: # compound SELECT statements, and another that does not.
! 313: ifcapable compound {
! 314: do_test trigger1-3.8 {
! 315: execsql {
! 316: INSERT INTO t1 VALUES(3,4);
! 317: SELECT * FROM t1 UNION ALL SELECT * FROM t2;
! 318: }
! 319: } {1 2 3 4 3 4}
! 320: do_test trigger1-3.9 {
! 321: db close
! 322: sqlite3 db test.db
! 323: execsql {
! 324: INSERT INTO t1 VALUES(5,6);
! 325: SELECT * FROM t1 UNION ALL SELECT * FROM t2;
! 326: }
! 327: } {1 2 3 4 5 6 3 4}
! 328: } ;# ifcapable compound
! 329: ifcapable !compound {
! 330: do_test trigger1-3.8 {
! 331: execsql {
! 332: INSERT INTO t1 VALUES(3,4);
! 333: SELECT * FROM t1;
! 334: SELECT * FROM t2;
! 335: }
! 336: } {1 2 3 4 3 4}
! 337: do_test trigger1-3.9 {
! 338: db close
! 339: sqlite3 db test.db
! 340: execsql {
! 341: INSERT INTO t1 VALUES(5,6);
! 342: SELECT * FROM t1;
! 343: SELECT * FROM t2;
! 344: }
! 345: } {1 2 3 4 5 6 3 4}
! 346: } ;# ifcapable !compound
! 347:
! 348: do_test trigger1-4.1 {
! 349: execsql {
! 350: CREATE TEMP TRIGGER r1 BEFORE INSERT ON t1 BEGIN
! 351: INSERT INTO t2 VALUES(NEW.a,NEW.b);
! 352: END;
! 353: INSERT INTO t1 VALUES(7,8);
! 354: SELECT * FROM t2;
! 355: }
! 356: } {3 4 7 8}
! 357: do_test trigger1-4.2 {
! 358: sqlite3 db2 test.db
! 359: execsql {
! 360: INSERT INTO t1 VALUES(9,10);
! 361: } db2;
! 362: db2 close
! 363: execsql {
! 364: SELECT * FROM t2;
! 365: }
! 366: } {3 4 7 8}
! 367: do_test trigger1-4.3 {
! 368: execsql {
! 369: DROP TABLE t1;
! 370: SELECT * FROM t2;
! 371: };
! 372: } {3 4 7 8}
! 373: do_test trigger1-4.4 {
! 374: db close
! 375: sqlite3 db test.db
! 376: execsql {
! 377: SELECT * FROM t2;
! 378: };
! 379: } {3 4 7 8}
! 380: } else {
! 381: execsql {
! 382: CREATE TABLE t2(x,y);
! 383: DROP TABLE t1;
! 384: INSERT INTO t2 VALUES(3, 4);
! 385: INSERT INTO t2 VALUES(7, 8);
! 386: }
! 387: }
! 388:
! 389:
! 390: integrity_check trigger1-5.1
! 391:
! 392: # Create a trigger with the same name as a table. Make sure the
! 393: # trigger works. Then drop the trigger. Make sure the table is
! 394: # still there.
! 395: #
! 396: set view_v1 {}
! 397: ifcapable view {
! 398: set view_v1 {view v1}
! 399: }
! 400: do_test trigger1-6.1 {
! 401: execsql {SELECT type, name FROM sqlite_master}
! 402: } [concat $view_v1 {table t2}]
! 403: do_test trigger1-6.2 {
! 404: execsql {
! 405: CREATE TRIGGER t2 BEFORE DELETE ON t2 BEGIN
! 406: SELECT RAISE(ABORT,'deletes are not permitted');
! 407: END;
! 408: SELECT type, name FROM sqlite_master;
! 409: }
! 410: } [concat $view_v1 {table t2 trigger t2}]
! 411: do_test trigger1-6.3 {
! 412: catchsql {DELETE FROM t2}
! 413: } {1 {deletes are not permitted}}
! 414: do_test trigger1-6.4 {
! 415: execsql {SELECT * FROM t2}
! 416: } {3 4 7 8}
! 417: do_test trigger1-6.5 {
! 418: db close
! 419: sqlite3 db test.db
! 420: execsql {SELECT type, name FROM sqlite_master}
! 421: } [concat $view_v1 {table t2 trigger t2}]
! 422: do_test trigger1-6.6 {
! 423: execsql {
! 424: DROP TRIGGER t2;
! 425: SELECT type, name FROM sqlite_master;
! 426: }
! 427: } [concat $view_v1 {table t2}]
! 428: do_test trigger1-6.7 {
! 429: execsql {SELECT * FROM t2}
! 430: } {3 4 7 8}
! 431: do_test trigger1-6.8 {
! 432: db close
! 433: sqlite3 db test.db
! 434: execsql {SELECT * FROM t2}
! 435: } {3 4 7 8}
! 436:
! 437: integrity_check trigger-7.1
! 438:
! 439: # Check to make sure the name of a trigger can be quoted so that keywords
! 440: # can be used as trigger names. Ticket #468
! 441: #
! 442: do_test trigger1-8.1 {
! 443: execsql {
! 444: CREATE TRIGGER 'trigger' AFTER INSERT ON t2 BEGIN SELECT 1; END;
! 445: SELECT name FROM sqlite_master WHERE type='trigger';
! 446: }
! 447: } {trigger}
! 448: do_test trigger1-8.2 {
! 449: execsql {
! 450: DROP TRIGGER 'trigger';
! 451: SELECT name FROM sqlite_master WHERE type='trigger';
! 452: }
! 453: } {}
! 454: do_test trigger1-8.3 {
! 455: execsql {
! 456: CREATE TRIGGER "trigger" AFTER INSERT ON t2 BEGIN SELECT 1; END;
! 457: SELECT name FROM sqlite_master WHERE type='trigger';
! 458: }
! 459: } {trigger}
! 460: do_test trigger1-8.4 {
! 461: execsql {
! 462: DROP TRIGGER "trigger";
! 463: SELECT name FROM sqlite_master WHERE type='trigger';
! 464: }
! 465: } {}
! 466: do_test trigger1-8.5 {
! 467: execsql {
! 468: CREATE TRIGGER [trigger] AFTER INSERT ON t2 BEGIN SELECT 1; END;
! 469: SELECT name FROM sqlite_master WHERE type='trigger';
! 470: }
! 471: } {trigger}
! 472: do_test trigger1-8.6 {
! 473: execsql {
! 474: DROP TRIGGER [trigger];
! 475: SELECT name FROM sqlite_master WHERE type='trigger';
! 476: }
! 477: } {}
! 478:
! 479: ifcapable conflict {
! 480: # Make sure REPLACE works inside of triggers.
! 481: #
! 482: # There are two versions of trigger-9.1 and trigger-9.2. One that uses
! 483: # compound SELECT statements, and another that does not.
! 484: ifcapable compound {
! 485: do_test trigger1-9.1 {
! 486: execsql {
! 487: CREATE TABLE t3(a,b);
! 488: CREATE TABLE t4(x UNIQUE, b);
! 489: CREATE TRIGGER r34 AFTER INSERT ON t3 BEGIN
! 490: REPLACE INTO t4 VALUES(new.a,new.b);
! 491: END;
! 492: INSERT INTO t3 VALUES(1,2);
! 493: SELECT * FROM t3 UNION ALL SELECT 99, 99 UNION ALL SELECT * FROM t4;
! 494: }
! 495: } {1 2 99 99 1 2}
! 496: do_test trigger1-9.2 {
! 497: execsql {
! 498: INSERT INTO t3 VALUES(1,3);
! 499: SELECT * FROM t3 UNION ALL SELECT 99, 99 UNION ALL SELECT * FROM t4;
! 500: }
! 501: } {1 2 1 3 99 99 1 3}
! 502: } else {
! 503: do_test trigger1-9.1 {
! 504: execsql {
! 505: CREATE TABLE t3(a,b);
! 506: CREATE TABLE t4(x UNIQUE, b);
! 507: CREATE TRIGGER r34 AFTER INSERT ON t3 BEGIN
! 508: REPLACE INTO t4 VALUES(new.a,new.b);
! 509: END;
! 510: INSERT INTO t3 VALUES(1,2);
! 511: SELECT * FROM t3; SELECT 99, 99; SELECT * FROM t4;
! 512: }
! 513: } {1 2 99 99 1 2}
! 514: do_test trigger1-9.2 {
! 515: execsql {
! 516: INSERT INTO t3 VALUES(1,3);
! 517: SELECT * FROM t3; SELECT 99, 99; SELECT * FROM t4;
! 518: }
! 519: } {1 2 1 3 99 99 1 3}
! 520: }
! 521: execsql {
! 522: DROP TABLE t3;
! 523: DROP TABLE t4;
! 524: }
! 525: }
! 526:
! 527:
! 528: # Ticket #764. At one stage TEMP triggers would fail to re-install when the
! 529: # schema was reloaded. The following tests ensure that TEMP triggers are
! 530: # correctly re-installed.
! 531: #
! 532: # Also verify that references within trigger programs are resolved at
! 533: # statement compile time, not trigger installation time. This means, for
! 534: # example, that you can drop and re-create tables referenced by triggers.
! 535: ifcapable tempdb&&attach {
! 536: do_test trigger1-10.0 {
! 537: forcedelete test2.db
! 538: forcedelete test2.db-journal
! 539: execsql {
! 540: ATTACH 'test2.db' AS aux;
! 541: }
! 542: } {}
! 543: do_test trigger1-10.1 {
! 544: execsql {
! 545: CREATE TABLE main.t4(a, b, c);
! 546: CREATE TABLE temp.t4(a, b, c);
! 547: CREATE TABLE aux.t4(a, b, c);
! 548: CREATE TABLE insert_log(db, a, b, c);
! 549: }
! 550: } {}
! 551: do_test trigger1-10.2 {
! 552: execsql {
! 553: CREATE TEMP TRIGGER trig1 AFTER INSERT ON main.t4 BEGIN
! 554: INSERT INTO insert_log VALUES('main', new.a, new.b, new.c);
! 555: END;
! 556: CREATE TEMP TRIGGER trig2 AFTER INSERT ON temp.t4 BEGIN
! 557: INSERT INTO insert_log VALUES('temp', new.a, new.b, new.c);
! 558: END;
! 559: CREATE TEMP TRIGGER trig3 AFTER INSERT ON aux.t4 BEGIN
! 560: INSERT INTO insert_log VALUES('aux', new.a, new.b, new.c);
! 561: END;
! 562: }
! 563: } {}
! 564: do_test trigger1-10.3 {
! 565: execsql {
! 566: INSERT INTO main.t4 VALUES(1, 2, 3);
! 567: INSERT INTO temp.t4 VALUES(4, 5, 6);
! 568: INSERT INTO aux.t4 VALUES(7, 8, 9);
! 569: }
! 570: } {}
! 571: do_test trigger1-10.4 {
! 572: execsql {
! 573: SELECT * FROM insert_log;
! 574: }
! 575: } {main 1 2 3 temp 4 5 6 aux 7 8 9}
! 576: do_test trigger1-10.5 {
! 577: execsql {
! 578: BEGIN;
! 579: INSERT INTO main.t4 VALUES(1, 2, 3);
! 580: INSERT INTO temp.t4 VALUES(4, 5, 6);
! 581: INSERT INTO aux.t4 VALUES(7, 8, 9);
! 582: ROLLBACK;
! 583: }
! 584: } {}
! 585: do_test trigger1-10.6 {
! 586: execsql {
! 587: SELECT * FROM insert_log;
! 588: }
! 589: } {main 1 2 3 temp 4 5 6 aux 7 8 9}
! 590: do_test trigger1-10.7 {
! 591: execsql {
! 592: DELETE FROM insert_log;
! 593: INSERT INTO main.t4 VALUES(11, 12, 13);
! 594: INSERT INTO temp.t4 VALUES(14, 15, 16);
! 595: INSERT INTO aux.t4 VALUES(17, 18, 19);
! 596: }
! 597: } {}
! 598: do_test trigger1-10.8 {
! 599: execsql {
! 600: SELECT * FROM insert_log;
! 601: }
! 602: } {main 11 12 13 temp 14 15 16 aux 17 18 19}
! 603: do_test trigger1-10.8 {
! 604: # Drop and re-create the insert_log table in a different database. Note
! 605: # that we can change the column names because the trigger programs don't
! 606: # use them explicitly.
! 607: execsql {
! 608: DROP TABLE insert_log;
! 609: CREATE TABLE aux.insert_log(db, d, e, f);
! 610: }
! 611: } {}
! 612: do_test trigger1-10.10 {
! 613: execsql {
! 614: INSERT INTO main.t4 VALUES(21, 22, 23);
! 615: INSERT INTO temp.t4 VALUES(24, 25, 26);
! 616: INSERT INTO aux.t4 VALUES(27, 28, 29);
! 617: }
! 618: } {}
! 619: do_test trigger1-10.11 {
! 620: execsql {
! 621: SELECT * FROM insert_log;
! 622: }
! 623: } {main 21 22 23 temp 24 25 26 aux 27 28 29}
! 624: }
! 625:
! 626: do_test trigger1-11.1 {
! 627: catchsql {SELECT raise(abort,'message');}
! 628: } {1 {RAISE() may only be used within a trigger-program}}
! 629:
! 630: do_test trigger1-15.1 {
! 631: execsql {
! 632: CREATE TABLE tA(a INTEGER PRIMARY KEY, b, c);
! 633: CREATE TRIGGER tA_trigger BEFORE UPDATE ON "tA" BEGIN SELECT 1; END;
! 634: INSERT INTO tA VALUES(1, 2, 3);
! 635: }
! 636: catchsql { UPDATE tA SET a = 'abc' }
! 637: } {1 {datatype mismatch}}
! 638: do_test trigger1-15.2 {
! 639: catchsql { INSERT INTO tA VALUES('abc', 2, 3) }
! 640: } {1 {datatype mismatch}}
! 641:
! 642: # Ticket #3947: Do not allow qualified table names on INSERT, UPDATE, and
! 643: # DELETE statements within triggers. Actually, this has never been allowed
! 644: # by the grammar. But the error message is confusing: one simply gets a
! 645: # "syntax error". That has now been changed to give a full error message.
! 646: #
! 647: do_test trigger1-16.1 {
! 648: db eval {
! 649: CREATE TABLE t16(a,b,c);
! 650: CREATE INDEX t16a ON t16(a);
! 651: CREATE INDEX t16b ON t16(b);
! 652: }
! 653: catchsql {
! 654: CREATE TRIGGER main.t16err1 AFTER INSERT ON tA BEGIN
! 655: INSERT INTO main.t16 VALUES(1,2,3);
! 656: END;
! 657: }
! 658: } {1 {qualified table names are not allowed on INSERT, UPDATE, and DELETE statements within triggers}}
! 659: do_test trigger1-16.2 {
! 660: catchsql {
! 661: CREATE TRIGGER main.t16err2 AFTER INSERT ON tA BEGIN
! 662: UPDATE main.t16 SET rowid=rowid+1;
! 663: END;
! 664: }
! 665: } {1 {qualified table names are not allowed on INSERT, UPDATE, and DELETE statements within triggers}}
! 666: do_test trigger1-16.3 {
! 667: catchsql {
! 668: CREATE TRIGGER main.t16err3 AFTER INSERT ON tA BEGIN
! 669: DELETE FROM main.t16;
! 670: END;
! 671: }
! 672: } {1 {qualified table names are not allowed on INSERT, UPDATE, and DELETE statements within triggers}}
! 673: do_test trigger1-16.4 {
! 674: catchsql {
! 675: CREATE TRIGGER main.t16err4 AFTER INSERT ON tA BEGIN
! 676: UPDATE t16 NOT INDEXED SET rowid=rowid+1;
! 677: END;
! 678: }
! 679: } {1 {the NOT INDEXED clause is not allowed on UPDATE or DELETE statements within triggers}}
! 680: do_test trigger1-16.5 {
! 681: catchsql {
! 682: CREATE TRIGGER main.t16err5 AFTER INSERT ON tA BEGIN
! 683: UPDATE t16 INDEXED BY t16a SET rowid=rowid+1 WHERE a=1;
! 684: END;
! 685: }
! 686: } {1 {the INDEXED BY clause is not allowed on UPDATE or DELETE statements within triggers}}
! 687: do_test trigger1-16.6 {
! 688: catchsql {
! 689: CREATE TRIGGER main.t16err6 AFTER INSERT ON tA BEGIN
! 690: DELETE FROM t16 NOT INDEXED WHERE a=123;
! 691: END;
! 692: }
! 693: } {1 {the NOT INDEXED clause is not allowed on UPDATE or DELETE statements within triggers}}
! 694: do_test trigger1-16.7 {
! 695: catchsql {
! 696: CREATE TRIGGER main.t16err7 AFTER INSERT ON tA BEGIN
! 697: DELETE FROM t16 INDEXED BY t16a WHERE a=123;
! 698: END;
! 699: }
! 700: } {1 {the INDEXED BY clause is not allowed on UPDATE or DELETE statements within triggers}}
! 701:
! 702: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>