]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
After modifying and reparsing the schema as part of an ALTER TABLE RENAME
authordan <dan@noemail.net>
Fri, 24 Aug 2018 17:55:49 +0000 (17:55 +0000)
committerdan <dan@noemail.net>
Fri, 24 Aug 2018 17:55:49 +0000 (17:55 +0000)
COLUMN, check that no new schema errors have been introduced (e.g. ambiguous
column names in views) before committing the operation.

FossilOrigin-Name: a0e06d2c5e3abb3f300491e7651bb177a436899efd4506de9239359096b6a9e7

manifest
manifest.uuid
src/alter.c
src/vdbe.c
test/altercol.test

index 7df39d4857b2ecb3a58ac2fdf8ed07de786604e4..bfd9033e269ff811b7903c85c9c93d6121f9ec49 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Avoid\sincorrectly\sreplacing\stokens\sthat\srefer\sto\sa\scolumn\sbeing\srenamed\svia\san\nalias.\sFor\sexample,\sdo\snot\soverwrite\s"xyz"\swhen\s"a"\sis\srenamed\sin\s"CREATE\sVIEW\nv1\sAS\sSELECT\sa\sAS\sxyz\sFROM\stbl\sWHERE\sxyz=1"
-D 2018-08-24T16:04:26.814
+C After\smodifying\sand\sreparsing\sthe\sschema\sas\spart\sof\san\sALTER\sTABLE\sRENAME\nCOLUMN,\scheck\sthat\sno\snew\sschema\serrors\shave\sbeen\sintroduced\s(e.g.\sambiguous\ncolumn\snames\sin\sviews)\sbefore\scommitting\sthe\soperation.
+D 2018-08-24T17:55:49.159
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in 2729786d5d188974913f07ea63cc84cd42cb9cac5f4aac823c40105e68e22f63
@@ -432,7 +432,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca
 F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
 F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
-F src/alter.c 6b381569b17aa08fc66a90bdc551bb9b81435340d7deaa6c4b0527daa83f512d
+F src/alter.c 4433a45020f111b317e435e9a23c190ce42859856aa852f3601c25252ec71b36
 F src/analyze.c 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9
 F src/attach.c 4bd5b92633671d3e8ce431153ebb1893b50335818423b5373f3f27969f79769a
 F src/auth.c 32a5bbe3b755169ab6c66311c5225a3cd4f75a46c041f7fb117e0cbb68055114
@@ -569,7 +569,7 @@ F src/upsert.c 47edd408cc73f8d3c00a140550d1ad180b407c146285947969dd09874802bf88
 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
 F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157
 F src/vacuum.c 36e7d21a20c0bf6ef4ef7c399d192b5239410b7c4d3c1070fba4e30810d0b855
-F src/vdbe.c 18482b9a1ac73c62487dd034da342d464ab9b59cae2abfb4cb234ba8fa7ba16f
+F src/vdbe.c 7a8fc343ce0d852fe1f37c1d7d763a9f22f6f26d2c594293d77313acbc527821
 F src/vdbe.h 5081dcc497777efe5e9ebe7330d283a044a005e4bdda2e2e984f03bf89a0d907
 F src/vdbeInt.h 8ea493d994c6697cf7bccc60583a80a0222560490410f60f1113e90d36643ce0
 F src/vdbeapi.c 2ba821c5929a2769e4b217dd85843479c718b8989d414723ec8af0616a83d611
@@ -599,7 +599,7 @@ F test/alter.test b820ab9dcf85f8e3a65bc8326accb2f0c7be64ef
 F test/alter2.test 7ea05c7d92ac99349a802ef7ada17294dd647060
 F test/alter3.test 4d79934d812eaeacc6f22781a080f8cfe012fdc3
 F test/alter4.test b6d7b86860111864f6cddb54af313f5862dda23b
-F test/altercol.test 2630ee56984ec0bf1ffe9e9c0f19f08e0f4962b1a3dc2c97f56469df0fce5ffa
+F test/altercol.test f83599801f862cb9895f3668bf53938b63768200475264071dce17cd068d2504
 F test/altermalloc.test e81ac9657ed25c6c5bb09bebfa5a047cd8e4acfc
 F test/altermalloc2.test 0231398534c494401a70a1d06a63d7849cb5b317fcc14228cbdb53039eba7eae
 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f
@@ -1758,7 +1758,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 2130a407ddd8cdf3d29b109d773686c84906d9dc1663376e94e191086d524c9e
-R 3288412afc8417a36ede2c0a50dfeb71
+P ad072a835f97ff418f5919d94f547ce8afb4fc7c7b590deba41f1e62136a79ac
+R 50e702b70e1b28f7dff750a067872247
 U dan
-Z e33854cf85c7ee776de972d8bfdb3701
+Z 41b7da7875d5ec2dd7c0f2a1bfa5aab4
index b96da21994b151e1862c179a8c8ddf03c436b142..a543c86ea014a46507c4e768ee48c57dfa6e57a0 100644 (file)
@@ -1 +1 @@
-ad072a835f97ff418f5919d94f547ce8afb4fc7c7b590deba41f1e62136a79ac
\ No newline at end of file
+a0e06d2c5e3abb3f300491e7651bb177a436899efd4506de9239359096b6a9e7
\ No newline at end of file
index c42b7bb20e7a5971331a816bb71a5344e6da4e58..d2554a69361761bd025003b367f22d83ab7da706 100644 (file)
@@ -892,6 +892,17 @@ void sqlite3AlterRenameColumn(
     sqlite3VdbeAddParseSchemaOp(pParse->pVdbe, iSchema, 0);
   }
 
+  sqlite3NestedParse(pParse, 
+      "SELECT 1 "
+      "FROM \"%w\".%s "
+      "WHERE name NOT LIKE 'sqlite_%%' AND (type != 'index' OR tbl_name = %Q)"
+      " AND sql NOT LIKE 'create virtual%%'"
+      " AND sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, -1)=0 ",
+      zDb, MASTER_NAME, 
+      pTab->zName,
+      zDb, pTab->zName, iCol, zNew
+  );
+
  exit_rename_column:
   sqlite3SrcListDelete(db, pSrc);
   sqlite3DbFree(db, zOld);
@@ -1070,6 +1081,7 @@ static RenameToken *renameColumnTokenNext(RenameCtx *pCtx){
 */
 static void renameColumnParseError(
   sqlite3_context *pCtx, 
+  int bPost,
   sqlite3_value *pType,
   sqlite3_value *pObject,
   Parse *pParse
@@ -1078,7 +1090,10 @@ static void renameColumnParseError(
   const char *zN = (const char*)sqlite3_value_text(pObject);
   char *zErr;
 
-  zErr = sqlite3_mprintf("error processing %s %s: %s", zT, zN, pParse->zErrMsg);
+  zErr = sqlite3_mprintf("error in %s %s%s: %s", 
+      zT, zN, (bPost ? " after rename" : ""),
+      pParse->zErrMsg
+  );
   sqlite3_result_error(pCtx, zErr, -1);
   sqlite3_free(zErr);
 }
@@ -1140,7 +1155,10 @@ static void renameColumnIdlistNames(
 **   4. Table:    Table name
 **   5. iCol:     Index of column to rename
 **   6. zNew:     New column name
-**   7. bQuote:   True if the new column name should be quoted
+**   7. bQuote:   Non-zero if the new column name should be quoted. Negative
+**                if this function is being called to check that the schema
+**                can still be parsed and symbols resolved after the column
+**                has been renamed.
 **
 ** 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
@@ -1437,7 +1455,7 @@ static void renameColumnFunc(
 renameColumnFunc_done:
   if( rc!=SQLITE_OK ){
     if( sParse.zErrMsg ){
-      renameColumnParseError(context, argv[1], argv[2], &sParse);
+      renameColumnParseError(context, (bQuote<0), argv[1], argv[2], &sParse);
     }else{
       sqlite3_result_error_code(context, rc);
     }
index c8ee9860f830ea779db1269b406122752bacce53..7b375b47d1643f09e977f10c1c8bcead2f7e988a 100644 (file)
@@ -5754,6 +5754,7 @@ case OP_ParseSchema: {
     db->mDbFlags &= ~DBFLAG_SchemaKnownOk;
     rc = sqlite3InitOne(db, iDb, &p->zErrMsg, INITFLAG_AlterTable);
     db->mDbFlags |= DBFLAG_SchemaChange;
+    p->expired = 0;
   }else
 #endif
   {
index c797bf639d6efdb125d76b2dac1dd11d486c70c2..4f27c247e0ee28e02ffba28f62fa4d8323255ba1 100644 (file)
@@ -341,7 +341,7 @@ do_execsql_test 8.4.4 {
 do_catchsql_test 8.4.5 {
   CREATE VIEW zzz AS SELECT george, ringo FROM b1;
   ALTER TABLE b1 RENAME a TO aaa;
-} {1 {error processing view zzz: no such column: george}}
+} {1 {error in view zzz: no such column: george}}
 
 #-------------------------------------------------------------------------
 # More triggers.
@@ -472,7 +472,7 @@ do_execsql_test 11.2 {
 
 do_catchsql_test 11.3 {
   ALTER TABLE x1 RENAME c TO ccc;
-} {1 {error processing view v1: no such module: echo}}
+} {1 {error in view v1: no such module: echo}}
 
 #-------------------------------------------------------------------------
 # Test some error conditions:
@@ -541,7 +541,7 @@ do_execsql_test 13.1.1 {
 
 do_catchsql_test 13.1.2 {
   ALTER TABLE x1 RENAME COLUMN t TO ttt;
-} {1 {error processing trigger tr1: no such table: main.nosuchtable}}
+} {1 {error in trigger tr1: no such table: main.nosuchtable}}
 
 do_execsql_test 13.1.3 {
   DROP TRIGGER tr1;
@@ -556,7 +556,7 @@ do_execsql_test 13.1.4 {
 
 do_catchsql_test 13.1.5 {
   ALTER TABLE x1 RENAME COLUMN t TO ttt;
-} {1 {error processing index x1i: no such column: j}}
+} {1 {error in index x1i: no such column: j}}
 
 do_execsql_test 13.1.6 {
   UPDATE sqlite_master SET sql = '' WHERE name='x1i';
@@ -607,7 +607,7 @@ foreach {tn trigger error} {
 
   do_catchsql_test 13.2.$tn.2 {
     ALTER TABLE x1 RENAME COLUMN t TO ttt;
-  } "1 {error processing trigger tr1: $error}"
+  } "1 {error in trigger tr1: $error}"
 }
 
 #-------------------------------------------------------------------------
@@ -650,4 +650,25 @@ do_execsql_test 15.2 {
   SELECT sql FROM sqlite_master WHERE type='view';
 } {{CREATE VIEW vvv AS SELECT xyz AS d FROM xxx WHERE d=0}}
 
+#-------------------------------------------------------------------------
+#
+do_execsql_test 16.0 {
+  CREATE TABLE t1(a,b,c);
+  CREATE TABLE t2(d,e,f);
+  INSERT INTO t1 VALUES(1,2,3);
+  INSERT INTO t2 VALUES(4,5,6);
+  CREATE VIEW v4 AS SELECT a, d FROM t1, t2;
+  SELECT * FROM v4;
+} {1 4}
+
+do_catchsql_test 16.1 {
+  ALTER TABLE t2 RENAME d TO a;
+} {1 {error in view v4 after rename: ambiguous column name: a}}
+
+do_execsql_test 16.2 {
+  SELECT * FROM v4;
+} {1 4}
+
+reset_db
+
 finish_test