]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a performance problem in sqlite3session_diff().
authordan <dan@noemail.net>
Thu, 23 Apr 2015 14:40:17 +0000 (14:40 +0000)
committerdan <dan@noemail.net>
Thu, 23 Apr 2015 14:40:17 +0000 (14:40 +0000)
FossilOrigin-Name: ea400eca314d81761fe5c0e329b906c045f0dfe4

ext/session/sessionD.test
ext/session/sqlite3session.c
manifest
manifest.uuid

index c26728742a5690519372bfade165f32bcb96e2a3..aab9fdaea8ac247ce76199e23f29d2c01e4aaee3 100644 (file)
@@ -65,6 +65,25 @@ proc do_diff_test {tn setup} {
   uplevel do_test $tn.2 [list {scksum db aux}] [list $cksum]
 }
 
+# Ensure that the diff produced by comparing the current contents of [db]
+# with itself is empty.
+proc do_empty_diff_test {tn} {
+  forcedelete test.db2
+  forcecopy test.db test.db2
+
+  execsql { ATTACH 'test.db2' AS aux }
+  sqlite3session S db main
+  foreach tbl [db eval {SELECT name FROM sqlite_master WHERE type='table'}] {
+    S attach $tbl
+    S diff aux $tbl
+  }
+
+  set ::C [S changeset]
+  S delete
+
+  uplevel [list do_test $tn {string length $::C} 0]
+}
+
 
 forcedelete test.db2
 do_execsql_test 1.0 {
@@ -146,5 +165,24 @@ do_diff_test 2.4 {
   VALUES('ckmqmzoeuvxisxqy',X'EB5A5D3A1DD22FD1','tidgtsplhjcbvbppdt',-642987.3);
 }
 
+reset_db
+do_execsql_test 3.0 {
+  CREATE TABLE t1(a, b, c, PRIMARY KEY(a));
+  INSERT INTO t1 VALUES(1, 2, 3);
+  INSERT INTO t1 VALUES(4, 5, 6);
+  INSERT INTO t1 VALUES(7, 8, 9);
+
+  CREATE TABLE t2(a, b, c, PRIMARY KEY(a, b));
+  INSERT INTO t2 VALUES(1, 2, 3);
+  INSERT INTO t2 VALUES(4, 5, 6);
+  INSERT INTO t2 VALUES(7, 8, 9);
+
+  CREATE TABLE t3(a, b, c, PRIMARY KEY(a, b, c));
+  INSERT INTO t3 VALUES(1, 2, 3);
+  INSERT INTO t3 VALUES(4, 5, 6);
+  INSERT INTO t3 VALUES(7, 8, 9);
+}
+do_empty_diff_test 3.1
+
 finish_test
 
index a07e1e84d62ca07459508b9dada202bf323d897f..70bd250e34c48c2ac1fbda1b51601a7d9f09efb5 100644 (file)
@@ -1417,7 +1417,7 @@ static int sessionDiffFindModified(
     rc = SQLITE_NOMEM;
   }else{
     char *zStmt = sqlite3_mprintf(
-        "SELECT * FROM \"%w\".\"%w\", \"%w\".\"%w\" WHERE %s AND %z",
+        "SELECT * FROM \"%w\".\"%w\", \"%w\".\"%w\" WHERE %s AND (%z)",
         pSession->zDb, pTab->zName, zFrom, pTab->zName, zExpr, zExpr2
     );
     if( zStmt==0 ){
index 3a0b76390b07e2488d143869cd2eacc99a2fb9b4..d6c725053510219e77f42fcc766300a1441b55d3 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Merge\sthe\slatest\strunk\senhancements\sand\sfixes\sinto\sthe\ssessions\sbranch.
-D 2015-04-23T13:49:53.138
+C Fix\sa\sperformance\sproblem\sin\ssqlite3session_diff().
+D 2015-04-23T14:40:17.627
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 7599f0c96df628cd543884b1b2f2a2fbffd00079
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -158,10 +158,10 @@ F ext/session/session9.test 5409d90d8141881d08285ed1c2c0d8d10fb92069
 F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f
 F ext/session/sessionB.test 06961b7c3641151f5d23088250ecad132501113c
 F ext/session/sessionC.test 3982f8577b0744c5ce3aaef7cfeb5bd903f17fe4
-F ext/session/sessionD.test 95903bd6a23dadbda7e192f730dd7dedd2d369ef
+F ext/session/sessionD.test 197781b4823fbf0003a21da0e4360b37d0e0a81f
 F ext/session/session_common.tcl 9de0451b6a47218fc16b9ed8876b6238a0a3d88d
 F ext/session/sessionfault.test bef044d0952c0d62c31c8d2400be72c8684545cc
-F ext/session/sqlite3session.c 2ad7285103457129c636a2367d40f3b9c459b256
+F ext/session/sqlite3session.c de11ba62d7bf5b9a5d732411550771d4ee6b412a
 F ext/session/sqlite3session.h d9ebd8d4c5791aafdf18165575c7f2223c09279b
 F ext/session/test_session.c 037fc25340a918eb2195972fed439d7adf7b5db9
 F ext/userauth/sqlite3userauth.h 19cb6f0e31316d0ee4afdfb7a85ef9da3333a220
@@ -1271,7 +1271,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P b8ef1cdee307441e8d97b4bfc21f8547692eea9f b5e43602833249aa4b73337bf85b7f308450dab6
-R 21546caf070f5228972b31b0602e8636
-U drh
-Z 47f4cbb84ecfe918df05ce03c5e0cd26
+P 4e5f17d189eb0578a544c21fc150f9e2ee3428e3
+R bb0c0c482394af2863743ccd1d1a9362
+U dan
+Z ee0bd6bc3557d1b9872d331b62e53091
index f5eb0529793abd1758cda42a8f409bef724cd711..e79db0245b9f656629795b6a94f944a1ec4c7796 100644 (file)
@@ -1 +1 @@
-4e5f17d189eb0578a544c21fc150f9e2ee3428e3
\ No newline at end of file
+ea400eca314d81761fe5c0e329b906c045f0dfe4
\ No newline at end of file