mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Fix cases where modifying bound variables using the clear_bindings() or transfer_bindings() APIs can invalidate a query plan.
FossilOrigin-Name: e6808c988c9cd7b2db23f18b5fe2177151b6f586
This commit is contained in:
26
manifest
26
manifest
@ -1,8 +1,5 @@
|
|||||||
-----BEGIN PGP SIGNED MESSAGE-----
|
C Fix\scases\swhere\smodifying\sbound\svariables\susing\sthe\sclear_bindings()\sor\stransfer_bindings()\sAPIs\scan\sinvalidate\sa\squery\splan.
|
||||||
Hash: SHA1
|
D 2009-10-20T07:01:24
|
||||||
|
|
||||||
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
|
|
||||||
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
|
||||||
F Makefile.in 4ca3f1dd6efa2075bcb27f4dc43eef749877740d
|
F Makefile.in 4ca3f1dd6efa2075bcb27f4dc43eef749877740d
|
||||||
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
|
||||||
@ -212,7 +209,7 @@ F src/vacuum.c f2347520907ee4ec867c9b804d24456b0fd912a7
|
|||||||
F src/vdbe.c f0d6e7dbd4515758c188c9dd7025eb9dfcf021e0
|
F src/vdbe.c f0d6e7dbd4515758c188c9dd7025eb9dfcf021e0
|
||||||
F src/vdbe.h 3fedb2121d026dd127350d33e875a49cf05df2e8
|
F src/vdbe.h 3fedb2121d026dd127350d33e875a49cf05df2e8
|
||||||
F src/vdbeInt.h 8e07f4356dd5bfe03ac5991338e59b68c9b3c717
|
F src/vdbeInt.h 8e07f4356dd5bfe03ac5991338e59b68c9b3c717
|
||||||
F src/vdbeapi.c b10052643e45b611e52f4782ebc761e01c1add75
|
F src/vdbeapi.c 44b5f387459d5faa158aa8d3a26967f0c8596efd
|
||||||
F src/vdbeaux.c fc032b050e0500000de534b2b0f0c63642459b8f
|
F src/vdbeaux.c fc032b050e0500000de534b2b0f0c63642459b8f
|
||||||
F src/vdbeblob.c 9bfaeab22e261a6a7b6df04e7faaf7d6dfdbef5a
|
F src/vdbeblob.c 9bfaeab22e261a6a7b6df04e7faaf7d6dfdbef5a
|
||||||
F src/vdbemem.c 7055a2941a7802094f4704cedc7a28cc88a23749
|
F src/vdbemem.c 7055a2941a7802094f4704cedc7a28cc88a23749
|
||||||
@ -229,7 +226,7 @@ F test/alter4.test 9386ffd1e9c7245f43eca412b2058d747509cc1f
|
|||||||
F test/altermalloc.test e81ac9657ed25c6c5bb09bebfa5a047cd8e4acfc
|
F test/altermalloc.test e81ac9657ed25c6c5bb09bebfa5a047cd8e4acfc
|
||||||
F test/analyze.test ad5329098fe4de4a96852231d53e3e9e6283ad4b
|
F test/analyze.test ad5329098fe4de4a96852231d53e3e9e6283ad4b
|
||||||
F test/analyze2.test a2ad7b0a4e13801ee3968fe70f22aff52326569c
|
F test/analyze2.test a2ad7b0a4e13801ee3968fe70f22aff52326569c
|
||||||
F test/analyze3.test 5c87ca746d3cf52d5172cfbc4890695d526f1e90
|
F test/analyze3.test 851bcc0738b87e1c1990d8dbad6ab53cdfcc19d6
|
||||||
F test/async.test 8c75d31b8330f8b70cf2571b014d4476a063efdb
|
F test/async.test 8c75d31b8330f8b70cf2571b014d4476a063efdb
|
||||||
F test/async2.test bf5e2ca2c96763b4cba3d016249ad7259a5603b6
|
F test/async2.test bf5e2ca2c96763b4cba3d016249ad7259a5603b6
|
||||||
F test/async3.test 93edaa9122f498e56ea98c36c72abc407f4fb11e
|
F test/async3.test 93edaa9122f498e56ea98c36c72abc407f4fb11e
|
||||||
@ -763,14 +760,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff x
|
|||||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f x
|
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f x
|
||||||
P 651c1efb998b34f218694c45865fbe20b837a2ac
|
P 3bcd78a1d76897d1bd5ad4cea52c6a65612ce433
|
||||||
R 2619639fd054d5cd59f66d2af80794d3
|
R 1728941566ef8ddd5fc7b46882d4b01c
|
||||||
U drh
|
U dan
|
||||||
Z f98fcb726ba1bd0ac977580c1890d9aa
|
Z 9100d3d85f3bd8c3f556c00cc5107446
|
||||||
-----BEGIN PGP SIGNATURE-----
|
|
||||||
Version: GnuPG v1.4.6 (GNU/Linux)
|
|
||||||
|
|
||||||
iD8DBQFK3OsGoxKgR168RlERAqjvAJ40DyYuZYyj9ebU8QCPdYgdKgW/jQCgiToy
|
|
||||||
bbznqWlejrKWFCwUwLi9COI=
|
|
||||||
=isjf
|
|
||||||
-----END PGP SIGNATURE-----
|
|
||||||
|
@ -1 +1 @@
|
|||||||
3bcd78a1d76897d1bd5ad4cea52c6a65612ce433
|
e6808c988c9cd7b2db23f18b5fe2177151b6f586
|
@ -99,6 +99,9 @@ int sqlite3_clear_bindings(sqlite3_stmt *pStmt){
|
|||||||
sqlite3VdbeMemRelease(&p->aVar[i]);
|
sqlite3VdbeMemRelease(&p->aVar[i]);
|
||||||
p->aVar[i].flags = MEM_Null;
|
p->aVar[i].flags = MEM_Null;
|
||||||
}
|
}
|
||||||
|
if( p->isPrepareV2 && p->expmask ){
|
||||||
|
p->expired = 1;
|
||||||
|
}
|
||||||
sqlite3_mutex_leave(mutex);
|
sqlite3_mutex_leave(mutex);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -1173,6 +1176,12 @@ int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){
|
|||||||
if( pFrom->nVar!=pTo->nVar ){
|
if( pFrom->nVar!=pTo->nVar ){
|
||||||
return SQLITE_ERROR;
|
return SQLITE_ERROR;
|
||||||
}
|
}
|
||||||
|
if( pTo->isPrepareV2 && pTo->expmask ){
|
||||||
|
pTo->expired = 1;
|
||||||
|
}
|
||||||
|
if( pFrom->isPrepareV2 && pFrom->expmask ){
|
||||||
|
pFrom->expired = 1;
|
||||||
|
}
|
||||||
return sqlite3TransferBindings(pFromStmt, pToStmt);
|
return sqlite3TransferBindings(pFromStmt, pToStmt);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -40,6 +40,10 @@ ifcapable !stat2 {
|
|||||||
# analyze3-4.*: Test that SQL or authorization callback errors occuring
|
# analyze3-4.*: Test that SQL or authorization callback errors occuring
|
||||||
# within sqlite3Reprepare() are handled correctly.
|
# 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 }
|
proc getvar {varname} { uplevel #0 set $varname }
|
||||||
db function var getvar
|
db function var getvar
|
||||||
@ -526,5 +530,72 @@ do_test analyze3-4.3.1 {
|
|||||||
do_test analyze3-4.3.2 {
|
do_test analyze3-4.3.2 {
|
||||||
sqlite3_finalize $S
|
sqlite3_finalize $S
|
||||||
} {SQLITE_SCHEMA}
|
} {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
|
finish_test
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user