Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Properly record the names of triggers even if the name is quoted. Ticket #1737. (CVS 3158) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
4ba280ddd66d5cbf617263d6300b7582 |
User & Date: | drh 2006-03-29 00:24:07.000 |
Context
2006-04-01
| ||
14:38 | Remove mention of the REVERSE collating sequence from the documentation. (CVS 3159) (check-in: bd6876a1a9 user: drh tags: trunk) | |
2006-03-29
| ||
00:24 | Properly record the names of triggers even if the name is quoted. Ticket #1737. (CVS 3158) (check-in: 4ba280ddd6 user: drh tags: trunk) | |
2006-03-28
| ||
23:57 | Compile-time option to use only 32-bit integers. (CVS 3157) (check-in: aedadfc3e4 user: drh tags: trunk) | |
Changes
Changes to src/trigger.c.
︙ | ︙ | |||
106 107 108 109 110 111 112 | /* Check that the trigger name is not reserved and that no trigger of the ** specified name exists */ zName = sqlite3NameFromToken(pName); if( !zName || SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ goto trigger_cleanup; } | | | 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | /* Check that the trigger name is not reserved and that no trigger of the ** specified name exists */ zName = sqlite3NameFromToken(pName); if( !zName || SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ goto trigger_cleanup; } if( sqlite3HashFind(&(db->aDb[iDb].pSchema->trigHash), zName,strlen(zName)) ){ sqlite3ErrorMsg(pParse, "trigger %T already exists", pName); goto trigger_cleanup; } /* Do not create a trigger on a system table */ if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){ sqlite3ErrorMsg(pParse, "cannot create trigger on system table"); |
︙ | ︙ | |||
253 254 255 256 257 258 259 | } if( db->init.busy ){ int n; Table *pTab; Trigger *pDel; pDel = sqlite3HashInsert(&db->aDb[iDb].pSchema->trigHash, | | | 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 | } if( db->init.busy ){ int n; Table *pTab; Trigger *pDel; pDel = sqlite3HashInsert(&db->aDb[iDb].pSchema->trigHash, pTrig->name, strlen(pTrig->name), pTrig); if( pDel ){ assert( sqlite3MallocFailed() && pDel==pTrig ); goto triggerfinish_cleanup; } n = strlen(pTrig->table) + 1; pTab = sqlite3HashFind(&pTrig->pTabSchema->tblHash, pTrig->table, n); assert( pTab!=0 ); |
︙ | ︙ | |||
451 452 453 454 455 456 457 | assert( pName->nSrc==1 ); zDb = pName->a[0].zDatabase; zName = pName->a[0].zName; nName = strlen(zName); for(i=OMIT_TEMPDB; i<db->nDb; i++){ int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ if( zDb && sqlite3StrICmp(db->aDb[j].zName, zDb) ) continue; | | | 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 | assert( pName->nSrc==1 ); zDb = pName->a[0].zDatabase; zName = pName->a[0].zName; nName = strlen(zName); for(i=OMIT_TEMPDB; i<db->nDb; i++){ int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ if( zDb && sqlite3StrICmp(db->aDb[j].zName, zDb) ) continue; pTrigger = sqlite3HashFind(&(db->aDb[j].pSchema->trigHash), zName, nName); if( pTrigger ) break; } if( !pTrigger ){ sqlite3ErrorMsg(pParse, "no such trigger: %S", pName, 0); goto drop_trigger_cleanup; } sqlite3DropTriggerPtr(pParse, pTrigger); |
︙ | ︙ | |||
534 535 536 537 538 539 540 | /* ** Remove a trigger from the hash tables of the sqlite* pointer. */ void sqlite3UnlinkAndDeleteTrigger(sqlite3 *db, int iDb, const char *zName){ Trigger *pTrigger; int nName = strlen(zName); | | > | 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 | /* ** Remove a trigger from the hash tables of the sqlite* pointer. */ void sqlite3UnlinkAndDeleteTrigger(sqlite3 *db, int iDb, const char *zName){ Trigger *pTrigger; int nName = strlen(zName); pTrigger = sqlite3HashInsert(&(db->aDb[iDb].pSchema->trigHash), zName, nName, 0); if( pTrigger ){ Table *pTable = tableOfTrigger(pTrigger); assert( pTable!=0 ); if( pTable->pTrigger == pTrigger ){ pTable->pTrigger = pTrigger->pNext; }else{ Trigger *cc = pTable->pTrigger; |
︙ | ︙ |
Changes to test/index.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 2001 September 15 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the CREATE INDEX statement. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 2001 September 15 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the CREATE INDEX statement. # # $Id: index.test,v 1.42 2006/03/29 00:24:07 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Create a basic index and verify it is added to sqlite_master # do_test index-1.1 { |
︙ | ︙ | |||
178 179 180 181 182 183 184 185 186 187 188 189 190 191 | do_test index-6.1 { execsql {CREATE TABLE test1(f1 int, f2 int)} execsql {CREATE TABLE test2(g1 real, g2 real)} execsql {CREATE INDEX index1 ON test1(f1)} set v [catch {execsql {CREATE INDEX index1 ON test2(g1)}} msg] lappend v $msg } {1 {index index1 already exists}} do_test index-6.1b { execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name} } {index1 test1 test2} do_test index-6.1c { catchsql {CREATE INDEX IF NOT EXISTS index1 ON test1(f1)} } {0 {}} do_test index-6.2 { | > > > | 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | do_test index-6.1 { execsql {CREATE TABLE test1(f1 int, f2 int)} execsql {CREATE TABLE test2(g1 real, g2 real)} execsql {CREATE INDEX index1 ON test1(f1)} set v [catch {execsql {CREATE INDEX index1 ON test2(g1)}} msg] lappend v $msg } {1 {index index1 already exists}} do_test index-6.1.1 { catchsql {CREATE INDEX [index1] ON test2(g1)} } {1 {index index1 already exists}} do_test index-6.1b { execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name} } {index1 test1 test2} do_test index-6.1c { catchsql {CREATE INDEX IF NOT EXISTS index1 ON test1(f1)} } {0 {}} do_test index-6.2 { |
︙ | ︙ |
Changes to test/table.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 2001 September 15 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the CREATE TABLE statement. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 2001 September 15 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the CREATE TABLE statement. # # $Id: table.test,v 1.45 2006/03/29 00:24:07 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Create a basic table and verify it is added to sqlite_master # do_test table-1.1 { |
︙ | ︙ | |||
88 89 90 91 92 93 94 95 96 97 98 99 100 101 | # Verify that we cannot make two tables with the same name # do_test table-2.1 { execsql {CREATE TABLE TEST2(one text)} catchsql {CREATE TABLE test2(two text default 'hi')} } {1 {table test2 already exists}} do_test table-2.1b { set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg] lappend v $msg } {1 {object name reserved for internal use: sqlite_master}} do_test table-2.1c { db close sqlite3 db test.db | > > > | 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | # Verify that we cannot make two tables with the same name # do_test table-2.1 { execsql {CREATE TABLE TEST2(one text)} catchsql {CREATE TABLE test2(two text default 'hi')} } {1 {table test2 already exists}} do_test table-2.1.1 { catchsql {CREATE TABLE "test2" (two)} } {1 {table "test2" already exists}} do_test table-2.1b { set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg] lappend v $msg } {1 {object name reserved for internal use: sqlite_master}} do_test table-2.1c { db close sqlite3 db test.db |
︙ | ︙ |
Changes to test/trigger1.test.
︙ | ︙ | |||
56 57 58 59 60 61 62 | CREATE TABLE t1(a); } execsql { CREATE TRIGGER tr1 INSERT ON t1 BEGIN INSERT INTO t1 values(1); END; } | | > > > > > > > > > > > > > > | 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | CREATE TABLE t1(a); } execsql { CREATE TRIGGER tr1 INSERT ON t1 BEGIN INSERT INTO t1 values(1); END; } do_test trigger1-1.2.1 { catchsql { CREATE TRIGGER tr1 DELETE ON t1 BEGIN SELECT * FROM sqlite_master; END } } {1 {trigger tr1 already exists}} do_test trigger1-1.2.2 { catchsql { CREATE TRIGGER "tr1" DELETE ON t1 BEGIN SELECT * FROM sqlite_master; END } } {1 {trigger "tr1" already exists}} do_test trigger1-1.2.3 { catchsql { CREATE TRIGGER [tr1] DELETE ON t1 BEGIN SELECT * FROM sqlite_master; END } } {1 {trigger [tr1] already exists}} do_test trigger1-1.3 { catchsql { BEGIN; CREATE TRIGGER tr2 INSERT ON t1 BEGIN SELECT * from sqlite_master; END; ROLLBACK; |
︙ | ︙ |