]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with renaming a column in a table that has a temp trigger that
authordan <dan@noemail.net>
Sat, 1 Sep 2018 20:23:28 +0000 (20:23 +0000)
committerdan <dan@noemail.net>
Sat, 1 Sep 2018 20:23:28 +0000 (20:23 +0000)
references another attached database.

FossilOrigin-Name: 336b8a0923bf65b7a2c35811cb6dec0e262a0b31e534d2a6ab093d2afdb05c1f

manifest
manifest.uuid
src/alter.c
src/vdbeaux.c
test/alter.test
test/alter4.test
test/altercol.test
test/altertab.test

index c644c3e65c3215a1b6c02dfa6c6b4499aa3b1fa0..e4ad8122bf3e529ff59c58c87062c8dbb7a199b7 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fixes\sfor\sharmless\scompiler\swarnings.
-D 2018-09-01T20:02:07.316
+C Fix\sa\sproblem\swith\srenaming\sa\scolumn\sin\sa\stable\sthat\shas\sa\stemp\strigger\sthat\nreferences\sanother\sattached\sdatabase.
+D 2018-09-01T20:23:28.072
 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 24c05a7bccaa051754ca0adaed191d4d39a9a9e3508ab6ac5618a11d895258c2
+F src/alter.c f309bac1d1d2081d4a085225abc492b7feb0b9bb7954b8dcde38774fb3af9b3e
 F src/analyze.c 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9
 F src/attach.c 4bd5b92633671d3e8ce431153ebb1893b50335818423b5373f3f27969f79769a
 F src/auth.c 32a5bbe3b755169ab6c66311c5225a3cd4f75a46c041f7fb117e0cbb68055114
@@ -575,7 +575,7 @@ F src/vdbe.c dea0115a61f31227a116930c2f16b97f0a0e90abc7b87b09d1dfb8dc525b147b
 F src/vdbe.h 5081dcc497777efe5e9ebe7330d283a044a005e4bdda2e2e984f03bf89a0d907
 F src/vdbeInt.h f1f35f70460698d8f5a2bdef1001114babf318e2983a067804e2ae077d8e9827
 F src/vdbeapi.c 2ba821c5929a2769e4b217dd85843479c718b8989d414723ec8af0616a83d611
-F src/vdbeaux.c 1ee77344fe9fd6ac11fae6f0150f81e0eadf349a9957340089cf82284e6b379a
+F src/vdbeaux.c 0a769638bf4d9a9eb7b6a29f66b707441711c5775265404bbe1fafa0daa0c891
 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191
 F src/vdbemem.c 81329ab760e4ec0162119d9cd10193e0303c45c5935bb20c7ae9139d44dd6641
 F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f
@@ -597,14 +597,14 @@ F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
 F test/aggnested.test 18b00de006597e960a6b27ccec51474ac66cf1070a87c1933e5694dc02190ef1
 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
 F test/all.test ae17c4412639e16bd797c7617864a16c2badc0035c808ae8246f145e38f8e2f9
-F test/alter.test 31b4e9128887457f1a7bdfea4764513204e88f09e33e89bc32b84fdd3d21229a
+F test/alter.test 905d899b2f15d369244a8fa681d919423ecdffc4db44e317bc3499c9ccbcb154
 F test/alter2.test 7ea05c7d92ac99349a802ef7ada17294dd647060
 F test/alter3.test 4d79934d812eaeacc6f22781a080f8cfe012fdc3
-F test/alter4.test b6d7b86860111864f6cddb54af313f5862dda23b
-F test/altercol.test 42250da2cba6d94fdf21a4c39d79c733911d18a7c1453216ef0f48c6c118966d
+F test/alter4.test 7e93a21fe131e1dfeb317e90056856f96b10381fc7fe3a05e765569a23400433
+F test/altercol.test a5e24ad5e71afbf4a604336ee5f5287d3633ef26952b4ee8b5fe154a30ed2993
 F test/altermalloc.test e81ac9657ed25c6c5bb09bebfa5a047cd8e4acfc
 F test/altermalloc2.test 0231398534c494401a70a1d06a63d7849cb5b317fcc14228cbdb53039eba7eae
-F test/altertab.test 8c9631e9daca782905207c3c728c89181320d5ff8bfe1dc10cced233446a017f
+F test/altertab.test c273f24c1b23774ce3ab52e0e3535185e294efa93deb7032f07ab9ea2f8bb3e3
 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 2e2cf992f5d6cae2030c3c03b0eb98af3b130e86a719b991e41380138751f615
-R 153fdf1759fc10e48330c4fc6a239581
-U drh
-Z bdf4e49e19b8f1e7f13ad081d0e19df8
+P 41b8f38b97bf0d1abcd6de8e940269fc4c51e2bbcf7b2e53e0c8440c58187c33
+R 6b89208f27f74179353ae212d55d532a
+U dan
+Z 6ba4d58b7303508fcf7931b53df7a7cd
index cbb74de9e9cfdd413d8f6c2b927b2612a22098b6..02405e33f8789f00de7ab1e244ebad8d1f24ac77 100644 (file)
@@ -1 +1 @@
-41b8f38b97bf0d1abcd6de8e940269fc4c51e2bbcf7b2e53e0c8440c58187c33
\ No newline at end of file
+336b8a0923bf65b7a2c35811cb6dec0e262a0b31e534d2a6ab093d2afdb05c1f
\ No newline at end of file
index 08b2a276e4e123e902c7d185e481587fd5aac618..55990904449c554f421d59ec010c532923bbbec0 100644 (file)
@@ -561,17 +561,17 @@ void sqlite3AlterRenameColumn(
   bQuote = sqlite3Isquote(pNew->z[0]);
   sqlite3NestedParse(pParse, 
       "UPDATE \"%w\".%s SET "
-      "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d) "
+      "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) "
       "WHERE name NOT LIKE 'sqlite_%%' AND (type != 'index' OR tbl_name = %Q)"
       " AND sql NOT LIKE 'create virtual%%'",
       zDb, MASTER_NAME, 
-      zDb, pTab->zName, iCol, zNew, bQuote,
+      zDb, pTab->zName, iCol, zNew, bQuote, iSchema==1,
       pTab->zName
   );
 
   sqlite3NestedParse(pParse, 
       "UPDATE temp.%s SET "
-      "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d) "
+      "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, 1) "
       "WHERE type IN ('trigger', 'view')",
       MASTER_NAME, 
       zDb, pTab->zName, iCol, zNew, bQuote
@@ -1076,6 +1076,7 @@ static void renameParseCleanup(Parse *pParse){
 **   5. iCol:     Index of column to rename
 **   6. zNew:     New column name
 **   7. bQuote:   Non-zero if the new column name should be quoted.
+**   8. bTemp:    True if zSql comes from temp schema
 **
 ** Do a column rename operation on the CREATE statement given in zSql.
 ** The iCol-th column (left-most is 0) of table zTable is renamed from zCol
@@ -1105,8 +1106,8 @@ static void renameColumnFunc(
   int iCol = sqlite3_value_int(argv[5]);
   const char *zNew = (const char*)sqlite3_value_text(argv[6]);
   int bQuote = sqlite3_value_int(argv[7]);
+  int bTemp = sqlite3_value_int(argv[8]);
   const char *zOld;
-  int bTemp = 0;
   int rc;
   Parse sParse;
   Walker sWalker;
@@ -1361,7 +1362,7 @@ static void renameTableFunc(
       }
 
 #ifndef SQLITE_OMIT_TRIGGER
-      else if( sParse.pNewTrigger ){
+      else{
         Trigger *pTrigger = sParse.pNewTrigger;
         TriggerStep *pStep;
         if( 0==sqlite3_stricmp(sParse.pNewTrigger->table, zOld) 
@@ -1451,7 +1452,7 @@ static void renameTableTest(
 */
 void sqlite3AlterFunctions(void){
   static FuncDef aAlterTableFuncs[] = {
-    FUNCTION(sqlite_rename_column,  8, 0, 0, renameColumnFunc),
+    FUNCTION(sqlite_rename_column,  9, 0, 0, renameColumnFunc),
     FUNCTION(sqlite_rename_table,  5, 0, 0, renameTableFunc),
     FUNCTION(sqlite_rename_test,  5, 0, 0, renameTableTest),
   };
index 3592e5ed482621015cb3569c8406ff1126c50067..de8467988530ba023a207c7b5098a708cf6c92a8 100644 (file)
@@ -1662,7 +1662,6 @@ static void releaseMemArray(Mem *p, int N){
       testcase( p->flags & MEM_Agg );
       testcase( p->flags & MEM_Dyn );
       testcase( p->xDel==sqlite3VdbeFrameMemDel );
-      testcase( p->flags & MEM_RowSet );
       if( p->flags&(MEM_Agg|MEM_Dyn) ){
         sqlite3VdbeMemRelease(p);
       }else if( p->szMalloc ){
index 1b337af8704c01ab7d16908e00f00852e3abd7f5..d316fb3aab85f5c4fafd5d7ad5851f4ee70d8692 100644 (file)
@@ -685,7 +685,7 @@ do_test alter-8.2 {
 # rename_table() functions do not crash when handed bad input.
 #
 do_test alter-9.1 {
-  execsql {SELECT SQLITE_RENAME_COLUMN(0,0,0,0,0,0,0,0)}
+  execsql {SELECT SQLITE_RENAME_COLUMN(0,0,0,0,0,0,0,0,0)}
 } {{}}
 foreach {tn sql} {
     1 { SELECT SQLITE_RENAME_TABLE(0,0,0,0,0) }
index 5155110cf58d00f1366600b279535125c9a32b6a..ca9175959b13fad57368b68e5079009d24d704ef 100644 (file)
@@ -394,4 +394,32 @@ do_test alter4-10.1 {
   }
 } {ok}
 
+reset_db
+do_execsql_test alter4-11.0 {
+  CREATE TABLE t1(c INTEGER PRIMARY KEY, d);
+  PRAGMA foreign_keys = on;
+  ALTER TABLE t1 ADD COLUMN e;
+}
+
+do_execsql_test alter4-11.1 {
+  ALTER TABLE t1 ADD COLUMN f REFERENCES t1;
+}
+
+do_catchsql_test alter4-11.2 {
+  ALTER TABLE t1 ADD COLUMN g REFERENCES t1 DEFAULT 4;
+} {1 {Cannot add a REFERENCES column with non-NULL default value}}
+
+do_catchsql_test alter4-11.3 {
+  ALTER TABLE t2 ADD COLUMN g;
+} {1 {no such table: t2}}
+
+ifcapable fts5 {
+  do_execsql_test alter4-11.4 {
+    CREATE VIRTUAL TABLE fff USING fts5(f);
+  }
+  do_catchsql_test alter4-11.2 {
+    ALTER TABLE fff ADD COLUMN g;
+  } {1 {virtual tables may not be altered}}
+}
+
 finish_test
index 2acd28894b143795a755007b5148f8e3400aa683..9fac337b543437b37500989da4482f3f25953b82 100644 (file)
@@ -516,7 +516,7 @@ ifcapable fts5 {
   }
   do_catchsql_test 12.3.2 {
     ALTER TABLE ft RENAME a TO z;
-  } {1 {columns of virtual table ft may not be renamed}}
+  } {1 {cannot rename columns of virtual table "ft"}}
 }
 
 do_execsql_test 12.4.1 {
@@ -626,14 +626,17 @@ do_execsql_test 14.1 {
   ), (
       'CREATE TABLE x1(i INTEGER, t TEXT)',
       'table', 'x1', 'main', 'notable', 0, 'zzz', 0
+  ), (
+      'CREATE TABLE x1(i INTEGER, t TEXT)',
+      'table', 'x1', 'main', 'ddd', -1, 'zzz', 0
   );
 } {}
 
 do_execsql_test 14.2 {
   SELECT 
-  sqlite_rename_column(sql, type, object, db, tbl, icol, znew, bquote)
+  sqlite_rename_column(sql, type, object, db, tbl, icol, znew, bquote, 0)
   FROM ddd;
-} {{} {} {}}
+} {{} {} {} {}}
 
 #-------------------------------------------------------------------------
 #
@@ -709,4 +712,44 @@ do_execsql_test 16.2.3 {
   SELECT * FROM v5;
 } {3 456 20456 0}
 
+#-------------------------------------------------------------------------
+#
+do_execsql_test 17.0 {
+  CREATE TABLE u7(x, y, z);
+  CREATE TRIGGER u7t AFTER INSERT ON u7 BEGIN
+    INSERT INTO u8 VALUES(new.x, new.y, new.z);
+  END;
+} {}
+do_catchsql_test 17.1 {
+  ALTER TABLE u7 RENAME x TO xxx;
+} {1 {error in trigger u7t: no such table: main.u8}}
+
+do_execsql_test 17.2 {
+  CREATE TEMP TABLE uu7(x, y, z);
+  CREATE TRIGGER uu7t AFTER INSERT ON uu7 BEGIN
+    INSERT INTO u8 VALUES(new.x, new.y, new.z);
+  END;
+} {}
+do_catchsql_test 17.3 {
+  ALTER TABLE uu7 RENAME x TO xxx;
+} {1 {error in trigger uu7t: no such table: u8}}
+
+reset_db
+forcedelete test.db2
+do_execsql_test 18.0 {
+  ATTACH 'test.db2' AS aux;
+  CREATE TABLE t1(a);
+  CREATE TABLE aux.log(v);
+  CREATE TEMP TRIGGER tr1 AFTER INSERT ON t1 BEGIN
+    INSERT INTO log VALUES(new.a);
+  END;
+  INSERT INTO t1 VALUES(111);
+  SELECT v FROM log;
+} {111}
+
+do_execsql_test 18.1 {
+  ALTER TABLE t1 RENAME a TO b;
+}
+
+
 finish_test
index fb0dd7dec836694553a9f58d7b5d2389434fc6c2..848f2cba566565a8784e066d22eab194921dddc4 100644 (file)
@@ -205,6 +205,44 @@ do_catchsql_test 5.6 {
   ALTER TABLE t2 RENAME TO one;
 } {1 {error in view vv after rename: ambiguous column name: one.a}}
 
+#-------------------------------------------------------------------------
+
+register_tcl_module db
+proc tcl_command {method args} {
+  switch -- $method {
+    xConnect {
+      return "CREATE TABLE t1(a, b, c)"
+    }
+  }
+  return {}
+}
+
+do_execsql_test 6.0 {
+  CREATE VIRTUAL TABLE x1 USING tcl(tcl_command);
+}
+
+do_execsql_test 6.1 {
+  ALTER TABLE x1 RENAME TO x2;
+  SELECT sql FROM sqlite_master WHERE name = 'x2'
+} {{CREATE VIRTUAL TABLE "x2" USING tcl(tcl_command)}}
+
+do_execsql_test 7.1 {
+  CREATE TABLE ddd(db, sql, zOld, zNew, bTemp);
+  INSERT INTO ddd VALUES(
+      'main', 'CREATE TABLE x1(i INTEGER, t TEXT)', 'ddd', NULL, 0
+  ), (
+      'main', 'CREATE TABLE x1(i INTEGER, t TEXT)', NULL, 'eee', 0
+  ), (
+      'main', NULL, 'ddd', 'eee', 0
+  );
+} {}
+
+do_execsql_test 7.2 {
+  SELECT 
+  sqlite_rename_table(db, sql, zOld, zNew, bTemp)
+  FROM ddd;
+} {{} {} {}}
+
 finish_test