Return an error when an xBestIndex() method indicates that it intends to use the value of an unusable constraint. Related to #2998. (CVS 4867)

FossilOrigin-Name: ffd470279540b1b8e3fdce6eb14001bae489b16d
This commit is contained in:
danielk1977 2008-03-17 09:36:44 +00:00
parent 17fe6c1d32
commit 39359dc020
5 changed files with 148 additions and 14 deletions

View File

@ -1,5 +1,5 @@
C Skip\stests\sthat\srequire\ssetting\sdetailed\sunix\spermissions\son\sfiles\swhen\nrunning\son\sfilesystems\ssuch\sas\sAFP\sthat\sdo\snot\ssupport\sthat\scapability.\s(CVS\s4866)
D 2008-03-15T14:53:05
C Return\san\serror\swhen\san\sxBestIndex()\smethod\sindicates\sthat\sit\sintends\sto\suse\sthe\svalue\sof\san\sunusable\sconstraint.\sRelated\sto\s#2998.\s(CVS\s4867)
D 2008-03-17T09:36:45
F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7
F Makefile.in 5be94fea84f1599672e5041de03b97990baca593
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@ -152,7 +152,7 @@ F src/test4.c c2c0f5dc907f1346f5d4b65eb5799f11eb9e4071
F src/test5.c 3a6a5717a149d7ca2e6d14f5be72cf7555d54dc4
F src/test6.c f8b34a6ff04937092327798ddf0ab46863535bc5
F src/test7.c acec2256c7c2d279db5a8b5fa1a2a68fcc942c67
F src/test8.c 25e127f0e21f59da24fa33cdbc645851cfb933f1
F src/test8.c 7933b27f8d300512546ef6bdd25f2fe64c3c13f3
F src/test9.c 4615ef08750245a2d96aaa7cbe2fb4aff2b57acc
F src/test_async.c 3147c64c34721f088d5ab20f85dabd5d7732c007
F src/test_autoext.c 855157d97aa28cf84233847548bfacda21807436
@ -183,7 +183,7 @@ F src/vdbeblob.c 63c750acc7b5012479f508c0e9627372a82cb65d
F src/vdbefifo.c a30c237b2a3577e1415fb6e288cbb6b8ed1e5736
F src/vdbemem.c 7a39ad5579e0a9e7305a8fe9a2095840f0ab8454
F src/vtab.c 00cd16317b29495c185ff40e4b227917d5a371b2
F src/where.c c5eaca1f2d9caa20c5c7096434ccde2be03b325c
F src/where.c dd72c822a96967fd7218abec498a70f94986adb0
F tclinstaller.tcl 4356d9d94d2b5ed5e68f9f0c80c4df3048dd7617
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
F test/all.test d12210212bada2bde6d5aeb90969b86c1aa977d2
@ -530,7 +530,7 @@ F test/vtab2.test 1da49b015582965a8fc386aa23d051a5a622b08e
F test/vtab3.test f38d6d7d19f08bffdadce4d5b8cba078f8118587
F test/vtab4.test a9d7104d41a787754a734740d7aa61c807a69f87
F test/vtab5.test 26bc7a0a52c5c2bcfa849ba327f8a0d4abccdb23
F test/vtab6.test ec0036f29f8a803da9935206f2d9d1b6a8026392
F test/vtab6.test 8273e2c6e13c6f8d39b66cb7fc2591f4b97a9d44
F test/vtab7.test a8c3c3cb3eb60be364991bd714e4927e26c4cd85
F test/vtab8.test e19fa4a538fcd1bb66c22825fa8f71618fb13583
F test/vtab9.test ea58d2b95d61955f87226381716b2d0b1d4e4f9b
@ -623,7 +623,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
P 5e4df441815ed7d02e9ad8ee2e1c2f937ee675d7
R 4fc01bc578742338cb6e67ff251ecd70
U drh
Z 787508c13d0cfaee6008fe2953e61687
P 5589b9d395fb8267a124d56dd5d7987e57505e3d
R 5404f9fa9fd8ab644119c7147401ab02
U danielk1977
Z c0d9e9f0eaef6302049326fc96233904

View File

@ -1 +1 @@
5589b9d395fb8267a124d56dd5d7987e57505e3d
ffd470279540b1b8e3fdce6eb14001bae489b16d

View File

@ -13,7 +13,7 @@
** is not included in the SQLite library. It is used for automated
** testing of the SQLite library.
**
** $Id: test8.c,v 1.60 2008/02/13 18:25:27 danielk1977 Exp $
** $Id: test8.c,v 1.61 2008/03/17 09:36:45 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "tcl.h"
@ -730,6 +730,11 @@ static int echoBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
int useCost = 0;
double cost;
int isIgnoreUsable = 0;
if( Tcl_GetVar(interp, "echo_module_ignore_usable", TCL_GLOBAL_ONLY) ){
isIgnoreUsable = 1;
}
/* Determine the number of rows in the table and store this value in local
** variable nRow. The 'estimated-cost' of the scan will be the number of
** rows in the table for a linear scan, or the log (base 2) of the
@ -768,6 +773,8 @@ static int echoBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
pConstraint = &pIdxInfo->aConstraint[ii];
pUsage = &pIdxInfo->aConstraintUsage[ii];
if( !isIgnoreUsable && !pConstraint->usable ) continue;
iCol = pConstraint->iColumn;
if( pVtab->aIndex[iCol] ){
char *zCol = pVtab->aCol[iCol];

View File

@ -16,7 +16,7 @@
** so is applicable. Because this module is responsible for selecting
** indices, you might also think of this module as the "query optimizer".
**
** $Id: where.c,v 1.288 2008/03/04 17:45:02 mlcreech Exp $
** $Id: where.c,v 1.289 2008/03/17 09:36:45 danielk1977 Exp $
*/
#include "sqliteInt.h"
@ -1400,6 +1400,16 @@ static double bestVirtualIndex(
TRACE_IDX_INPUTS(pIdxInfo);
rc = pTab->pVtab->pModule->xBestIndex(pTab->pVtab, pIdxInfo);
TRACE_IDX_OUTPUTS(pIdxInfo);
(void)sqlite3SafetyOn(pParse->db);
for(i=0; i<pIdxInfo->nConstraint; i++){
if( !pIdxInfo->aConstraint[i].usable && pUsage[i].argvIndex>0 ){
sqlite3ErrorMsg(pParse,
"table %s: xBestIndex returned an invalid plan", pTab->zName);
return 0.0;
}
}
if( rc!=SQLITE_OK ){
if( rc==SQLITE_NOMEM ){
pParse->db->mallocFailed = 1;
@ -1407,7 +1417,6 @@ static double bestVirtualIndex(
sqlite3ErrorMsg(pParse, "%s", sqlite3ErrStr(rc));
}
}
(void)sqlite3SafetyOn(pParse->db);
*(int*)&pIdxInfo->nOrderBy = nOrderBy;
return pIdxInfo->estimatedCost;

View File

@ -14,7 +14,7 @@
# virtual tables. The test cases in this file are copied from the file
# join.test, and some of the comments still reflect that.
#
# $Id: vtab6.test,v 1.2 2006/06/28 18:18:10 drh Exp $
# $Id: vtab6.test,v 1.3 2008/03/17 09:36:45 danielk1977 Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@ -454,4 +454,122 @@ do_test vtab6-10.1 {
} {}
} ;# ifcapable subquery
do_test vtab6-11.1.0 {
execsql {
CREATE TABLE ab_r(a, b);
CREATE TABLE bc_r(b, c);
CREATE VIRTUAL TABLE ab USING echo(ab_r);
CREATE VIRTUAL TABLE bc USING echo(bc_r);
INSERT INTO ab VALUES(1, 2);
INSERT INTO bc VALUES(2, 3);
}
} {}
do_test vtab6-11.1.1 {
execsql {
SELECT a, b, c FROM ab NATURAL JOIN bc;
}
} {1 2 3}
do_test vtab6-11.1.2 {
execsql {
SELECT a, b, c FROM bc NATURAL JOIN ab;
}
} {1 2 3}
set ::echo_module_cost 1.0
do_test vtab6-11.1.3 {
execsql {
SELECT a, b, c FROM ab NATURAL JOIN bc;
}
} {1 2 3}
do_test vtab6-11.1.4 {
execsql {
SELECT a, b, c FROM bc NATURAL JOIN ab;
}
} {1 2 3}
do_test vtab6-11.2.0 {
execsql {
CREATE INDEX ab_i ON ab_r(b);
}
} {}
unset ::echo_module_cost
do_test vtab6-11.2.1 {
execsql {
SELECT a, b, c FROM ab NATURAL JOIN bc;
}
} {1 2 3}
do_test vtab6-11.2.2 {
execsql {
SELECT a, b, c FROM bc NATURAL JOIN ab;
}
} {1 2 3}
set ::echo_module_cost 1.0
do_test vtab6-11.2.3 {
execsql {
SELECT a, b, c FROM ab NATURAL JOIN bc;
}
} {1 2 3}
do_test vtab6-11.2.4 {
execsql {
SELECT a, b, c FROM bc NATURAL JOIN ab;
}
} {1 2 3}
unset ::echo_module_cost
db close
sqlite3 db test.db
register_echo_module [sqlite3_connection_pointer db]
do_test vtab6-11.3.1 {
execsql {
SELECT a, b, c FROM ab NATURAL JOIN bc;
}
} {1 2 3}
do_test vtab6-11.3.2 {
execsql {
SELECT a, b, c FROM bc NATURAL JOIN ab;
}
} {1 2 3}
set ::echo_module_cost 1.0
do_test vtab6-11.3.3 {
execsql {
SELECT a, b, c FROM ab NATURAL JOIN bc;
}
} {1 2 3}
do_test vtab6-11.3.4 {
execsql {
SELECT a, b, c FROM bc NATURAL JOIN ab;
}
} {1 2 3}
unset ::echo_module_cost
set ::echo_module_ignore_usable 1
db cache flush
do_test vtab6-11.4.1 {
catchsql {
SELECT a, b, c FROM ab NATURAL JOIN bc;
}
} {1 {table ab: xBestIndex returned an invalid plan}}
do_test vtab6-11.4.2 {
catchsql {
SELECT a, b, c FROM bc NATURAL JOIN ab;
}
} {1 {table ab: xBestIndex returned an invalid plan}}
unset ::echo_module_ignore_usable
finish_test