]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Enhance the sqldiff utility to deal gracefully with ALTER TABLE ADD COLUMN.
authordrh <drh@noemail.net>
Sat, 7 Nov 2015 18:32:17 +0000 (18:32 +0000)
committerdrh <drh@noemail.net>
Sat, 7 Nov 2015 18:32:17 +0000 (18:32 +0000)
FossilOrigin-Name: 7ea036ac37397ed8f6a0fa9f5bfc0994364b53dc

manifest
manifest.uuid
tool/sqldiff.c

index b2a16a73948f103644f53fe6ea3d79f245314020..1c72713975d52b4df154c33a5297ddf731819d5c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sbug\sin\sCTE\shandling\sdiscovered\sby\sLibFuzzer\sthat\scan\scause\san\sinfinite\sloop\sin\sthe\squery\splanner.
-D 2015-11-07T18:07:15.260
+C Enhance\sthe\ssqldiff\sutility\sto\sdeal\sgracefully\swith\sALTER\sTABLE\sADD\sCOLUMN.
+D 2015-11-07T18:32:17.087
 F Makefile.in 3a705bb4bd12e194212ddbdbf068310d17153cdb
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 702d3e98f3afc6587a78481257f3c4c900efc3a4
@@ -1390,7 +1390,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd
 F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c
-F tool/sqldiff.c b318efc2eaf7a7fac4d281a0ce736193cb2506df
+F tool/sqldiff.c 37ab2cd4f0c8b4f0bbdc2f41f63f0f262e25805d
 F tool/stack_usage.tcl f8e71b92cdb099a147dad572375595eae55eca43
 F tool/symbols-mingw.sh 4dbcea7e74768305384c9fd2ed2b41bbf9f0414d
 F tool/symbols.sh fec58532668296d7c7dc48be9c87f75ccdb5814f
@@ -1401,8 +1401,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 0f5b147d1fe83c34d0fbeacc7422be94d8441bc1 e7e65c7559ed43e7065adc2ec1bd242bf187b7c3
-R 0a66e1cb90e0f88ea5b94da656f84e5f
-T +closed e7e65c7559ed43e7065adc2ec1bd242bf187b7c3
-U dan
-Z 97f5561994d709cf0287df4980640bc9
+P 088009efdd56160bb4eee0fbd829a529b141274e
+R 6849733f18d4f768e8de91b6fdec79e9
+U drh
+Z e7f3d6622d7fdf445d9b0889f3775adc
index 576eda30afa3f5c98e54e1c8a0566251d1e45acd..4bc50f23f29dc3f103bec1c47dd3caff1ba19c00 100644 (file)
@@ -1 +1 @@
-088009efdd56160bb4eee0fbd829a529b141274e
\ No newline at end of file
+7ea036ac37397ed8f6a0fa9f5bfc0994364b53dc
\ No newline at end of file
index 9f0b705c40ab95ab27ae2dda9fb8c994cdeba751..944968fe0587dd50b1fedd304b57a7513e13c425 100644 (file)
@@ -558,7 +558,7 @@ static void diff_one_table(const char *zTab, FILE *out){
   az = columnNames("main", zTab, &nPk, 0);
   az2 = columnNames("aux", zTab, &nPk2, 0);
   if( az && az2 ){
-    for(n=0; az[n]; n++){
+    for(n=0; az[n] && az2[n]; n++){
       if( sqlite3_stricmp(az[n],az2[n])!=0 ) break;
     }
   }
@@ -568,13 +568,15 @@ static void diff_one_table(const char *zTab, FILE *out){
    || az[n]
   ){
     /* Schema mismatch */
-    fprintf(out, "DROP TABLE %s;\n", zId);
+    fprintf(out, "DROP TABLE %s; -- due to schema mismatch\n", zId);
     dump_table(zTab, out);
     goto end_diff_one_table;
   }
 
   /* Build the comparison query */
-  for(n2=n; az[n2]; n2++){}
+  for(n2=n; az2[n2]; n2++){
+    fprintf(out, "ALTER TABLE %s ADD COLUMN %s;\n", zId, safeId(az2[n2]));
+  }
   nQ = nPk2+1+2*(n2-nPk2);
   if( n2>nPk2 ){
     zSep = "SELECT ";
@@ -585,7 +587,12 @@ static void diff_one_table(const char *zTab, FILE *out){
     strPrintf(&sql, ", 1%s -- changed row\n", nPk==n ? "" : ",");
     while( az[i] ){
       strPrintf(&sql, "       A.%s IS NOT B.%s, B.%s%s\n",
-                az[i], az[i], az[i], i==n2-1 ? "" : ",");
+                az[i], az2[i], az2[i], az2[i+1]==0 ? "" : ",");
+      i++;
+    }
+    while( az2[i] ){
+      strPrintf(&sql, "       B.%s IS NOT NULL, B.%s%s\n",
+                az2[i], az2[i], az2[i+1]==0 ? "" : ",");
       i++;
     }
     strPrintf(&sql, "  FROM main.%s A, aux.%s B\n", zId, zId);
@@ -597,7 +604,13 @@ static void diff_one_table(const char *zTab, FILE *out){
     zSep = "\n   AND (";
     while( az[i] ){
       strPrintf(&sql, "%sA.%s IS NOT B.%s%s\n",
-                zSep, az[i], az[i], i==n2-1 ? ")" : "");
+                zSep, az[i], az2[i], az2[i+1]==0 ? ")" : "");
+      zSep = "        OR ";
+      i++;
+    }
+    while( az2[i] ){
+      strPrintf(&sql, "%sB.%s IS NOT NULL%s\n",
+                zSep, az2[i], az2[i+1]==0 ? ")" : "");
       zSep = "        OR ";
       i++;
     }
@@ -609,7 +622,7 @@ static void diff_one_table(const char *zTab, FILE *out){
     zSep = ", ";
   }
   strPrintf(&sql, ", 2%s -- deleted row\n", nPk==n ? "" : ",");
-  while( az[i] ){
+  while( az2[i] ){
     strPrintf(&sql, "       NULL, NULL%s\n", i==n2-1 ? "" : ",");
     i++;
   }
@@ -628,7 +641,7 @@ static void diff_one_table(const char *zTab, FILE *out){
   }
   strPrintf(&sql, ", 3%s -- inserted row\n", nPk==n ? "" : ",");
   while( az2[i] ){
-    strPrintf(&sql, "       1, B.%s%s\n", az[i], i==n2-1 ? "" : ",");
+    strPrintf(&sql, "       1, B.%s%s\n", az2[i], az2[i+1]==0 ? "" : ",");
     i++;
   }
   strPrintf(&sql, "  FROM aux.%s B\n", zId);