From: dan Date: Fri, 31 Jul 2015 15:13:29 +0000 (+0000) Subject: Fix a problem causing [sqldiff --rbu] to fail on tables for which all columns are... X-Git-Tag: version-3.9.0~248 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dd688e797025c3cc8070e868905c1fa1db357c8b;p=thirdparty%2Fsqlite.git Fix a problem causing [sqldiff --rbu] to fail on tables for which all columns are part of the PRIMARY KEY. FossilOrigin-Name: 93449e7046d60cad020ca439ded82e759c2e3cd9 --- diff --git a/ext/rbu/rbudiff.test b/ext/rbu/rbudiff.test index 4e4f65f0a3..a24c1f5ce9 100644 --- a/ext/rbu/rbudiff.test +++ b/ext/rbu/rbudiff.test @@ -53,48 +53,77 @@ proc apply_rbudiff {sql target} { } proc rbudiff_cksum {db1} { + set txt "" + sqlite3 dbtmp $db1 - set txt [dbtmp eval { - SELECT a || '.' || b || '.' || c FROM t1 ORDER BY 1; - SELECT a || '.' || b || '.' || c FROM t2 ORDER BY 1; - }] + foreach tbl [dbtmp eval {SELECT name FROM sqlite_master WHERE type='table'}] { + append txt [dbtmp eval \ + "SELECT a || '.' || b || '.' || c FROM $tbl ORDER BY 1" + ] + } dbtmp close + md5 $txt } -sqlite3 db test.db -do_execsql_test 1.0 { - CREATE TABLE t1(a PRIMARY KEY, b, c); - INSERT INTO t1 VALUES(1, 2, 3); - INSERT INTO t1 VALUES(4, 5, 6); +foreach {tn init mod} { + 1 { + CREATE TABLE t1(a PRIMARY KEY, b, c); + INSERT INTO t1 VALUES(1, 2, 3); + INSERT INTO t1 VALUES(4, 5, 6); + + CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c)); + INSERT INTO t2 VALUES(1, 2, 3); + INSERT INTO t2 VALUES(4, 5, 6); + } { + INSERT INTO t1 VALUES(7, 8, 9); + DELETE FROM t1 WHERE a=4; + UPDATE t1 SET c = 11 WHERE a = 1; + + INSERT INTO t2 VALUES(7, 8, 9); + DELETE FROM t2 WHERE a=4; + UPDATE t2 SET c = 11 WHERE a = 1; + } - CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c)); - INSERT INTO t2 VALUES(1, 2, 3); - INSERT INTO t2 VALUES(4, 5, 6); -} + 2 { + CREATE TABLE t1(a, b, c, PRIMARY KEY(a, b, c)); + INSERT INTO t1 VALUES('u', 'v', 'w'); + INSERT INTO t1 VALUES('x', 'y', 'z'); + } { + DELETE FROM t1 WHERE a='u'; + INSERT INTO t1 VALUES('a', 'b', 'c'); + } -db close -forcedelete test.db2 -forcecopy test.db test.db2 - -sqlite3 db test.db -do_execsql_test 1.1 { - INSERT INTO t1 VALUES(7, 8, 9); - DELETE FROM t1 WHERE a=4; - UPDATE t1 SET c = 11 WHERE a = 1; - - INSERT INTO t2 VALUES(7, 8, 9); - DELETE FROM t2 WHERE a=4; - UPDATE t2 SET c = 11 WHERE a = 1; -} -db close +} { + + catch { db close } -do_test 1.2 { - set sql [get_rbudiff_sql test.db test.db2] - apply_rbudiff $sql test.db -} {SQLITE_DONE} + forcedelete test.db test.db2 + sqlite3 db test.db + db eval "$init" + sqlite3 db test.db2 + db eval "$init ; $mod" + db close -do_test 1.3 { rbudiff_cksum test.db } [rbudiff_cksum test.db2] + do_test 1.$tn.2 { + set sql [get_rbudiff_sql test.db test.db2] + apply_rbudiff $sql test.db + } {SQLITE_DONE} + do_test 1.$tn.3 { rbudiff_cksum test.db } [rbudiff_cksum test.db2] + + forcedelete test.db test.db2 + sqlite3 db test.db + db eval "$init ; $mod" + sqlite3 db test.db2 + db eval "$init" + db close + + do_test 1.$tn.4 { + set sql [get_rbudiff_sql test.db test.db2] + apply_rbudiff $sql test.db + } {SQLITE_DONE} + do_test 1.$tn.5 { rbudiff_cksum test.db } [rbudiff_cksum test.db2] +} finish_test diff --git a/manifest b/manifest index d78fb8df6e..57b4b82227 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbug\sin\sthe\sfts5\sporter\stokenizer\spreventing\sit\sfrom\spassing\sxCreate()\sarguments\sthrough\sto\sits\sparent\stokenizer. -D 2015-07-31T14:43:02.175 +C Fix\sa\sproblem\scausing\s[sqldiff\s--rbu]\sto\sfail\son\stables\sfor\swhich\sall\scolumns\sare\spart\sof\sthe\sPRIMARY\sKEY. +D 2015-07-31T15:13:29.192 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4de3ef40c8b3b75c0c55ff4242a43c8ce1ad90ee F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -215,7 +215,7 @@ F ext/rbu/rbu8.test 3bbf2c35d71a843c463efe93946f14ad10c3ede0 F ext/rbu/rbu9.test 0806d1772c9f4981774ff028de6656e4183082af F ext/rbu/rbuA.test c1a7b3e2d926b8f8448bb3b4ae787e314ee4b2b3 F ext/rbu/rbucrash.test 8d2ed5d4b05fef6c00c2a6b5f7ead71fa172a695 -F ext/rbu/rbudiff.test deba11b97a41163e39de49d7455eb6429d0bd510 +F ext/rbu/rbudiff.test fbc3aa567927ac0141d4fe2d92c182e39a7b761f F ext/rbu/rbufault.test cc0be8d5d392d98b0c2d6a51be377ea989250a89 F ext/rbu/rbufault2.test 9a7f19edd6ea35c4c9f807d8a3db0a03a5670c06 F ext/rbu/rbufts.test 17db7d968b3d073788bcba044c498d09e830726b @@ -1357,7 +1357,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c -F tool/sqldiff.c 7ed3a042126755e87266c3e1dbbce39a20455a1f +F tool/sqldiff.c 664fbb0e99c0feea42512aaab544b635892b1813 F tool/stack_usage.tcl f8e71b92cdb099a147dad572375595eae55eca43 F tool/symbols-mingw.sh 4dbcea7e74768305384c9fd2ed2b41bbf9f0414d F tool/symbols.sh fec58532668296d7c7dc48be9c87f75ccdb5814f @@ -1368,7 +1368,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 098bea26da4533d9ad97a85687cca56fb0d764a4 -R 8a1feb7aa96f289823fcad1b81aa7445 +P c3c672af97edf2ae5d793f6fa47364370aa4f4ec +R b15a02058aabdd16b9a14979e1d956cd U dan -Z c5878e3f2569723ede9a1179817f20fd +Z f7d27995d6acc03880e556f3a3ff2a8c diff --git a/manifest.uuid b/manifest.uuid index daffe10a7c..a6b4d548c6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c3c672af97edf2ae5d793f6fa47364370aa4f4ec \ No newline at end of file +93449e7046d60cad020ca439ded82e759c2e3cd9 \ No newline at end of file diff --git a/tool/sqldiff.c b/tool/sqldiff.c index 1102a89fc7..f5edd60143 100644 --- a/tool/sqldiff.c +++ b/tool/sqldiff.c @@ -789,8 +789,10 @@ static void getRbudiffQuery( /* Deleted rows: */ strPrintf(pSql, "\nUNION ALL\nSELECT "); strPrintfArray(pSql, ", ", "%s", azCol, nPK); - strPrintf(pSql, ", "); - strPrintfArray(pSql, ", ", "NULL", &azCol[nPK], -1); + if( azCol[nPK] ){ + strPrintf(pSql, ", "); + strPrintfArray(pSql, ", ", "NULL", &azCol[nPK], -1); + } strPrintf(pSql, ", 1"); /* Set ota_control to 1 for a delete */ strPrintf(pSql, " FROM main.%Q AS n WHERE NOT EXISTS (\n", zTab); strPrintf(pSql, " SELECT 1 FROM ", zTab); @@ -798,29 +800,33 @@ static void getRbudiffQuery( strPrintfArray(pSql, " AND ", "(n.%Q IS o.%Q)", azCol, nPK); strPrintf(pSql, "\n) "); - /* Updated rows: */ - strPrintf(pSql, "\nUNION ALL\nSELECT "); - strPrintfArray(pSql, ", ", "n.%s", azCol, nPK); - strPrintf(pSql, ",\n"); - strPrintfArray(pSql, " ,\n", - " CASE WHEN n.%s IS o.%s THEN NULL ELSE n.%s END", &azCol[nPK], -1 - ); - - if( bOtaRowid==0 ){ - strPrintf(pSql, ", '"); - strPrintfArray(pSql, "", ".", azCol, nPK); - strPrintf(pSql, "' ||\n"); - }else{ + /* Updated rows. If all table columns are part of the primary key, there + ** can be no updates. In this case this part of the compound SELECT can + ** be omitted altogether. */ + if( azCol[nPK] ){ + strPrintf(pSql, "\nUNION ALL\nSELECT "); + strPrintfArray(pSql, ", ", "n.%s", azCol, nPK); strPrintf(pSql, ",\n"); - } - strPrintfArray(pSql, " ||\n", - " CASE WHEN n.%s IS o.%s THEN '.' ELSE 'x' END", &azCol[nPK], -1 - ); - strPrintf(pSql, "\nAS ota_control"); + strPrintfArray(pSql, " ,\n", + " CASE WHEN n.%s IS o.%s THEN NULL ELSE n.%s END", &azCol[nPK], -1 + ); - strPrintf(pSql, "\nFROM main.%Q AS o, aux.%Q AS n\nWHERE ", zTab, zTab); - strPrintfArray(pSql, " AND ", "(n.%Q IS o.%Q)", azCol, nPK); - strPrintf(pSql, " AND ota_control LIKE '%%x%%'"); + if( bOtaRowid==0 ){ + strPrintf(pSql, ", '"); + strPrintfArray(pSql, "", ".", azCol, nPK); + strPrintf(pSql, "' ||\n"); + }else{ + strPrintf(pSql, ",\n"); + } + strPrintfArray(pSql, " ||\n", + " CASE WHEN n.%s IS o.%s THEN '.' ELSE 'x' END", &azCol[nPK], -1 + ); + strPrintf(pSql, "\nAS ota_control"); + + strPrintf(pSql, "\nFROM main.%Q AS o, aux.%Q AS n\nWHERE ", zTab, zTab); + strPrintfArray(pSql, " AND ", "(n.%Q IS o.%Q)", azCol, nPK); + strPrintf(pSql, " AND ota_control LIKE '%%x%%'"); + } /* Now add an ORDER BY clause to sort everything by PK. */ strPrintf(pSql, "\nORDER BY ");