]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Allow the RHS of a row-value IN operator to use a compound query with
authordrh <drh@noemail.net>
Fri, 9 Aug 2019 20:26:01 +0000 (20:26 +0000)
committerdrh <drh@noemail.net>
Fri, 9 Aug 2019 20:26:01 +0000 (20:26 +0000)
an ORDER BY clause.

FossilOrigin-Name: eaf15d9bae6773058341d6219241f44ce728ad1cb9cf649f2efd4dddd81ec461

manifest
manifest.uuid
src/select.c
test/rowvalue.test

index cd9cd29aaa4d5c383885550ca35de3cf9c012ef6..a40d0a94d243fa042f0e903271ca5d71c8256451 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Modify\ssignature\sof\ssqlite3VdbeChangeOpcode()\sto\saccept\sint\sinstead\sof\su32.
-D 2019-08-09T01:59:14.998
+C Allow\sthe\sRHS\sof\sa\srow-value\sIN\soperator\sto\suse\sa\scompound\squery\swith\nan\sORDER\sBY\sclause.
+D 2019-08-09T20:26:01.927
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -523,7 +523,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4
 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
 F src/resolve.c d49679d55d3cf529bbdff8734c4ac02cedfb2fc785545b89815ddb79680b9198
 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
-F src/select.c 1c2c1d3ca6437349c5bceab29c9d3583f8fedb21ab3366d6f9d7381259af60cf
+F src/select.c 164270b9b1ce06dbada9225e5dfaed08d61f96da0d98dfd2a93460f62414d620
 F src/shell.c.in 920360b4cde1a0d65a182564abacaaa8c6a54ef52fe224065019006dad76f685
 F src/sqlite.h.in c6bba28018378b6b43fcf4db7e9f1a3e84b0157ff54dc22ed3977acdac88e051
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -1253,7 +1253,7 @@ F test/round1.test 768018b04522ca420b1aba8a24bd76091d269f3bce3902af3ec6ebcee41ab
 F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc
 F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81
 F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3
-F test/rowvalue.test b8680f07d19c8c5223b808bba998faffcec6d505f5689ff6070280119173bb51
+F test/rowvalue.test a3e729d5c1f32da03bba15af1e3128218d2ba3c40d4f4ed5fa0497a713df68ea
 F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b
 F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256
 F test/rowvalue4.test 02e35f7762371c2f57ebd856aa056eac56cb27ef7715a0bb31eac1895a745356
@@ -1835,7 +1835,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 1b85442b614df0808c10c34ec281282e5dfd93d6d5f9737b51263ffaa4da5c72
-R b062fb32a2096cd3828b4110ff96b19e
-U mistachkin
-Z 08b284f8d5d221f42e2712aad95446b9
+P 68b7f2acf4d228f32250e37cbc0eb5d275b512d49071bbb38e1f5634b705f7d3
+R 932bd8e106b14bf6ec94287594ab7143
+U drh
+Z 67ac6d6f5f4c238e1c1f9344651159e0
index 58a1db0c851a7502a7914ce15e3bbf012366b828..b9f11958de89e34fc99a10ea37bea95fe086df56 100644 (file)
@@ -1 +1 @@
-68b7f2acf4d228f32250e37cbc0eb5d275b512d49071bbb38e1f5634b705f7d3
\ No newline at end of file
+eaf15d9bae6773058341d6219241f44ce728ad1cb9cf649f2efd4dddd81ec461
\ No newline at end of file
index 059c6ea9ae502674d315c7e63711b1aee301efe2..229138ebd6fcd9ec26b1281071eaf2fabff40178 100644 (file)
@@ -2967,11 +2967,14 @@ static int generateOutputSubroutine(
 
     /* If this is a scalar select that is part of an expression, then
     ** store the results in the appropriate memory cell and break out
-    ** of the scan loop.
+    ** of the scan loop.  Note that the select might return multiple columns
+    ** if it is the RHS of a row-value IN operator.
     */
     case SRT_Mem: {
-      assert( pIn->nSdst==1 || pParse->nErr>0 );  testcase( pIn->nSdst!=1 );
-      sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, 1);
+      if( pParse->nErr==0 ){
+        testcase( pIn->nSdst>1 );
+        sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, pIn->nSdst);
+      }
       /* The LIMIT clause will jump out of the loop for us */
       break;
     }
index 2a2f8a9d13f35adbb302f7b9040da450213a5f31..e859024711d5b57fc9375f61d8f92eae0c159392 100644 (file)
@@ -557,4 +557,17 @@ do_execsql_test 21.0 {
   SELECT * FROM t1 WHERE (a,b) IN (VALUES(1,2));  
 } {1 2}
 
+# 2019-08-09: Multi-column subquery on the RHS of an IN operator.
+#
+do_execsql_test 22.100 {
+  SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1) IN (SELECT 3,4);
+  SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1) IN (SELECT 5,6);
+  SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1) IN (SELECT 3,4);
+  SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1) IN (SELECT 5,6);
+  SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1 DESC) IN (SELECT 3,4);
+  SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1 DESC) IN (SELECT 5,6);
+  SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1 DESC) IN (SELECT 3,4);
+  SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1 DESC) IN (SELECT 5,6);
+} {1 0 1 0 0 1 0 1}
+
 finish_test