Fix a window-functions problem that could occur if an ORDER BY clause contains an alias for a window-function that is not a top-level expression.

FossilOrigin-Name: 1cc6cf6407c6e25aeafeca379a93d0ad2614839c07fb3644e46926fce5f1cfab
This commit is contained in:
dan 2019-09-26 15:53:37 +00:00
parent b19131a8c6
commit a51ddb1ed7
7 changed files with 127 additions and 12 deletions

View File

@ -1,5 +1,5 @@
C Add\sa\smissing\sVdbeCoverage()\smacro.
D 2019-09-25T18:44:49.609
C Fix\sa\swindow-functions\sproblem\sthat\scould\soccur\sif\san\sORDER\sBY\sclause\scontains\san\salias\sfor\sa\swindow-function\sthat\sis\snot\sa\stop-level\sexpression.
D 2019-09-26T15:53:37.561
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@ -523,7 +523,7 @@ F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75
F src/prepare.c 132484635a30f873ee7eccd47f93ed1932503863b93b28423b42332d81adffaf
F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
F src/resolve.c 9891cf5fd155bb199f8b1ff5d1429b9f70484487f4c455bba94348d4cb6f829f
F src/resolve.c 458fb2b024643e0b6393845386aca687de7a84264b8d709fb31df8a72709cbeb
F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
F src/select.c f509982c96bb24ccf57a0155fbe1e6184e0b8fb8866a04397dc41baa400e5240
F src/shell.c.in 68698630c21c5489fb3dc961a3ab3840e726c3c01e475dab96055788a7b6e5e6
@ -859,7 +859,7 @@ F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79
F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717
F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3
F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4
F test/filter1.test f0ee87b2adf6a90aa81456f20a0b097bb75ed3f6bdcf641fe103cc797dd109b9
F test/filter1.test c2f34e58ee82a60c3ee9b5b4c4f2004ec2f529dff2f473706eeffa684cbb6719
F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8
F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a
F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b
@ -1707,8 +1707,8 @@ F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d
F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc
F test/window1.test 376a7c9c5b9df9868d92a6d9d455262e1b769f4410b19006f5f8c5507c2a7ed7
F test/window2.tcl a44834af6267be6e14882311ef8790bf5047f1b9bc25685ee1762d48dc24f1e7
F test/window2.test 2f3ae63e171dce7f2ac29a41020f4da413b1d7bdaba48ee124fd336b152e34c5
F test/window2.tcl 66db96fd9fd202bc31ee7f8ce7904cb469564864cff3f74e009bfef8102333f4
F test/window2.test af2a001ded703bb8f2474fb0edfef170d5aba00f5c1f2aa9f65935b5da13df90
F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03
F test/window3.test e9959a993c8a71e96433be8daaa1827d78b8921e4f12debd7bdbeb3c856ef3cb
F test/window4.tcl d732df0e81beedc0ba8a563ade68611d322d27303ad0c0c8e4444107c39e84ec
@ -1719,7 +1719,7 @@ F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d761
F test/window7.test 1d31276961ae7801edc72173edaf7593e3cbc79c06d1f1f09e20d8418af403cd
F test/window8.tcl f2711aa3571e4e6b0dad98db8d95fd6cb8d9db0c92bbdf535f153b07606a1ce2
F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b
F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693
F test/window9.test ae8be07be05a5a4c8ead1818ac5d45f278b8dd456e589d67f24270b0070c35a0
F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be
F test/windowB.test 7a983ea1cc1cf72be7f378e4b32f6cb2d73014c5cd8b25aaee825164cd4269e5
F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0
@ -1845,7 +1845,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 a19884455b9bafcdc769362d61cfd02df1b5643263e004cb533698bbcfca752b
R 19711e15e7722019f82536f601716d02
U drh
Z 577559de451edfb4decadf2550348c8d
P 36d35dbd5a80dc4a149ed7409cc4b43712622fc4c6a8915b4fbb62fd1d6b7763
R 65ee3f533ee28e9e60f85f94c4e77594
U dan
Z ab678b06e2dc401b849d5e844b6637fe

View File

@ -1 +1 @@
36d35dbd5a80dc4a149ed7409cc4b43712622fc4c6a8915b4fbb62fd1d6b7763
1cc6cf6407c6e25aeafeca379a93d0ad2614839c07fb3644e46926fce5f1cfab

View File

@ -96,6 +96,9 @@ static void resolveAlias(
pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken);
pExpr->flags |= EP_MemToken;
}
if( ExprHasProperty(pExpr, EP_WinFunc) ){
pExpr->y.pWin->pOwner = pExpr;
}
sqlite3DbFree(db, pDup);
}
ExprSetProperty(pExpr, EP_Alias);

View File

@ -134,4 +134,35 @@ do_execsql_test 3.5 {
SELECT a, c, max(b) FILTER (WHERE c='x') FROM t2 GROUP BY a;
} {1 x 5 2 6 {}}
#-------------------------------------------------------------------------
reset_db
do_execsql_test 4.0 {
CREATE TABLE t1(a, b, c);
INSERT INTO t1 VALUES('a', 0, 5);
INSERT INTO t1 VALUES('a', 1, 10);
INSERT INTO t1 VALUES('a', 0, 15);
INSERT INTO t1 VALUES('b', 0, 5);
INSERT INTO t1 VALUES('b', 1, 1000);
INSERT INTO t1 VALUES('b', 0, 5);
INSERT INTO t1 VALUES('c', 0, 1);
INSERT INTO t1 VALUES('c', 1, 2);
INSERT INTO t1 VALUES('c', 0, 3);
}
do_execsql_test 4.1 {
SELECT avg(c) FILTER (WHERE b!=1) AS h FROM t1 GROUP BY a ORDER BY h;
} {2.0 5.0 10.0}
do_execsql_test 4.2 {
SELECT avg(c) FILTER (WHERE b!=1) AS h FROM t1 GROUP BY a ORDER BY (h+1.0);
} {2.0 5.0 10.0}
do_execsql_test 4.3 {
SELECT a, avg(c) FILTER (WHERE b!=1) AS h FROM t1 GROUP BY a ORDER BY avg(c);
} {c 2.0 a 10.0 b 5.0}
do_execsql_test 4.4 {
SELECT a, avg(c) FILTER (WHERE b!=1) FROM t1 GROUP BY a ORDER BY 2
} {c 2.0 b 5.0 a 10.0}
finish_test

View File

@ -432,6 +432,21 @@ execsql_test 4.11 {
SELECT count(distinct a) FILTER (WHERE b='odd') FROM t1
}
==========
execsql_test 5.0 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(x INTEGER, y INTEGER);
INSERT INTO t1 VALUES(10, 1);
INSERT INTO t1 VALUES(20, 2);
INSERT INTO t1 VALUES(3, 3);
INSERT INTO t1 VALUES(2, 4);
INSERT INTO t1 VALUES(1, 5);
}
execsql_float_test 5.1 {
SELECT avg(x) OVER (ORDER BY y) AS z FROM t1 ORDER BY z;
}
finish_test

View File

@ -901,4 +901,33 @@ do_execsql_test 4.11 {
SELECT count(distinct a) FILTER (WHERE b='odd') FROM t1
} {3}
#==========================================================================
do_execsql_test 5.0 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(x INTEGER, y INTEGER);
INSERT INTO t1 VALUES(10, 1);
INSERT INTO t1 VALUES(20, 2);
INSERT INTO t1 VALUES(3, 3);
INSERT INTO t1 VALUES(2, 4);
INSERT INTO t1 VALUES(1, 5);
} {}
do_test 5.1 {
set myres {}
foreach r [db eval {SELECT avg(x) OVER (ORDER BY y) AS z FROM t1 ORDER BY z;}] {
lappend myres [format %.4f [set r]]
}
set res2 {7.2000 8.7500 10.0000 11.0000 15.0000}
set i 0
foreach r [set myres] r2 [set res2] {
if {[set r]<([set r2]-0.0001) || [set r]>([set r2]+0.0001)} {
error "list element [set i] does not match: got=[set r] expected=[set r2]"
}
incr i
}
set {} {}
} {}
finish_test

View File

@ -195,5 +195,42 @@ do_execsql_test 6.2 {
BETWEEN 1 AND 1;
} {0}
#-------------------------------------------------------------------------
reset_db
do_execsql_test 7.0 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(x, y);
INSERT INTO t1 VALUES(10, 1);
INSERT INTO t1 VALUES(20, 2);
INSERT INTO t1 VALUES(3, 3);
INSERT INTO t1 VALUES(2, 4);
INSERT INTO t1 VALUES(1, 5);
} {}
do_execsql_test 7.1 {
SELECT avg(x) OVER (ORDER BY y) AS z FROM t1 ORDER BY z
} {
7.2 8.75 10.0 11.0 15.0
}
do_execsql_test 7.2 {
SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY (z IS y);
} {
10.0 15.0 11.0 8.75 7.2
}
do_execsql_test 7.3 {
SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY (y IS z);
} {
10.0 15.0 11.0 8.75 7.2
}
do_execsql_test 7.4 {
SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY z + 0.0;
} {
7.2 8.75 10.0 11.0 15.0
}
finish_test