From 562528c480a915b3ae66ddc446f9031d9b324cf5 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 27 Sep 2003 00:41:27 +0000 Subject: [PATCH] Do all WHERE clauses tests, even if an index is used for lookup so that we know the test cannot be FALSE. The test might end up being NULL in which case it would need to be treated as false. Ticket #461. (CVS 1103) FossilOrigin-Name: 5aea81488b2d3bcdc009ccf0f0ffcda046e38d79 --- manifest | 16 +++++++------- manifest.uuid | 2 +- src/where.c | 20 ++++++++--------- test/index.test | 10 ++++----- test/null.test | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 82 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index ea4c8d29f3..5d75409792 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C A\sfailed\smalloc()\scould\shave\sresulted\sin\sa\ssegfault.\s\sFixed\sby\sthis\scheck-in.\s(CVS\s1102) -D 2003-09-23T10:25:33 +C Do\sall\sWHERE\sclauses\stests,\seven\sif\san\sindex\sis\sused\sfor\slookup\sso\sthat\nwe\sknow\sthe\stest\scannot\sbe\sFALSE.\s\sThe\stest\smight\send\sup\sbeing\sNULL\sin\swhich\ncase\sit\swould\sneed\sto\sbe\streated\sas\sfalse.\s\sTicket\s#461.\s(CVS\s1103) +D 2003-09-27T00:41:28 F Makefile.in ab585a91e34bc33928a1b6181fa2f6ebd4fb17e1 F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd @@ -65,7 +65,7 @@ F src/vdbe.c 4570d4361838327f45aa3788034e108c048b4d3f F src/vdbe.h 3957844e46fea71fd030e78f6a3bd2f7e320fb43 F src/vdbeInt.h 2824bf88895b901b3a8c9e44527c67530e1c0dcb F src/vdbeaux.c 1145fa169021d7fb3962fab6e99f5f8fc2608f8a -F src/where.c 83b2a2d26d5c3bea33457a83e541bb1dcf7b1248 +F src/where.c 1e8d20d3997b5231f25b1f377fefe58aa49bf604 F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242 F test/attach.test c26848402e7ac829e043e1fa5e0eb87032e5d81d F test/attach2.test 6f98cc2b929d88dc5f82d95d04e9b89b3b5dead3 @@ -88,7 +88,7 @@ F test/fkey1.test d65c824459916249bee501532d6154ddab0b5db7 F test/format3.test b05cb2968841553698290f2833f72894f156024e F test/func.test 000515779001ac6899eec4b54e65c6e2501279d4 F test/in.test 22de8a3eb27265aab723adc513bea0e76bef70c6 -F test/index.test 1962dbc8c0ef2467195776bdee18ef7cf3ce9b62 +F test/index.test 9295deefbdb6dedbe01be8905f0c448fe5bd4079 F test/insert.test a17b7f7017097afb2727aa5b67ceeb7ab0a120a1 F test/insert2.test c288375a64dad3295044714f0dfed4a193cf067f F test/intpkey.test 9320af48415c594afd4e15f8ef0daa272e05502e @@ -105,7 +105,7 @@ F test/misc1.test 0b98d493b0cf55cb5f53e1f3df8107c166eecb5a F test/misc2.test 5818bfafd07535b0437f15c32bed983f3bd363b2 F test/misuse.test a3aa2b18a97e4c409a1fcaff5151a4dd804a0162 F test/notnull.test 7a08117a71e74b0321aaa937dbeb41a09d6eb1d0 -F test/null.test 5c2b57307e4b6178aae825eb65ddbee01e76b0fd +F test/null.test c14d0f4739f21e929b8115b72bf0c765b6bb1721 F test/pager.test dd31da9bee94a82e2e87e58cf286cfe809f8fc5f F test/pragma.test e7cb7ffd765c9158868b0b7a3771d54a0d5f5072 F test/printf.test 3ed02f1361402c0767492cd5cef4650e61df8308 @@ -173,7 +173,7 @@ F www/speed.tcl 2f6b1155b99d39adb185f900456d1d592c4832b3 F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604 F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1 -P 4fdd44a5ee5f7beb3cff11bc54fd3022b975b9e6 -R 0074487beb6e741081cb3a63c6722144 +P 4bb256ee3ecd44d71d90556e16bb56c0389fd5b5 +R c6afe2445864efb925570f28ec556288 U drh -Z 3c9475381ebc19cc18ae14d0f50d9455 +Z e801647f10cab2f01f8d94808db9306f diff --git a/manifest.uuid b/manifest.uuid index 2986555b6e..4c4509f57e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4bb256ee3ecd44d71d90556e16bb56c0389fd5b5 \ No newline at end of file +5aea81488b2d3bcdc009ccf0f0ffcda046e38d79 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 963b2072b1..226c841dfd 100644 --- a/src/where.c +++ b/src/where.c @@ -12,7 +12,7 @@ ** This module contains C code that generates VDBE code used to process ** the WHERE clause of SQL statements. ** -** $Id: where.c,v 1.81 2003/07/16 00:54:31 drh Exp $ +** $Id: where.c,v 1.82 2003/09/27 00:41:28 drh Exp $ */ #include "sqliteInt.h" @@ -766,7 +766,7 @@ WhereInfo *sqliteWhereBegin( ){ if( pX->op==TK_EQ ){ sqliteExprCode(pParse, pX->pRight); - aExpr[k].p = 0; + /* aExpr[k].p = 0; // See ticket #461 */ break; } if( pX->op==TK_IN && nColumn==1 ){ @@ -783,7 +783,7 @@ WhereInfo *sqliteWhereBegin( pLevel->inOp = OP_Next; pLevel->inP1 = pX->iTable; } - aExpr[k].p = 0; + /* aExpr[k].p = 0; // See ticket #461 */ break; } } @@ -793,7 +793,7 @@ WhereInfo *sqliteWhereBegin( && aExpr[k].p->pRight->iColumn==pIdx->aiColumn[j] ){ sqliteExprCode(pParse, aExpr[k].p->pLeft); - aExpr[k].p = 0; + /* aExpr[k].p = 0; // See ticket #461 */ break; } } @@ -935,7 +935,7 @@ WhereInfo *sqliteWhereBegin( && aExpr[k].p->pLeft->iColumn==pIdx->aiColumn[j] ){ sqliteExprCode(pParse, aExpr[k].p->pRight); - aExpr[k].p = 0; + /* aExpr[k].p = 0; // See ticket #461 */ break; } if( aExpr[k].idxRight==iCur @@ -944,7 +944,7 @@ WhereInfo *sqliteWhereBegin( && aExpr[k].p->pRight->iColumn==pIdx->aiColumn[j] ){ sqliteExprCode(pParse, aExpr[k].p->pLeft); - aExpr[k].p = 0; + /* aExpr[k].p = 0; // See ticket #461 */ break; } } @@ -981,7 +981,7 @@ WhereInfo *sqliteWhereBegin( ){ sqliteExprCode(pParse, pExpr->pRight); leFlag = pExpr->op==TK_LE; - aExpr[k].p = 0; + /* aExpr[k].p = 0; // See ticket #461 */ break; } if( aExpr[k].idxRight==iCur @@ -991,7 +991,7 @@ WhereInfo *sqliteWhereBegin( ){ sqliteExprCode(pParse, pExpr->pLeft); leFlag = pExpr->op==TK_GE; - aExpr[k].p = 0; + /* aExpr[k].p = 0; // See ticket #461 */ break; } } @@ -1036,7 +1036,7 @@ WhereInfo *sqliteWhereBegin( ){ sqliteExprCode(pParse, pExpr->pRight); geFlag = pExpr->op==TK_GE; - aExpr[k].p = 0; + /* aExpr[k].p = 0; // See ticket #461 */ break; } if( aExpr[k].idxRight==iCur @@ -1046,7 +1046,7 @@ WhereInfo *sqliteWhereBegin( ){ sqliteExprCode(pParse, pExpr->pLeft); geFlag = pExpr->op==TK_LE; - aExpr[k].p = 0; + /* aExpr[k].p = 0; // See ticket #461 */ break; } } diff --git a/test/index.test b/test/index.test index b28f8d35f7..d233f9dc3a 100644 --- a/test/index.test +++ b/test/index.test @@ -11,7 +11,7 @@ # This file implements regression tests for SQLite library. The # focus of this file is testing the CREATE INDEX statement. # -# $Id: index.test,v 1.23 2003/06/15 23:42:25 drh Exp $ +# $Id: index.test,v 1.24 2003/09/27 00:41:28 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -473,22 +473,22 @@ do_test index-14.8 { execsql { SELECT c FROM t6 WHERE a<'abc'; } -} {3 5 2 1} +} {5 2 1} do_test index-14.9 { execsql { SELECT c FROM t6 WHERE a<='abc'; } -} {3 5 2 1 4} +} {5 2 1 4} do_test index-14.10 { execsql { SELECT c FROM t6 WHERE a<=''; } -} {3 5 2 1} +} {5 2 1} do_test index-14.11 { execsql { SELECT c FROM t6 WHERE a<''; } -} {3 5} +} {5} integrity_check index-14.12 do_test index-15.1 { diff --git a/test/null.test b/test/null.test index 61128acc8f..9705921715 100644 --- a/test/null.test +++ b/test/null.test @@ -173,6 +173,64 @@ do_test null-7.2 { } } {1 2 3} +# Ticket #461 - Make sure nulls are handled correctly when doing a +# lookup using an index. +# +do_test null-8.1 { + execsql { + CREATE TABLE t4(x,y); + INSERT INTO t4 VALUES(1,11); + INSERT INTO t4 VALUES(2,NULL); + SELECT x FROM t4 WHERE y=NULL; + } +} {} +do_test null-8.2 { + execsql { + SELECT x FROM t4 WHERE y IN (33,NULL); + } +} {} +do_test null-8.3 { + execsql { + SELECT x FROM t4 WHERE y<33 ORDER BY x; + } +} {1} +do_test null-8.4 { + execsql { + SELECT x FROM t4 WHERE y>6 ORDER BY x; + } +} {1} +do_test null-8.5 { + execsql { + SELECT x FROM t4 WHERE y!=33 ORDER BY x; + } +} {1} +do_test null-8.11 { + execsql { + CREATE INDEX t4i1 ON t4(y); + SELECT x FROM t4 WHERE y=NULL; + } +} {} +do_test null-8.12 { + execsql { + SELECT x FROM t4 WHERE y IN (33,NULL); + } +} {} +do_test null-8.13 { + execsql { + SELECT x FROM t4 WHERE y<33 ORDER BY x; + } +} {1} +do_test null-8.14 { + execsql { + SELECT x FROM t4 WHERE y>6 ORDER BY x; + } +} {1} +do_test null-8.15 { + execsql { + SELECT x FROM t4 WHERE y!=33 ORDER BY x; + } +} {1} + finish_test