]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a crash caused by adding a trigger to a shared-schema and then deleting it
authordanielk1977 <danielk1977@noemail.net>
Fri, 6 Jan 2006 15:03:48 +0000 (15:03 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Fri, 6 Jan 2006 15:03:48 +0000 (15:03 +0000)
using a different connection. (CVS 2873)

FossilOrigin-Name: 19f93e135f1ff4f987d14afe74b955e119904017

manifest
manifest.uuid
src/sqliteInt.h
src/trigger.c
test/shared.test

index 0be78320dbf3f3b09ce5040253f91ff81a38deeb..aec563a7b411584fe139deff588f207279e0f40c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\san\salignment\sproblem\sin\sthe\ssqlite3OsRandomSeed().\s\sTicket\s#1584.\s(CVS\s2872)
-D 2006-01-06T14:46:47
+C Fix\sa\scrash\scaused\sby\sadding\sa\strigger\sto\sa\sshared-schema\sand\sthen\sdeleting\sit\nusing\sa\sdifferent\sconnection.\s(CVS\s2873)
+D 2006-01-06T15:03:48
 F Makefile.in c79fbdaa264c6afcd435f2fb492551de5a8cf80d
 F Makefile.linux-gcc aee18d8a05546dcf1888bd4547e442008a49a092
 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -69,7 +69,7 @@ F src/random.c d40f8d356cecbd351ccfab6eaedd7ec1b54f5261
 F src/select.c a60e5c7fad9ce7adc78d9eb32a0a89dd5acd04fb
 F src/shell.c 66b073375efbdee19045e7e0cd38b85f9aff71da
 F src/sqlite.h.in ba3a29daa6a16e054191ccb384a981964e882a1d
-F src/sqliteInt.h 9b89651a99687e25bdab1e4e33b7dcadcd890283
+F src/sqliteInt.h 8e28cfdaf55761f054904c9a5c573e90b96e2433
 F src/table.c 486dcfce532685b53b5a2b5da8bba0ded6fb2316
 F src/tclsqlite.c 42151e6c78502277be77b88c00535d53ce89b917
 F src/test1.c 8e62d29dbf511b603dee63af886c43fa83d5a680
@@ -79,7 +79,7 @@ F src/test4.c a8fd681e139e1c61f22a77d07fc3a99cb28fff3f
 F src/test5.c 7162f8526affb771c4ed256826eee7bb9eca265f
 F src/test6.c 2c195d0734f8b3517331f62c088bf6cede3818a5
 F src/tokenize.c 7a3a3d3cc734f684a77c4dfd09eb46fcee25394c
-F src/trigger.c 858c0a4974035b002fd2192399c6076ac7b75e1f
+F src/trigger.c 13c449e61cb2c831e07b9fd7175d0c16dcbb28ac
 F src/update.c c72e9cbbc0adf8d728c1c39ace03d4adb29b5cfb
 F src/utf.c b7bffac4260177ae7f83c01d025fe0f5ed70ce71
 F src/util.c 23d70b1f7e88a603d4baf28ac9592d38f60f2605
@@ -220,7 +220,7 @@ F test/select4.test c239f516aa31f42f2ef7c6d7cd01105f08f934ca
 F test/select5.test 07a90ab3c7e3f0a241a9cdea1d997b2c8a89ff0b
 F test/select6.test f459a19bdac0501c4d3eb1a4df4b7a76f1bb8ad4
 F test/select7.test 1bf795b948c133a15a2a5e99d3270e652ec58ce6
-F test/shared.test eb6b9ac456f60ed485b9ca5873d563abacae815a
+F test/shared.test 0fc3ba42901d31a9c0c48edbbe6cc61008438b16
 F test/sort.test 0e4456e729e5a92a625907c63dcdedfbe72c5dc5
 F test/subquery.test e6de53332c0301b3cfa34edc3f3cd5fa1e859efd
 F test/subselect.test 2d13fb7f450db3595adcdd24079a0dd1d2d6abc2
@@ -335,7 +335,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
 F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
-P 6676c7031d81202ad702142ecf9e64f14d94d968
-R 1b60a9ed7b0ca6bc19ad7d05130da53f
-U drh
-Z 4997b116ed1a6eabde161c270985eda0
+P 373b56f0048fd6a1946a97acfcca40fd12f7d572
+R f298cefe96bf8aa08947c68d7cf6500d
+U danielk1977
+Z 0630f893c341afffaad594ffa4fb7ae6
index 052f9cfc77832e0e9148091ad748718c2b336041..a14f6ccbe208e5c59c6ca7a0a99c39bfd35d43c4 100644 (file)
@@ -1 +1 @@
-373b56f0048fd6a1946a97acfcca40fd12f7d572
\ No newline at end of file
+19f93e135f1ff4f987d14afe74b955e119904017
\ No newline at end of file
index 721d4318e8f89d6d28a85af7edda7766c72e2a28..c3fadd13537427989b3fe62c1d442e4c8ad6417b 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** Internal interface definitions for SQLite.
 **
-** @(#) $Id: sqliteInt.h,v 1.451 2006/01/06 12:03:19 drh Exp $
+** @(#) $Id: sqliteInt.h,v 1.452 2006/01/06 15:03:48 danielk1977 Exp $
 */
 #ifndef _SQLITEINT_H_
 #define _SQLITEINT_H_
@@ -1297,8 +1297,6 @@ struct AuthContext {
 struct Trigger {
   char *name;             /* The name of the trigger                        */
   char *table;            /* The table or view to which the trigger applies */
-//u8 iDb;                 /* Database containing this trigger               */
-  u8 iTabDb;              /* Database containing Trigger.table              */
   u8 op;                  /* One of TK_DELETE, TK_UPDATE, TK_INSERT         */
   u8 tr_tm;               /* One of TRIGGER_BEFORE, TRIGGER_AFTER */
   Expr *pWhen;            /* The WHEN clause of the expresion (may be NULL) */
@@ -1306,7 +1304,8 @@ struct Trigger {
                              the <column-list> is stored here */
   int foreach;            /* One of TK_ROW or TK_STATEMENT */
   Token nameToken;        /* Token containing zName. Use during parsing only */
-  DbSchema *pSchema;
+  DbSchema *pSchema;      /* Schema containing the trigger */
+  DbSchema *pTabSchema;   /* Schema containing the table */
   TriggerStep *step_list; /* Link list of trigger program steps             */
   Trigger *pNext;         /* Next trigger associated with the table */
 };
index cd68f4497be63049c05c145bda83baf7acf02864..fcb852d95a71bf978f79b8d759fce06ddbdb8ff6 100644 (file)
@@ -164,7 +164,7 @@ void sqlite3BeginTrigger(
   zName = 0;
   pTrigger->table = sqliteStrDup(pTableName->a[0].zName);
   pTrigger->pSchema = db->aDb[iDb].pSchema;
-  pTrigger->iTabDb = iTabDb;
+  pTrigger->pTabSchema = pTab->pSchema;
   pTrigger->op = op;
   pTrigger->tr_tm = tr_tm==TK_BEFORE ? TRIGGER_BEFORE : TRIGGER_AFTER;
   pTrigger->pWhen = sqlite3ExprDup(pWhen);
@@ -249,6 +249,7 @@ void sqlite3FinishTrigger(
   }
 
   if( db->init.busy ){
+    int n;
     Table *pTab;
     Trigger *pDel;
     pDel = sqlite3HashInsert(&db->aDb[iDb].pSchema->trigHash, 
@@ -257,7 +258,8 @@ void sqlite3FinishTrigger(
       assert( sqlite3Tsd()->mallocFailed && pDel==pTrig );
       goto triggerfinish_cleanup;
     }
-    pTab = sqlite3LocateTable(pParse,pTrig->table,db->aDb[pTrig->iTabDb].zName);
+    n = strlen(pTrig->table) + 1;
+    pTab = sqlite3HashFind(&pTrig->pTabSchema->tblHash, pTrig->table, n);
     assert( pTab!=0 );
     pTrig->pNext = pTab->pTrigger;
     pTab->pTrigger = pTrig;
@@ -467,7 +469,8 @@ drop_trigger_cleanup:
 ** is set on.
 */
 static Table *tableOfTrigger(sqlite3 *db, Trigger *pTrigger){
-  return sqlite3FindTable(db,pTrigger->table,db->aDb[pTrigger->iTabDb].zName);
+  int n = strlen(pTrigger->table) + 1;
+  return sqlite3HashFind(&pTrigger->pTabSchema->tblHash, pTrigger->table, n);
 }
 
 
index 746cfe478cc0d28f49a6353270d414483b2fd30b..35ada42dd251d050969579e52448f7448976197d 100644 (file)
@@ -11,7 +11,7 @@
 # This file implements regression tests for SQLite library.  The
 # focus of this file is testing the SELECT statement.
 #
-# $Id: shared.test,v 1.4 2006/01/06 13:00:30 danielk1977 Exp $
+# $Id: shared.test,v 1.5 2006/01/06 15:03:48 danielk1977 Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -31,8 +31,9 @@ set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
 #             write-transaction, including a simple test to ensure the 
 #             external locking protocol is still working.
 # shared-3.*: Simple test of read-uncommitted mode.
-#
 # shared-4.*: Check that the schema is locked and unlocked correctly.
+# shared-5.*: Test that creating/dropping schema items works when databases
+#             are attached in different orders to different handles.
 #
 
 do_test shared-1.1 {
@@ -360,9 +361,55 @@ do_test shared-4.4.5 {
   list $rc $msg
 } {1 {(6) database schema is locked: test}}
 
+
 catch {db2 close}
 catch {db close}
 
+#--------------------------------------------------------------------------
+# Tests shared-5.* 
+#
+foreach db [list test.db test1.db test2.db test3.db] {
+  file delete -force $db ${db}-journal
+}
+do_test shared-5.1.1 {
+  sqlite3 db1 test.db
+  sqlite3 db2 test.db
+  execsql {
+    ATTACH 'test1.db' AS test1;
+    ATTACH 'test2.db' AS test2;
+    ATTACH 'test3.db' AS test3;
+  } db1
+  execsql {
+    ATTACH 'test3.db' AS test3;
+    ATTACH 'test2.db' AS test2;
+    ATTACH 'test1.db' AS test1;
+  } db2
+} {}
+do_test shared-5.1.2 {
+  execsql {
+    CREATE TABLE test1.t1(a, b);
+    CREATE INDEX test1.i1 ON t1(a, b);
+    CREATE VIEW test1.v1 AS SELECT * FROM t1;
+    CREATE TRIGGER test1.trig1 AFTER INSERT ON t1 BEGIN
+      INSERT INTO t1 VALUES(new.a, new.b);
+    END;
+  } db1
+  execsql {
+    DROP INDEX i1;
+    DROP VIEW v1;
+    DROP TRIGGER trig1;
+    DROP TABLE t1;
+  } db2
+} {}
+do_test shared-5.1.2 {
+  execsql {
+    SELECT * FROM sqlite_master UNION ALL SELECT * FROM test1.sqlite_master
+  } db1
+} {}
+
+catch {db1 close}
+catch {db2 close}
+
 finish_test
 sqlite3_enable_shared_cache $::enable_shared_cache