-C Reinsert\sthe\sexperimental\ssqlite_commit_hook()\sAPI.\s(CVS\s1179)
-D 2004-01-15T02:44:03
+C Allow\s"<expr>\sIN\s<table>"\sas\sa\sshorthand\sfor\n"<expr>\sIN\s(SELECT\s*\sFROM\s<table>)"\s(CVS\s1180)
+D 2004-01-15T03:30:25
F Makefile.in 0515ff9218ad8d5a8f6220f0494b8ef94c67013b
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
F src/os.h 257c9aef1567bb20c8b767fc27fe3ee7d89104e0
F src/pager.c 289328d8efba620eae99f6c2f6062710838a3eb4
F src/pager.h 5da62c83443f26b1792cfd72c96c422f91aadd31
-F src/parse.y c65aa6c5508763806ac9734b0589b93480ec7e7a
+F src/parse.y e41722d11148f34f034716652c1668ffb0ef2905
F src/pragma.c deec7342741e371f3042adaee53fcc324c5dd1d4
F src/printf.c 292a7bfc5a815cb6465e32b2d5c9fe9bd43b27f0
F src/random.c 19e8e00fe0df32a742f115773f57651be327cabe
F test/format3.test 149cc166c97923fa60def047e90dd3fb32bba916
F test/func.test 000515779001ac6899eec4b54e65c6e2501279d4
F test/hook.test 1a67ce0cd64a6455d016962542f2822458dccc49
-F test/in.test 22de8a3eb27265aab723adc513bea0e76bef70c6
+F test/in.test 0de39b02ceeca90993b096822fb5a884661c5b47
F test/index.test 9295deefbdb6dedbe01be8905f0c448fe5bd4079
F test/insert.test a17b7f7017097afb2727aa5b67ceeb7ab0a120a1
F test/insert2.test c288375a64dad3295044714f0dfed4a193cf067f
F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
-P c9ac3db8e08403398ec344757385334601a59374
-R 18a9d4e8ef4c6ab1b9d09a62e3e37863
+P 72bc84f2f18f6eeb279a4ad670310e85d154f663
+R 2bc9ea54c7ac36ba81835b3e442ee3bc
U drh
-Z 26c0ac18c73114906997f5ad3548f7ae
+Z 123afbc81ac483920b37bfd6b69d6479
-72bc84f2f18f6eeb279a4ad670310e85d154f663
\ No newline at end of file
+01874d252ac44861e927dea3f5534f67e19b1fa8
\ No newline at end of file
** the parser. Lemon will also generate a header file containing
** numeric codes for all of the tokens.
**
-** @(#) $Id: parse.y,v 1.105 2003/12/06 21:43:56 drh Exp $
+** @(#) $Id: parse.y,v 1.106 2004/01/15 03:30:25 drh Exp $
*/
%token_prefix TK_
%token_type {Token}
A = sqliteExpr(TK_NOT, A, 0, 0);
sqliteExprSpan(A,&X->span,&E);
}
+expr(A) ::= expr(X) IN nm(Y) dbnm(D). {
+ SrcList *pSrc = sqliteSrcListAppend(0, &Y, &D);
+ ExprList *pList = sqliteExprListAppend(0, sqliteExpr(TK_ALL,0,0,0), 0);
+ A = sqliteExpr(TK_IN, X, 0, 0);
+ if( A ) A->pSelect = sqliteSelectNew(pList,pSrc,0,0,0,0,0,-1,0);
+ sqliteExprSpan(A,&X->span,D.z?&D:&Y);
+}
+expr(A) ::= expr(X) NOT IN nm(Y) dbnm(D). {
+ SrcList *pSrc = sqliteSrcListAppend(0, &Y, &D);
+ ExprList *pList = sqliteExprListAppend(0, sqliteExpr(TK_ALL,0,0,0), 0);
+ A = sqliteExpr(TK_IN, X, 0, 0);
+ if( A ) A->pSelect = sqliteSelectNew(pList,pSrc,0,0,0,0,0,-1,0);
+ A = sqliteExpr(TK_NOT, A, 0, 0);
+ sqliteExprSpan(A,&X->span,D.z?&D:&Y);
+}
+
/* CASE expressions */
expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
# This file implements regression tests for SQLite library. The
# focus of this file is testing the IN and BETWEEN operator.
#
-# $Id: in.test,v 1.10 2003/04/19 17:27:25 drh Exp $
+# $Id: in.test,v 1.11 2004/01/15 03:30:25 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
}
} {world}
-
+# Test constructs of the form: expr IN tablename
+#
+do_test in-9.1 {
+ execsql {
+ CREATE TABLE t4 AS SELECT a FROM tb;
+ SELECT * FROM t4;
+ }
+} {1 2 3 5 7 9 11}
+do_test in-9.2 {
+ execsql {
+ SELECT b FROM t1 WHERE a IN t4;
+ }
+} {32 128}
+do_test in-9.3 {
+ execsql {
+ SELECT b FROM t1 WHERE a NOT IN t4;
+ }
+} {64 256 world}
+do_test in-9.4 {
+ catchsql {
+ SELECT b FROM t1 WHERE a NOT IN tb;
+ }
+} {1 {only a single result allowed for a SELECT that is part of an expression}}
finish_test