]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix cases where modifying bound variables using the clear_bindings() or transfer_bind...
authordan <dan@noemail.net>
Tue, 20 Oct 2009 07:01:24 +0000 (07:01 +0000)
committerdan <dan@noemail.net>
Tue, 20 Oct 2009 07:01:24 +0000 (07:01 +0000)
FossilOrigin-Name: e6808c988c9cd7b2db23f18b5fe2177151b6f586

manifest
manifest.uuid
src/vdbeapi.c
test/analyze3.test

index a78dbfe240409f77fc2987167d04cbe1d894436d..d5368ff567d92a876634fae1f82571977675b91f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,8 +1,5 @@
------BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA1
-
-C Remove\san\sunreachable\scondition\sin\sthe\sWHERE\sclause\sprocessing\sof\sbound\nparameters\sand\sreplace\sit\swith\san\sassert(),\sfor\stest\scoverage.
-D 2009-10-19T22:41:06
+C Fix\scases\swhere\smodifying\sbound\svariables\susing\sthe\sclear_bindings()\sor\stransfer_bindings()\sAPIs\scan\sinvalidate\sa\squery\splan.
+D 2009-10-20T07:01:24
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 4ca3f1dd6efa2075bcb27f4dc43eef749877740d
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -212,7 +209,7 @@ F src/vacuum.c f2347520907ee4ec867c9b804d24456b0fd912a7
 F src/vdbe.c f0d6e7dbd4515758c188c9dd7025eb9dfcf021e0
 F src/vdbe.h 3fedb2121d026dd127350d33e875a49cf05df2e8
 F src/vdbeInt.h 8e07f4356dd5bfe03ac5991338e59b68c9b3c717
-F src/vdbeapi.c b10052643e45b611e52f4782ebc761e01c1add75
+F src/vdbeapi.c 44b5f387459d5faa158aa8d3a26967f0c8596efd
 F src/vdbeaux.c fc032b050e0500000de534b2b0f0c63642459b8f
 F src/vdbeblob.c 9bfaeab22e261a6a7b6df04e7faaf7d6dfdbef5a
 F src/vdbemem.c 7055a2941a7802094f4704cedc7a28cc88a23749
@@ -229,7 +226,7 @@ F test/alter4.test 9386ffd1e9c7245f43eca412b2058d747509cc1f
 F test/altermalloc.test e81ac9657ed25c6c5bb09bebfa5a047cd8e4acfc
 F test/analyze.test ad5329098fe4de4a96852231d53e3e9e6283ad4b
 F test/analyze2.test a2ad7b0a4e13801ee3968fe70f22aff52326569c
-F test/analyze3.test 5c87ca746d3cf52d5172cfbc4890695d526f1e90
+F test/analyze3.test 851bcc0738b87e1c1990d8dbad6ab53cdfcc19d6
 F test/async.test 8c75d31b8330f8b70cf2571b014d4476a063efdb
 F test/async2.test bf5e2ca2c96763b4cba3d016249ad7259a5603b6
 F test/async3.test 93edaa9122f498e56ea98c36c72abc407f4fb11e
@@ -763,14 +760,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff x
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f x
-P 651c1efb998b34f218694c45865fbe20b837a2ac
-R 2619639fd054d5cd59f66d2af80794d3
-U drh
-Z f98fcb726ba1bd0ac977580c1890d9aa
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.6 (GNU/Linux)
-
-iD8DBQFK3OsGoxKgR168RlERAqjvAJ40DyYuZYyj9ebU8QCPdYgdKgW/jQCgiToy
-bbznqWlejrKWFCwUwLi9COI=
-=isjf
------END PGP SIGNATURE-----
+P 3bcd78a1d76897d1bd5ad4cea52c6a65612ce433
+R 1728941566ef8ddd5fc7b46882d4b01c
+U dan
+Z 9100d3d85f3bd8c3f556c00cc5107446
index a18772be4e5ac82a0783ac08d70e16a92c887fb2..21b7d55391106942c77c3104d574ec82504d9ad5 100644 (file)
@@ -1 +1 @@
-3bcd78a1d76897d1bd5ad4cea52c6a65612ce433
\ No newline at end of file
+e6808c988c9cd7b2db23f18b5fe2177151b6f586
\ No newline at end of file
index a0c2cc528522ea93ab598d8f17d4f07cd7f316ef..b9ee52b6ce2c75f246b25b6735ef94790845af00 100644 (file)
@@ -99,6 +99,9 @@ int sqlite3_clear_bindings(sqlite3_stmt *pStmt){
     sqlite3VdbeMemRelease(&p->aVar[i]);
     p->aVar[i].flags = MEM_Null;
   }
+  if( p->isPrepareV2 && p->expmask ){
+    p->expired = 1;
+  }
   sqlite3_mutex_leave(mutex);
   return rc;
 }
@@ -1173,6 +1176,12 @@ int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){
   if( pFrom->nVar!=pTo->nVar ){
     return SQLITE_ERROR;
   }
+  if( pTo->isPrepareV2 && pTo->expmask ){
+    pTo->expired = 1;
+  }
+  if( pFrom->isPrepareV2 && pFrom->expmask ){
+    pFrom->expired = 1;
+  }
   return sqlite3TransferBindings(pFromStmt, pToStmt);
 }
 #endif
index 65d6dfe2f1443674a122c811d2fedd516e02d960..2aaa8732e8bde9e063a0ab98cc62d4bc811e31ab 100644 (file)
@@ -40,6 +40,10 @@ ifcapable !stat2 {
 # analyze3-4.*: Test that SQL or authorization callback errors occuring
 #               within sqlite3Reprepare() are handled correctly.
 #
+# analyze3-5.*: Check that the query plans of applicable statements are
+#               invalidated if the values of SQL parameter are modified
+#               using the clear_bindings() or transfer_bindings() APIs.
+#
 
 proc getvar {varname} { uplevel #0 set $varname }
 db function var getvar
@@ -526,5 +530,72 @@ do_test analyze3-4.3.1 {
 do_test analyze3-4.3.2 {
   sqlite3_finalize $S
 } {SQLITE_SCHEMA}
+db auth {}
+
+#-------------------------------------------------------------------------
+# Test that modifying bound variables using the clear_bindings() or
+# transfer_bindings() APIs works.
+#
+#   analyze3-5.1.*: sqlite3_clear_bindings()
+#   analyze3-5.2.*: sqlite3_transfer_bindings()
+#
+do_test analyze3-5.1.1 {
+  drop_all_tables
+  execsql {
+    CREATE TABLE t1(x TEXT COLLATE NOCASE);
+    CREATE INDEX i1 ON t1(x);
+    INSERT INTO t1 VALUES('aaa');
+    INSERT INTO t1 VALUES('abb');
+    INSERT INTO t1 VALUES('acc');
+    INSERT INTO t1 VALUES('baa');
+    INSERT INTO t1 VALUES('bbb');
+    INSERT INTO t1 VALUES('bcc');
+  }
+
+  set S [sqlite3_prepare_v2 db "SELECT * FROM t1 WHERE x LIKE ?" -1 dummy]
+  sqlite3_bind_text $S 1 "a%" 2
+  set R [list]
+  while { "SQLITE_ROW" == [sqlite3_step $S] } {
+    lappend R [sqlite3_column_text $S 0]
+  }
+  concat [sqlite3_reset $S] $R
+} {SQLITE_OK aaa abb acc}
+do_test analyze3-5.1.2 {
+  sqlite3_clear_bindings $S
+  set R [list]
+  while { "SQLITE_ROW" == [sqlite3_step $S] } {
+    lappend R [sqlite3_column_text $S 0]
+  }
+  concat [sqlite3_reset $S] $R
+} {SQLITE_OK}
+do_test analyze3-5.1.3 {
+  sqlite3_finalize $S
+} {SQLITE_OK}
+
+do_test analyze3-5.1.1 {
+  set S1 [sqlite3_prepare_v2 db "SELECT * FROM t1 WHERE x LIKE ?" -1 dummy]
+  sqlite3_bind_text $S1 1 "b%" 2
+  set R [list]
+  while { "SQLITE_ROW" == [sqlite3_step $S1] } {
+    lappend R [sqlite3_column_text $S1 0]
+  }
+  concat [sqlite3_reset $S1] $R
+} {SQLITE_OK baa bbb bcc}
+
+do_test analyze3-5.1.2 {
+  set S2 [sqlite3_prepare_v2 db "SELECT * FROM t1 WHERE x = ?" -1 dummy]
+  sqlite3_bind_text $S2 1 "a%" 2
+  sqlite3_transfer_bindings $S2 $S1
+  set R [list]
+  while { "SQLITE_ROW" == [sqlite3_step $S1] } {
+    lappend R [sqlite3_column_text $S1 0]
+  }
+  concat [sqlite3_reset $S1] $R
+} {SQLITE_OK aaa abb acc}
+do_test analyze3-5.1.3 {
+  sqlite3_finalize $S2
+  sqlite3_finalize $S1
+} {SQLITE_OK}
 
 finish_test
+