]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the ability to have a table-valued function on the RHS of an IN operator.
authordrh <drh@noemail.net>
Wed, 29 Jun 2016 06:19:19 +0000 (06:19 +0000)
committerdrh <drh@noemail.net>
Wed, 29 Jun 2016 06:19:19 +0000 (06:19 +0000)
FossilOrigin-Name: ba1b441b6003808810667d749635fe6b2e8c6165

manifest
manifest.uuid
src/parse.y
test/tabfunc01.test

index defdea7bc4109a5e232a521294102f86de0bb378..3973bf7b86fe959449223e42698cffe6362e52b2 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Another\stest\scase\sfor\sthe\sintarray($PTR,$N)\svirtual\stable.
-D 2016-06-29T05:08:01.847
+C Add\sthe\sability\sto\shave\sa\stable-valued\sfunction\son\sthe\sRHS\sof\san\sIN\soperator.
+D 2016-06-29T06:19:19.192
 F Makefile.in 541d493154ec3b0b20b2f1d495ec66f55905191e
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 50149765ef72f4e652b9a0f1f6462c4784bb9423
@@ -372,7 +372,7 @@ F src/os_win.c d4b8faf8896b65818e67070711fdd00d8e620bd6
 F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca
 F src/pager.c c368634b888b1c8740aea83b36bfd266f2443e60
 F src/pager.h 8ab6b6feeee4bc0439bfde7ee59ba99df98b9bc3
-F src/parse.y 01b9f37c4c7009ab56fda98bc7db4c42643cecfe
+F src/parse.y 300a30380bfa73c0a0d2e0ae4c4d0cd844d80199
 F src/pcache.c 5583c8ade4b05075a60ba953ef471d1c1a9c05df
 F src/pcache.h 2cedcd8407eb23017d92790b112186886e179490
 F src/pcache1.c 7f51d2b541aab57596adf62db2c4bb025d34f04d
@@ -1115,7 +1115,7 @@ F test/symlink.test c9ebe7330d228249e447038276bfc8a7b22f4849
 F test/sync.test 2f84bdbc2b2df1fcb0220575b4b9f8cea94b7529
 F test/syscall.test f59ba4e25f7ba4a4c031026cc2ef8b6e4b4c639c
 F test/sysfault.test c9f2b0d8d677558f74de750c75e12a5454719d04
-F test/tabfunc01.test bb0ef0fdf5e807c5bc3438c8c4face4c9887971d
+F test/tabfunc01.test 32e620a19963c50dcf6958dc5bb352de96d948fb
 F test/table.test b708f3e5fa2542fa51dfab21fc07b36ea445cb2f
 F test/tableapi.test 2674633fa95d80da917571ebdd759a14d9819126
 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930
@@ -1503,7 +1503,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 233b33382dc70de45f90b6dfdb5785f20b21489e
-R 67bef7ed0b382234904201d45ecddcca
+P 06e1fab7527c6b4330a58f8d8873afaf2d67ae86
+R a95030951795f74126be51a632f80a74
 U drh
-Z bbb146cf4e7f714032732261f87e16f3
+Z 5d31abe2efd2f25b296efdbc945337ef
index ba2f320cf989f33148d35eb0aad55fc5b895a710..6d65c9b6273a8169735a3d787fdc9d2e3364b91d 100644 (file)
@@ -1 +1 @@
-06e1fab7527c6b4330a58f8d8873afaf2d67ae86
\ No newline at end of file
+ba1b441b6003808810667d749635fe6b2e8c6165
\ No newline at end of file
index 9294a30428d59cfbb81a59ce6b1411d788871c1b..d69bd6841ae592fd2d9c10d350dade5955f83843 100644 (file)
@@ -1142,6 +1142,15 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
     exprNot(pParse, N, &A);
     A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n];
   }
+  expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) LP exprlist(E) RP. [IN] {
+    SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z);
+    Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
+    sqlite3SrcListFuncArgs(pParse, pSrc, E);
+    A.pExpr = sqlite3PExpr(pParse, TK_IN, A.pExpr, 0, 0);
+    sqlite3PExprAddSelect(pParse, A.pExpr, pSelect);
+    exprNot(pParse, N, &A);
+    A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n];
+  }
   expr(A) ::= EXISTS(B) LP select(Y) RP(E). {
     Expr *p;
     spanSet(&A,&B,&E); /*A-overwrites-B*/
index d0de104d81d0b1792ec29711a9719760ce12ffe8..a0aae155bdb4bd6a6d84f80e2e5abc04e80cdce7 100644 (file)
@@ -178,6 +178,22 @@ do_test tabfunc01-661 {
 } 11
 sqlite3_finalize $VM
 
+do_test tabfunc01-670 {
+  set TAIL {}
+  set VM [sqlite3_prepare db {
+     SELECT length(y) FROM t6 WHERE x IN intarray(?1,3);
+  } -1 TAIL]
+  string trim $TAIL
+} {}
+do_test tabfunc01-671 {
+  sqlite3_bind_intarray $VM 1 11 22 33 44 55
+  sqlite3_step $VM
+} SQLITE_ROW
+do_test tabfunc01-672 {
+  sqlite3_column_int $VM 0
+} 11
+sqlite3_finalize $VM
+
 catch {sqlite3_bind_intarray}
 
 finish_test