From: drh Date: Thu, 25 Aug 2005 12:45:04 +0000 (+0000) Subject: When the left-hand side of an IN operator is constant and the right-hand X-Git-Tag: version-3.6.10~3535 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=87abf5c033eb731e10d09e1dd318cc2e1aef27f4;p=thirdparty%2Fsqlite.git When the left-hand side of an IN operator is constant and the right-hand side is a SELECT, recognize that the IN operator is not constant. Ticket #1380. (CVS 2624) FossilOrigin-Name: fc9e04609b6968fc5039a6f9f808aac681f4fc41 --- diff --git a/manifest b/manifest index 1315f75038..0ccfb0a6f1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\s--enable-threadsafe\soption\sto\sthe\sconfigure\sscript.\s\sTicket\s#1378.\s(CVS\s2623) -D 2005-08-24T18:04:52 +C When\sthe\sleft-hand\sside\sof\san\sIN\soperator\sis\sconstant\sand\sthe\sright-hand\nside\sis\sa\sSELECT,\srecognize\sthat\sthe\sIN\soperator\sis\snot\sconstant.\nTicket\s#1380.\s(CVS\s2624) +D 2005-08-25T12:45:04 F Makefile.in 87717916c787099d5a9a64f7a2acc188b4bbcadd F Makefile.linux-gcc 06be33b2a9ad4f005a5f42b22c4a19dab3cbb5c7 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -40,7 +40,7 @@ F src/complete.c 4de937dfdd4c79a501772ab2035b26082f337a79 F src/date.c 7444b0900a28da77e57e3337a636873cff0ae940 F src/delete.c be1fc25c9e109cd8cbab42a43ee696263da7c04b F src/experimental.c 50c1e3b34f752f4ac10c36f287db095c2b61766d -F src/expr.c e05fa8448a6417ef996c48c66397a05f58594e14 +F src/expr.c 1916cb22c585e1aa0d1e25a8efe7497004b6ae32 F src/func.c 5b12db87f0bc7d978eaf87c7a348ada5d1934da4 F src/hash.c 2b1b13f7400e179631c83a1be0c664608c8f021f F src/hash.h 1b0c445e1c89ff2aaad9b4605ba61375af001e84 @@ -205,7 +205,7 @@ F test/select5.test ae1b5ee2485c5fdc610207a391cfdc23e59c7834 F test/select6.test 6559d16ad16edb7d6864f7e74a3d204d0af72486 F test/select7.test 1bf795b948c133a15a2a5e99d3270e652ec58ce6 F test/sort.test 3b871d6e032f0a6c84d9f3d2d4b226e8fda97de0 -F test/subquery.test 0df3de0dbb65165b96ebe895550f1549d5439856 +F test/subquery.test ed4ecba1afacb586c86fad1cdb92756a48a90302 F test/subselect.test 3f3f7a940dc3195c3139f4d530385cb54665d614 F test/table.test d0e05ede3f6e5a8b79f8661ddcc4618cf7e69f8a F test/tableapi.test 6a66d58b37d46dc0f2b3c7d4bd2617d209399bd1 @@ -298,7 +298,7 @@ F www/tclsqlite.tcl 3df553505b6efcad08f91e9b975deb2e6c9bb955 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513 -P 881dcf5fb16997830ff347d2eb2610784b415f25 -R 939024975362728b01087b80f2fa0a24 +P 76ec0b3d3a6cc82965e4f993375780b954c53dd1 +R 52db1856673c57f1c9eec51f995f0a47 U drh -Z 0f48b7d406ced2895a04bb83a892dae0 +Z 2cab6797642524cf30db4c5e3889225c diff --git a/manifest.uuid b/manifest.uuid index bc5de6e48d..86354c7cd7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -76ec0b3d3a6cc82965e4f993375780b954c53dd1 \ No newline at end of file +fc9e04609b6968fc5039a6f9f808aac681f4fc41 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index e431da1ec8..10283ef2e8 100644 --- a/src/expr.c +++ b/src/expr.c @@ -12,7 +12,7 @@ ** This file contains routines used for analyzing expressions and ** for generating VDBE code that evaluates expressions in SQLite. ** -** $Id: expr.c,v 1.220 2005/08/24 16:54:05 drh Exp $ +** $Id: expr.c,v 1.221 2005/08/25 12:45:04 drh Exp $ */ #include "sqliteInt.h" #include @@ -624,6 +624,8 @@ void sqlite3ExprListDelete(ExprList *pList){ ** ** The return value from this routine is 1 to abandon the tree walk ** and 0 to continue. +** +** NOTICE: This routine does *not* descend into subqueries. */ static int walkExprList(ExprList *, int (*)(void *, Expr*), void *); static int walkExprTree(Expr *pExpr, int (*xFunc)(void*,Expr*), void *pArg){ @@ -696,6 +698,11 @@ static int exprNodeIsConstant(void *pArg, Expr *pExpr){ #endif *((int*)pArg) = 0; return 2; + case TK_IN: + if( pExpr->pSelect ){ + *((int*)pArg) = 0; + return 2; + } default: return 0; } diff --git a/test/subquery.test b/test/subquery.test index d62f5ec3d6..394b7fdebc 100644 --- a/test/subquery.test +++ b/test/subquery.test @@ -11,7 +11,7 @@ # This file implements regression tests for SQLite library. The # focus of this script is testing correlated subqueries # -# $Id: subquery.test,v 1.11 2005/07/21 03:48:20 drh Exp $ +# $Id: subquery.test,v 1.12 2005/08/25 12:45:04 drh Exp $ # set testdir [file dirname $argv0] @@ -386,6 +386,29 @@ do_test subquery-5.2 { } {1} +# Ticket #1380. Make sure correlated subqueries on an IN clause work +# correctly when the left-hand side of the IN operator is constant. +# +do_test subquery-6.1 { + set callcnt 0 + execsql { + SELECT x FROM t4 WHERE 1 IN (SELECT callcnt(count(*)) FROM t5 WHERE a=y) + } +} {one two three four} +do_test subquery-6.2 { + set callcnt +} {4} +do_test subquery-6.3 { + set callcnt 0 + execsql { + SELECT x FROM t4 WHERE 1 IN (SELECT callcnt(count(*)) FROM t5 WHERE a=1) + } +} {one two three four} +do_test subquery-6.4 { + set callcnt +} {1} + +