-C Do\snot\sapply\sthe\sWHERE-clause\spushdown\soptimization\sto\sterms\sthat\soriginate\nin\sthe\sON\sor\sUSING\sclause\sof\sa\sLEFT\sJOIN.\s\sFix\sfor\sticket\n[c2a19d81652f40568c].
-D 2017-07-17T19:14:11.253
+C When\schecking\sfor\sthe\sWHERE-clause\spush-down\soptimization,\sverify\sthat\nall\sterms\sof\sthe\scompound\sinner\sSELECT\sare\snon-aggregate,\snot\sjust\sthe\nlast\sterm.\s\sFix\sfor\sticket\s[f7f8c97e97597].
+D 2017-07-17T19:25:10.921
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 00d12636df7a5b08af09116bcd6c7bfd49b8b3b4
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F src/random.c ba2679f80ec82c4190062d756f22d0c358180696
F src/resolve.c 41aa91af56d960e9414ce1d7c17cfb68e0d1c6cb
F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e
-F src/select.c 75f825e980a1e2b4fa703757b52677a53892e0d6a89c6a765391f4c8dbe49c76
+F src/select.c 7922b1e1aaceb8eea4b921d0e6d062e32cfef8d897c6b30015fdd546c9b9f57f
F src/shell.c 84a1593bd86aaa14f4da8a8f9b16fbc239d262aa
F src/sqlite.h.in 278602140d49575e8708e643161f4263e428a02a
F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad
F test/select1.test fc2a61f226a649393664ad54bc5376631801517c
F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56
F test/select3.test 2ce595f8fb8e2ac10071d3b4e424cadd4634a054
-F test/select4.test e20e8ce47b558de80616102ef273704cf0d48a3b
+F test/select4.test ddcaffe16252e84b85550d775b7a03bcf0d390b688122ca653d7199e469e3d5e
F test/select5.test e758b8ef94f69b111df4cb819008856655dcd535
F test/select6.test 39eac4a5c03650b2b473c532882273283ee8b7a0
F test/select7.test 7fd2ef598cfabb6b9ff6ac13973b91d0527df49d
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 043d6ce8ad85f8044735747b8938ea5ce9a08e71b860c2b7179b824021bb7a62
-Q +351bc22fa9b5a2e50da3583a882c5aa390bda19f
-R 6db0016b61cd969747c5a4253c144477
+P 52674f948c3e74e5cc32874d4885f2302ad1d5dd0bc45ff6bfda18cf4bea904a
+Q +ec215f94ac9748c0acd82af0cc9e7a92249462f9
+R a908a996bcff610704d1aca2821ce465
U drh
-Z 0af93fca2845697dabd5891a1460c268
+Z 30ce9b14a61bc1a1adc0dcec2dba7a8c
-52674f948c3e74e5cc32874d4885f2302ad1d5dd0bc45ff6bfda18cf4bea904a
\ No newline at end of file
+adc082c1461e0237cd42653b529fbc136f5899baeff6ee32ee943d76184080c1
\ No newline at end of file
){
Expr *pNew;
int nChng = 0;
+ Select *pX; /* For looping over compound SELECTs in pSubq */
if( pWhere==0 ) return 0;
- if( (pSubq->selFlags & (SF_Aggregate|SF_Recursive))!=0 ){
- return 0; /* restrictions (1) and (2) */
+ for(pX=pSubq; pX; pX=pX->pPrior){
+ if( (pX->selFlags & (SF_Aggregate|SF_Recursive))!=0 ){
+ testcase( pX->selFlags & SF_Aggregate );
+ testcase( pX->selFlags & SF_Recursive );
+ testcase( pX!=pSubq );
+ return 0; /* restrictions (1) and (2) */
+ }
}
if( pSubq->pLimit!=0 ){
- return 0; /* restriction (3) */
+ return 0; /* restriction (3) */
}
while( pWhere->op==TK_AND ){
nChng += pushDownWhereTerms(db, pSubq, pWhere->pRight, iCursor);
SELECT * FROM t14 UNION ALL VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3);
} {1 2 3 4 5 6 3 2 1 2 3 1 1 2 3 2 1 3}
+# Ticket https://www.sqlite.org/src/tktview/f7f8c97e975978d45 on 2016-04-25
+#
+# The where push-down optimization from 2015-06-02 is suppose to disable
+# on aggregate subqueries. But if the subquery is a compound where the
+# last SELECT is non-aggregate but some other SELECT is an aggregate, the
+# test is incomplete and the optimization is not properly disabled.
+#
+# The following test cases verify that the fix works.
+#
+do_execsql_test select4-17.1 {
+ DROP TABLE IF EXISTS t1;
+ CREATE TABLE t1(a int, b int);
+ INSERT INTO t1 VALUES(1,2),(1,18),(2,19);
+ SELECT x, y FROM (
+ SELECT 98 AS x, 99 AS y
+ UNION
+ SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a
+ ) AS w WHERE y>=20
+ ORDER BY +x;
+} {1 20 98 99}
+do_execsql_test select4-17.2 {
+ SELECT x, y FROM (
+ SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a
+ UNION
+ SELECT 98 AS x, 99 AS y
+ ) AS w WHERE y>=20
+ ORDER BY +x;
+} {1 20 98 99}
+do_catchsql_test select4-17.3 {
+ SELECT x, y FROM (
+ SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a LIMIT 3
+ UNION
+ SELECT 98 AS x, 99 AS y
+ ) AS w WHERE y>=20
+ ORDER BY +x;
+} {1 {LIMIT clause should come after UNION not before}}
+
finish_test