]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix handling the case where a sub-query in a FROM clause is itself a UNION
authordan <dan@noemail.net>
Thu, 5 Jan 2017 17:23:11 +0000 (17:23 +0000)
committerdan <dan@noemail.net>
Thu, 5 Jan 2017 17:23:11 +0000 (17:23 +0000)
ALL, and one side of that UNION ALL is a query on a view that includes an
ORDER BY. Fix for ticket [190c2507].

FossilOrigin-Name: 590ca83b8e8cdd5d24ed7f10f43e540aa0627f22

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

index 406575903b1e1e7f000e04433f83d39c2c660a3e..a63cb41c6a92de7b2454d5a701900d8e625682d2 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sproblems\sin\strigger\sand\sforeign\skey\shandling\swhen\sdoing\sREPLACE\son\sa\nWITHOUT\sROWID\stable\sthat\shas\sno\ssecondary\sindexes.
-D 2017-01-05T13:50:12.504
+C Fix\shandling\sthe\scase\swhere\sa\ssub-query\sin\sa\sFROM\sclause\sis\sitself\sa\sUNION\nALL,\sand\sone\sside\sof\sthat\sUNION\sALL\sis\sa\squery\son\sa\sview\sthat\sincludes\san\nORDER\sBY.\sFix\sfor\sticket\s[190c2507].
+D 2017-01-05T17:23:11.079
 F Makefile.in 41bd4cad981487345c4a84081074bcdb876e4b2e
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc b8ca53350ae545e3562403d5da2a69cec79308da
@@ -388,7 +388,7 @@ F src/printf.c ff10a9b9902cd2afe5f655f3013c6307d969b1fd
 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
 F src/resolve.c bb070cf5f23611c44ab7e4788803684e385fc3fb
 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
-F src/select.c dfb6cadc3dcfba1b1bdbfba62ebba2b4b673413e
+F src/select.c 4437d9d5d56b6ffdedabf394c7fe3a07ff521ce9
 F src/shell.c 6095531aa900decdaa765e0f3993fba7153c92c1
 F src/sqlite.h.in e8e2d108d82647f0a812fdb74accf91c1ec08ddc
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -1073,7 +1073,7 @@ F test/select8.test 8c8f5ae43894c891efc5755ed905467d1d67ad5d
 F test/select9.test aebc2bb0c3bc44606125033cbcaac2c8d1f33a95
 F test/selectA.test 101e722370ac6e84978c2958b8931c78b10a1709
 F test/selectB.test 954e4e49cf1f896d61794e440669e03a27ceea25
-F test/selectC.test 871fb55d884d3de5943c4057ebd22c2459e71977
+F test/selectC.test e25243f8ca503e06f252eb0218976d07cfeceac3
 F test/selectD.test b0f02a04ef7737decb24e08be2c39b9664b43394
 F test/selectE.test a8730ca330fcf40ace158f134f4fe0eb00c7edbf
 F test/selectF.test 21c94e6438f76537b72532fa9fd4710cdd455fc3
@@ -1542,8 +1542,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 2dc7eeb5b4d2eaf1d843eda56f339fd4cc80d78e c1220b1af62629d7fc2178512786d613cd7ea711
-R 0a003593029beee0fa918d480996f76b
-T +closed c1220b1af62629d7fc2178512786d613cd7ea711
-U drh
-Z e1a141b0e862b9e3c1acfc1860dde6a3
+P 571f166ea8721e2322965b6f23e758b78d13baca
+R 5877f43df188f502f476d2f10520ec1c
+U dan
+Z 5cce284946e3a767bc44d73b1e732025
index 7ab76f290b0eecf4c83e350e19022a23d4d2e7ca..b593a2938f1eb1c12e2a4d5b30a868563230e37e 100644 (file)
@@ -1 +1 @@
-571f166ea8721e2322965b6f23e758b78d13baca
\ No newline at end of file
+590ca83b8e8cdd5d24ed7f10f43e540aa0627f22
\ No newline at end of file
index e5f4c7fcdff8465faf1cd2441fc81ff63814b259..75ae082e962ee03d116a3ba60467dd56b8fbcfb5 100644 (file)
@@ -742,8 +742,7 @@ static void selectInnerLoop(
     }else{
       ecelFlags = 0;
     }
-    assert( eDest!=SRT_Table || pSort==0 );
-    if( pSort && hasDistinct==0 && eDest!=SRT_EphemTab ){
+    if( pSort && hasDistinct==0 && eDest!=SRT_EphemTab && eDest!=SRT_Table ){
       /* For each expression in pEList that is a copy of an expression in
       ** the ORDER BY clause (pSort->pOrderBy), set the associated 
       ** iOrderByCol value to one more than the index of the ORDER BY 
@@ -1285,6 +1284,7 @@ static void generateSortTail(
     VdbeComment((v, "%s", aOutEx[i].zName ? aOutEx[i].zName : aOutEx[i].zSpan));
   }
   switch( eDest ){
+    case SRT_Table:
     case SRT_EphemTab: {
       sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, regRowid);
       sqlite3VdbeAddOp3(v, OP_Insert, iParm, regRow, regRowid);
index dedac41fc474dd816bf798a114fbdbcd4cc159c3..4d7996300745a89bd6d91de6dedc9300a59f2626 100644 (file)
@@ -14,6 +14,7 @@
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
+set testprefix selectC
 
 # Ticket #
 do_test selectC-1.1 {
@@ -233,4 +234,37 @@ do_execsql_test selectC-4.3 {
   select a, udf() from (select distinct a, b from t_distinct_bug)
 } {1 1 1 2 1 3}
 
+#-------------------------------------------------------------------------
+# Test that the problem in ticket #190c2507 has been fixed.
+#
+do_execsql_test 5.0 {
+  CREATE TABLE x1(a);
+  CREATE TABLE x2(b);
+  CREATE TABLE x3(c);
+  CREATE VIEW vvv AS SELECT b FROM x2 ORDER BY 1;
+
+  INSERT INTO x1 VALUES('a'), ('b');
+  INSERT INTO x2 VALUES(22), (23), (25), (24), (21);
+  INSERT INTO x3 VALUES(302), (303), (301);
+}
+
+do_execsql_test 5.1 {
+  CREATE TABLE x4 AS SELECT b FROM vvv UNION ALL SELECT c from x3;
+  SELECT * FROM x4;
+} {21 22 23 24 25 302 303 301}
+
+do_execsql_test 5.2 {
+  SELECT * FROM x1, x4
+} {
+  a 21 a 22 a 23 a 24 a 25 a 302 a 303 a 301
+  b 21 b 22 b 23 b 24 b 25 b 302 b 303 b 301
+}
+
+do_execsql_test 5.3 {
+  SELECT * FROM x1, (SELECT b FROM vvv UNION ALL SELECT c from x3);
+} {
+  a 21 a 22 a 23 a 24 a 25 a 302 a 303 a 301
+  b 21 b 22 b 23 b 24 b 25 b 302 b 303 b 301
+}
+
 finish_test