]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Enhance the ALTER TABLE RENAME COLUMN feature so that it works on tables
authordrh <drh@noemail.net>
Wed, 9 Jan 2019 02:02:24 +0000 (02:02 +0000)
committerdrh <drh@noemail.net>
Wed, 9 Jan 2019 02:02:24 +0000 (02:02 +0000)
that have redundant UNIQUE and/or PRIMARY KEY constraints.
Fix for ticket [bc8d94f0fbd633fd9a051e3]

FossilOrigin-Name: f09aa3248e2b4a32ff5b5d37084cb2a27445322cb06a3354cef723f4f0b2cd34

manifest
manifest.uuid
src/alter.c
src/build.c
src/sqliteInt.h
test/altercol.test

index 6160f40a142f190c0720bd13593875c65204fa06..d8002eef9c15821c6a6ab0c5af2175f5e9dd4dd0 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Use\s64-bit\smath\sto\scompute\sthe\ssizes\sof\smemory\sallocations\sin\sextensions.
-D 2019-01-08T20:02:48.571
+C Enhance\sthe\sALTER\sTABLE\sRENAME\sCOLUMN\sfeature\sso\sthat\sit\sworks\son\stables\nthat\shave\sredundant\sUNIQUE\sand/or\sPRIMARY\sKEY\sconstraints.\nFix\sfor\sticket\s[bc8d94f0fbd633fd9a051e3]
+D 2019-01-09T02:02:24.819
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6
@@ -446,7 +446,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca
 F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
 F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
-F src/alter.c 082286f89160ca2302d51650e173b745ef78c42b6a7ebc3262d9cb166596c7ca
+F src/alter.c 9dda6a9cb20634fc4f65101a57ec43692f729164fa60dc1b0c78d344184a8431
 F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644
 F src/attach.c 92b51739a885da8bd84bc9a05485f1e48148bce5c15432f059b45af98fff75cd
 F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df
@@ -456,7 +456,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
 F src/btree.c 9632272d3c41c7dab61bd96ae419ee5786b7b49cb14dc75a5550b20758c08893
 F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2
 F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96
-F src/build.c 5ca38181e826bcc35e0176c31a691d897ed0cc708fc935fd51e8023705cdcf1a
+F src/build.c 2a1b80dbe783649d4cc59e33e08fc7e563f15e05ec0f6365c441d45e16bcd481
 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b
@@ -517,7 +517,7 @@ F src/shell.c.in 0722a9e3a1b23674f07c194b8f71c953c775bad280e7f179a32bf72cd009b56
 F src/sqlite.h.in b54cd42d2f3b739a00de540cafe2dcd0de3b8e1748a2db33a68def487e9e602f
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683
-F src/sqliteInt.h 488f9b86c15d09d42af921e4e2383dac289aa541a59daf78822bfcd656b59ff9
+F src/sqliteInt.h 57f7bfa8a64e6f37e256ab4137e22cd74b9cde1e8669d44bba46c13105b4d27e
 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
@@ -615,7 +615,7 @@ F test/alter3.test 4d79934d812eaeacc6f22781a080f8cfe012fdc3
 F test/alter4.test 7e93a21fe131e1dfeb317e90056856f96b10381fc7fe3a05e765569a23400433
 F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959
 F test/alterauth2.test c0a1ddf5b93d93cb0d15ba7acaf0c5c6fb515bbe861ede75b2d3fabad33b6499
-F test/altercol.test 313ed080ed61691c52cd87053129889f71582d6d0efebdd5f3edad2a98c66874
+F test/altercol.test 54374d2ba18af25bb24e23acf18a60270d4ec120b7ec0558078b59d5aa1a31ad
 F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b
 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9
 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b
@@ -1797,7 +1797,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 ce51f1a2b6a1789a5876e01cf829e45d84f3851d135a2fa5c44a56f948673a60
-R 938a88bb1780a4f9536e35effec3bbb8
+P ca67f2ec0e294384c397db438605df1b47aae5f348a8de94f97286997625d169
+R af2c1cedc8f3f69cab4d85bf53ec7003
 U drh
-Z afd7af7f7b88ef891b9e1f98a487b805
+Z 39f916b96ea6a4b0b2d0a87edcd02ba6
index 45a30bc40cb82fb34e774902b6d6eefd757a2fa2..c64e6eee020d1d1364cddba2177733ea5223062a 100644 (file)
@@ -1 +1 @@
-ca67f2ec0e294384c397db438605df1b47aae5f348a8de94f97286997625d169
\ No newline at end of file
+f09aa3248e2b4a32ff5b5d37084cb2a27445322cb06a3354cef723f4f0b2cd34
\ No newline at end of file
index e0cae968b6c02d18d710e82b1a16129b0c924e38..a47e18daf157bef9373a4a36edf184c2c4ae8d15 100644 (file)
@@ -961,7 +961,6 @@ static int renameParseSql(
   rc = sqlite3RunParser(p, zSql, &zErr);
   assert( p->zErrMsg==0 );
   assert( rc!=SQLITE_OK || zErr==0 );
-  assert( (0!=p->pNewTable) + (0!=p->pNewIndex) + (0!=p->pNewTrigger)<2 );
   p->zErrMsg = zErr;
   if( db->mallocFailed ) rc = SQLITE_NOMEM;
   if( rc==SQLITE_OK 
@@ -1181,11 +1180,15 @@ static void renameWalkTrigger(Walker *pWalker, Trigger *pTrigger){
 */
 static void renameParseCleanup(Parse *pParse){
   sqlite3 *db = pParse->db;
+  Index *pIdx;
   if( pParse->pVdbe ){
     sqlite3VdbeFinalize(pParse->pVdbe);
   }
   sqlite3DeleteTable(db, pParse->pNewTable);
-  if( pParse->pNewIndex ) sqlite3FreeIndex(db, pParse->pNewIndex);
+  while( (pIdx = pParse->pNewIndex)!=0 ){
+    pParse->pNewIndex = pIdx->pNext;
+    sqlite3FreeIndex(db, pIdx);
+  }
   sqlite3DeleteTrigger(db, pParse->pNewTrigger);
   sqlite3DbFree(db, pParse->zErrMsg);
   renameTokenFree(db, pParse->pRename);
@@ -1296,6 +1299,9 @@ static void renameColumnFunc(
         for(pIdx=sParse.pNewTable->pIndex; pIdx; pIdx=pIdx->pNext){
           sqlite3WalkExprList(&sWalker, pIdx->aColExpr);
         }
+        for(pIdx=sParse.pNewIndex; pIdx; pIdx=pIdx->pNext){
+          sqlite3WalkExprList(&sWalker, pIdx->aColExpr);
+        }
       }
 
       for(pFKey=sParse.pNewTable->pFKey; pFKey; pFKey=pFKey->pNextFrom){
index ab90e12d2499f3e4361367e8a2681b587428298a..68e708129e622940522d53d8e21769a0a0bbad77 100644 (file)
@@ -3467,6 +3467,11 @@ void sqlite3CreateIndex(
           }
         }
         if( idxType==SQLITE_IDXTYPE_PRIMARYKEY ) pIdx->idxType = idxType;
+        if( IN_RENAME_OBJECT ){
+          pIndex->pNext = pParse->pNewIndex;
+          pParse->pNewIndex = pIndex;
+          pIndex = 0;
+        }
         goto exit_create_index;
       }
     }
index 17c93285b870c7eb1e630bf21044eb68a7cb29cb..9bc8160db971582cbb4d4e86a9e31aff6df9aec6 100644 (file)
@@ -3134,7 +3134,9 @@ struct Parse {
   Vdbe *pReprepare;         /* VM being reprepared (sqlite3Reprepare()) */
   const char *zTail;        /* All SQL text past the last semicolon parsed */
   Table *pNewTable;         /* A table being constructed by CREATE TABLE */
-  Index *pNewIndex;         /* An index being constructed by CREATE INDEX */
+  Index *pNewIndex;         /* An index being constructed by CREATE INDEX.
+                            ** Also used to hold redundant UNIQUE constraints
+                            ** during a RENAME COLUMN */
   Trigger *pNewTrigger;     /* Trigger under construct by a CREATE TRIGGER */
   const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */
 #ifndef SQLITE_OMIT_VIRTUALTABLE
index 6810aabf4eaf19e7b716336c9d2f3b9c8afdbe02..d71a9b06e42bf643cf1c0819ffbdf98dbcce10e0 100644 (file)
@@ -778,6 +778,32 @@ do_execsql_test 19.1 {
   {CREATE VIEW v2(e) AS SELECT coalesce(t2.c,t1.f) FROM t1, t2 WHERE t1.b=t2.d}
 }
 
+# 2019-01-08: https://www.sqlite.org/src/tktview/bc8d94f0fbd633fd9a051e3
+#
+# ALTER TABLE RENAME COLUMN does not work for tables that have redundant
+# UNIQUE constraints.
+#
+sqlite3 db :memory:
+do_execsql_test 20.100 {
+  CREATE TABLE t1(aaa,b,c,UNIQUE(aaA),PRIMARY KEY(aAa),UNIQUE(aAA));
+  ALTER TABLE t1 RENAME aaa TO bbb;
+  SELECT sql FROM sqlite_master WHERE name='t1';
+} {{CREATE TABLE t1(bbb,b,c,UNIQUE(bbb),PRIMARY KEY(bbb),UNIQUE(bbb))}}
+do_execsql_test 20.105 {
+  DROP TABLE t1;
+  CREATE TABLE t1(aaa,b,c,UNIQUE(aaA),PRIMARY KEY(aAa),UNIQUE(aAA))WITHOUT ROWID;
+  ALTER TABLE t1 RENAME aaa TO bbb;
+  SELECT sql FROM sqlite_master WHERE name='t1';
+} {{CREATE TABLE t1(bbb,b,c,UNIQUE(bbb),PRIMARY KEY(bbb),UNIQUE(bbb))WITHOUT ROWID}}
+do_execsql_test 20.110 {
+  DROP TABLE t1;
+  CREATE TABLE t1(aa UNIQUE,bb UNIQUE,cc UNIQUE,UNIQUE(aA),PRIMARY KEY(bB),UNIQUE(cC));
+  ALTER TABLE t1 RENAME aa TO xx;
+  ALTER TABLE t1 RENAME bb TO yy;
+  ALTER TABLE t1 RENAME cc TO zz;
+  SELECT sql FROM sqlite_master WHERE name='t1';
+} {{CREATE TABLE t1(xx UNIQUE,yy UNIQUE,zz UNIQUE,UNIQUE(xx),PRIMARY KEY(yy),UNIQUE(zz))}}
+
 
 
 finish_test