]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Ensure that the tbl_name column in the sqlite_temp_master table is updated
authordan <dan@noemail.net>
Thu, 6 Sep 2018 16:01:37 +0000 (16:01 +0000)
committerdan <dan@noemail.net>
Thu, 6 Sep 2018 16:01:37 +0000 (16:01 +0000)
correctly as part of a RENAME TABLE operation.

FossilOrigin-Name: ffecfca511718e39e0003b380d5113755b8a11405a5bd80cc04503d9557f0842

manifest
manifest.uuid
src/alter.c
test/altertab.test

index 7161489fe6c8e711dcf8a54e3cca361b400a6b24..1077cc593fd6f9929938fc8ad0d0613748471072 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Merge\slatest\strunk\schanges\sinto\sthis\sbranch.
-D 2018-09-05T17:52:52.364
+C Ensure\sthat\sthe\stbl_name\scolumn\sin\sthe\ssqlite_temp_master\stable\sis\supdated\ncorrectly\sas\spart\sof\sa\sRENAME\sTABLE\soperation.
+D 2018-09-06T16:01:37.037
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in 6b650013511fd9d8b094203ac268af9220d292cc7d4e1bc9fbca15aacd8c7995
@@ -434,7 +434,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca
 F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
 F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
-F src/alter.c 900f64f083ca8dde83bb40fde12df29a26dad85d8ad086456bf1b373a2034abf
+F src/alter.c 9088b817d4ca84504dc3b4237be6347cfeb3471aa8b29f57ffc4b102d9f62924
 F src/analyze.c 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9
 F src/attach.c 4bd5b92633671d3e8ce431153ebb1893b50335818423b5373f3f27969f79769a
 F src/auth.c 32a5bbe3b755169ab6c66311c5225a3cd4f75a46c041f7fb117e0cbb68055114
@@ -604,7 +604,7 @@ F test/alter4.test 7e93a21fe131e1dfeb317e90056856f96b10381fc7fe3a05e765569a23400
 F test/altercol.test a5e24ad5e71afbf4a604336ee5f5287d3633ef26952b4ee8b5fe154a30ed2993
 F test/altermalloc.test e81ac9657ed25c6c5bb09bebfa5a047cd8e4acfc
 F test/altermalloc2.test 0231398534c494401a70a1d06a63d7849cb5b317fcc14228cbdb53039eba7eae
-F test/altertab.test 51698a8ada7cd3627026b6377987becfb58d1a3cbf14d73f283110f908491ac9
+F test/altertab.test bd1fbe88c9e87c5ab9aedc2b1d1d29342d9364297bd6c4548b224188a9a351fb
 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f
 F test/analyze.test b3a9c67d00e1df7588a5b7be9a0292899f94fe8cac1f94a017277474ca2e59df
 F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8
@@ -1762,7 +1762,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P f804336f083d8d26314bb1ba34cec427675065a67cbe2bf00bb42e40752aeb33 e628713338f6e584a32d5fc3436ddbd9ee8cf88401c321c1ebe7daa1e695c623
-R 41880ac914b2711bb962960eaec2ca98
+P 6f4f707f9c3c29f2437962fd5d7761876cf8e7ed7fdcb9d0ca4fd001fa226597
+R 736eb84ee6a36063403800095e80dcb4
 U dan
-Z 12f9217db838b96229534e48a6d1f751
+Z 8b3bb9ab09ae82a5dd16cca46750c9c8
index 1850eb663caaa688724529411c7a84c533ca6f9d..0f536b66a53c4ed9df3a826d030e257fef976b6a 100644 (file)
@@ -1 +1 @@
-6f4f707f9c3c29f2437962fd5d7761876cf8e7ed7fdcb9d0ca4fd001fa226597
\ No newline at end of file
+ffecfca511718e39e0003b380d5113755b8a11405a5bd80cc04503d9557f0842
\ No newline at end of file
index a078906d21a6dce367b9b6f73b8892268b461d86..e748b652d3092609d3b2f6b54b2c68495c02a493 100644 (file)
@@ -49,7 +49,7 @@ void renameTestSchema(Parse *pParse, const char *zDb, int bTemp){
       "FROM \"%w\".%s "
       "WHERE name NOT LIKE 'sqlite_%%'"
       " AND sql NOT LIKE 'create virtual%%'"
-      " AND sqlite_rename_test(%Q, sql, type, name, %d)=0 ",
+      " AND sqlite_rename_test(%Q, sql, type, name, %d)=NULL ",
       zDb, MASTER_NAME, 
       zDb, bTemp
   );
@@ -60,7 +60,7 @@ void renameTestSchema(Parse *pParse, const char *zDb, int bTemp){
         "FROM temp.%s "
         "WHERE name NOT LIKE 'sqlite_%%'"
         " AND sql NOT LIKE 'create virtual%%'"
-        " AND sqlite_rename_test(%Q, sql, type, name, 1)=0 ",
+        " AND sqlite_rename_test(%Q, sql, type, name, 1)=NULL ",
         MASTER_NAME, zDb 
     );
   }
@@ -233,9 +233,11 @@ void sqlite3AlterRenameTable(
         "UPDATE sqlite_temp_master SET "
             "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, 1), "
             "tbl_name = "
-              "CASE WHEN tbl_name=%Q COLLATE nocase THEN %Q ELSE tbl_name END "
+              "CASE WHEN tbl_name=%Q COLLATE nocase AND "
+              "          sqlite_rename_test(%Q, sql, type, name, 1) "
+              "THEN %Q ELSE tbl_name END "
             "WHERE type IN ('view', 'trigger')"
-        , zDb, zTabName, zName, zTabName, zTabName, zName);
+        , zDb, zTabName, zName, zTabName, zDb, zName);
   }
 
   renameReloadSchema(pParse, iDb);
@@ -1489,13 +1491,19 @@ static void renameTableFunc(
 ** resolution problems in a CREATE TRIGGER|TABLE|VIEW|INDEX statement.
 ** After an ALTER TABLE .. RENAME operation is performed and the schema
 ** reloaded, this function is called on each SQL statement in the schema
-** to ensure that it are still usable.
+** to ensure that it is still usable.
 **
 **   0: Database name ("main", "temp" etc.).
 **   1: SQL statement.
 **   2: Object type ("view", "table", "trigger" or "index").
 **   3: Object name.
 **   4: True if object is from temp schema.
+**
+** Unless it finds an error, this function normally returns NULL. However, it
+** returns integer value 1 if:
+**
+**   * the SQL argument creates a trigger, and
+**   * the table that the trigger is attached to is in database zDb.
 */
 static void renameTableTest(
   sqlite3_context *context,
@@ -1528,6 +1536,11 @@ static void renameTableTest(
 
       else if( sParse.pNewTrigger ){
         rc = renameResolveTrigger(&sParse, bTemp ? 0 : zDb);
+        if( rc==SQLITE_OK ){
+          int i1 = sqlite3SchemaToIndex(db, sParse.pNewTrigger->pTabSchema);
+          int i2 = sqlite3FindDbName(db, zDb);
+          if( i1==i2 ) sqlite3_result_int(context, 1);
+        }
       }
     }
 
index a4d7859a47ba5a3f1b9a035e267d63416c642bd5..ac16a22ddecb0d98ca522d6037f45f891d9bffdc 100644 (file)
@@ -325,6 +325,47 @@ ifcapable fts5 {
   } {a b c}
 }
 
-finish_test
+#-------------------------------------------------------------------------
+reset_db
+forcedelete test.db2
+db func trigger trigger
+set ::trigger [list]
+proc trigger {args} {
+  lappend ::trigger $args
+}
+do_execsql_test 11.0 {
+  ATTACH 'test.db2' AS aux;
+  CREATE TABLE aux.t1(a, b, c);
+  CREATE TABLE main.t1(a, b, c);
+  CREATE TEMP TRIGGER tr AFTER INSERT ON aux.t1 BEGIN
+    SELECT trigger(new.a, new.b, new.c);
+  END;
+}
 
+do_execsql_test 11.1 {
+  INSERT INTO main.t1 VALUES(1, 2, 3);
+  INSERT INTO aux.t1 VALUES(4, 5, 6);
+}
+do_test 11.2 { set ::trigger } {{4 5 6}}
+
+do_execsql_test 11.3 {
+  SELECT name, tbl_name FROM sqlite_temp_master;
+} {tr t1}
+
+do_execsql_test 11.4 {
+  ALTER TABLE main.t1 RENAME TO t2;
+  SELECT name, tbl_name FROM sqlite_temp_master;
+} {tr t1}
+
+do_execsql_test 11.5 {
+  ALTER TABLE aux.t1 RENAME TO t2;
+  SELECT name, tbl_name FROM sqlite_temp_master;
+} {tr t2}
+
+do_execsql_test 11.6 {
+  INSERT INTO aux.t2 VALUES(7, 8, 9);
+}
+do_test 11.7 { set ::trigger } {{4 5 6} {7 8 9}}
+
+finish_test