Annotation of embedaddon/sqlite3/test/trigger1.test, revision 1.1.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>