Add tests for the FILTER clause. And a bugfix.
FossilOrigin-Name: 28aa1702f7f0334abd1b30e7aa48ea3679539b11bfbba32bc9f0d6049cf18a7b
This commit is contained in:
parent
6ba7ab0d25
commit
16e12c573d
21
manifest
21
manifest
@ -1,5 +1,5 @@
|
||||
C Experimental\simplementation\sof\sFILTER\sclause\sfor\saggregate\sfunctions.
|
||||
D 2019-07-02T11:56:47.637
|
||||
C Add\stests\sfor\sthe\sFILTER\sclause.\sAnd\sa\sbugfix.
|
||||
D 2019-07-03T18:31:20.108
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||
@ -520,7 +520,7 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13
|
||||
F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3
|
||||
F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4
|
||||
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
||||
F src/resolve.c 65514625b68e79a4087d218107d51d489477509d55543e1be375d1e58f27c2f3
|
||||
F src/resolve.c 3c0dc44956a909e135b92e7691e77fb7cf65ab55f03f0439b4e9758b29841fda
|
||||
F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
|
||||
F src/select.c 1774cc457eb0b6cd757a350fd9f5600c4d13f3e899d6615033aecaa4f00a5e7d
|
||||
F src/shell.c.in 82f8a473c01662f52233c6c75b9bf88d0d2cab276086d5d4ca6f2ff57a3e48eb
|
||||
@ -856,9 +856,9 @@ F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79
|
||||
F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717
|
||||
F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3
|
||||
F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4
|
||||
F test/filter1.test d706edd2c32c6b148143d885927e5cf4ea141106b803e243e5d1bfbdc7e2b5cf
|
||||
F test/filter2.tcl 87e24fd0a2ab502bd4d0350c4eee17a50e2b4364a1b67230f82b8f2a5029f6bf
|
||||
F test/filter2.test dfddced42a534e71a730aa3d4c6b148d9fbf29aa306f9cec6b51f31b8cf7e224
|
||||
F test/filter1.test 8a0f541d2138a10b41c513a9b8193af09d5218ca4e670bc6fd9ed121db1b7bf3
|
||||
F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8
|
||||
F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a
|
||||
F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768
|
||||
F test/fkey2.test d35d1c81e7569bdd2b872e91750f7098117d2e8291369f70b7e3d50a0e523dc2
|
||||
F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49
|
||||
@ -1833,10 +1833,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 eab4297577e4d325fed4757867fc77860de7448998d86f098c8a50272e17d35e
|
||||
R 43e2b0402b61e905810368aafa77ca67
|
||||
T *branch * filter-clause
|
||||
T *sym-filter-clause *
|
||||
T -sym-trunk *
|
||||
P 1f1ae2d6ac8dcbb62e5aa3dc17bc67d559cb565fc0d0a8c00a596075d35f8130
|
||||
R 384c2722df91a465eadfc4c7f6abdf98
|
||||
U dan
|
||||
Z 9e8394b31320bbcccfabf9cff0d64121
|
||||
Z 0118bb47bb74c9177a9d95a1278bf2e1
|
||||
|
@ -1 +1 @@
|
||||
1f1ae2d6ac8dcbb62e5aa3dc17bc67d559cb565fc0d0a8c00a596075d35f8130
|
||||
28aa1702f7f0334abd1b30e7aa48ea3679539b11bfbba32bc9f0d6049cf18a7b
|
@ -826,22 +826,23 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
||||
|
||||
if( 0==IN_RENAME_OBJECT ){
|
||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||
int is_win = ExprHasProperty(pExpr, EP_WinFunc);
|
||||
assert( is_agg==0 || (pDef->funcFlags & SQLITE_FUNC_MINMAX)
|
||||
|| (pDef->xValue==0 && pDef->xInverse==0)
|
||||
|| (pDef->xValue && pDef->xInverse && pDef->xSFunc && pDef->xFinalize)
|
||||
);
|
||||
if( pDef && pDef->xValue==0 && ExprHasProperty(pExpr, EP_WinFunc) ){
|
||||
if( pDef && pDef->xValue==0 && is_win ){
|
||||
sqlite3ErrorMsg(pParse,
|
||||
"%.*s() may not be used as a window function", nId, zId
|
||||
);
|
||||
pNC->nErr++;
|
||||
}else if(
|
||||
(is_agg && (pNC->ncFlags & NC_AllowAgg)==0)
|
||||
|| (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !pExpr->y.pWin)
|
||||
|| (is_agg && pExpr->y.pWin && (pNC->ncFlags & NC_AllowWin)==0)
|
||||
|| (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !is_win)
|
||||
|| (is_agg && is_win && (pNC->ncFlags & NC_AllowWin)==0)
|
||||
){
|
||||
const char *zType;
|
||||
if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || pExpr->y.pWin ){
|
||||
if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || is_win ){
|
||||
zType = "window";
|
||||
}else{
|
||||
zType = "aggregate";
|
||||
@ -880,7 +881,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
||||
** Or arguments of other window functions. But aggregate functions
|
||||
** may be arguments for window functions. */
|
||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||
pNC->ncFlags &= ~(NC_AllowWin | (!pExpr->y.pWin ? NC_AllowAgg : 0));
|
||||
pNC->ncFlags &= ~(NC_AllowWin | (!is_win ? NC_AllowAgg : 0));
|
||||
#else
|
||||
pNC->ncFlags &= ~NC_AllowAgg;
|
||||
#endif
|
||||
|
@ -83,7 +83,7 @@ do_catchsql_test 2.2 {
|
||||
|
||||
do_catchsql_test 2.3 {
|
||||
SELECT sum(a) FILTER (WHERE 1 - count(a)) FROM t1
|
||||
} {1 {misuse of aggregate: count()}}
|
||||
} {1 {misuse of aggregate function count()}}
|
||||
|
||||
finish_test
|
||||
|
||||
|
@ -68,6 +68,65 @@ execsql_test 1.7 {
|
||||
ORDER BY 1, 2, 3, 4;
|
||||
}
|
||||
|
||||
execsql_test 1.8 {
|
||||
SELECT sum(a+b) FILTER (WHERE a=NULL) FROM t1
|
||||
}
|
||||
|
||||
execsql_test 1.9 {
|
||||
SELECT (a%5) FROM t1 GROUP BY (a%5)
|
||||
HAVING sum(b) FILTER (WHERE b<20) > 34
|
||||
ORDER BY 1
|
||||
}
|
||||
|
||||
execsql_test 1.10 {
|
||||
SELECT (a%5), sum(b) FILTER (WHERE b<20) AS bbb
|
||||
FROM t1
|
||||
GROUP BY (a%5) HAVING sum(b) FILTER (WHERE b<20) >34
|
||||
ORDER BY 1
|
||||
}
|
||||
|
||||
execsql_test 1.11 {
|
||||
SELECT (a%5), sum(b) FILTER (WHERE b<20) AS bbb
|
||||
FROM t1
|
||||
GROUP BY (a%5) HAVING sum(b) FILTER (WHERE b<20) >34
|
||||
ORDER BY 2
|
||||
}
|
||||
|
||||
execsql_test 1.12 {
|
||||
SELECT (a%5),
|
||||
sum(b) FILTER (WHERE b<20) AS bbb,
|
||||
count(distinct b) FILTER (WHERE b<20 OR a=13) AS ccc
|
||||
FROM t1 GROUP BY (a%5)
|
||||
ORDER BY 2
|
||||
}
|
||||
|
||||
execsql_test 1.13 {
|
||||
SELECT
|
||||
string_agg(CAST(b AS TEXT), '_') FILTER (WHERE b%2!=0),
|
||||
string_agg(CAST(b AS TEXT), '_') FILTER (WHERE b%2!=1),
|
||||
count(*) FILTER (WHERE b%2!=0),
|
||||
count(*) FILTER (WHERE b%2!=1)
|
||||
FROM t1;
|
||||
}
|
||||
|
||||
execsql_float_test 1.14 {
|
||||
SELECT
|
||||
avg(b) FILTER (WHERE b>a),
|
||||
avg(b) FILTER (WHERE b<a)
|
||||
FROM t1 GROUP BY (a%2) ORDER BY 1,2;
|
||||
}
|
||||
|
||||
execsql_test 1.15 {
|
||||
SELECT
|
||||
a/5,
|
||||
sum(b) FILTER (WHERE a%5=0),
|
||||
sum(b) FILTER (WHERE a%5=1),
|
||||
sum(b) FILTER (WHERE a%5=2),
|
||||
sum(b) FILTER (WHERE a%5=3),
|
||||
sum(b) FILTER (WHERE a%5=4)
|
||||
FROM t1 GROUP BY (a/5) ORDER BY 1;
|
||||
}
|
||||
|
||||
finish_test
|
||||
|
||||
|
||||
|
@ -79,4 +79,78 @@ do_execsql_test 1.7 {
|
||||
} {3 3 58 58 3 3 71 39 4 4 38 61 7 7 85 85 11 5 54 45 16 16 81 81
|
||||
18 3 66 61 21 3 88 68 23 11 79 79 24 24 68 68}
|
||||
|
||||
do_execsql_test 1.8 {
|
||||
SELECT sum(a+b) FILTER (WHERE a=NULL) FROM t1
|
||||
} {{}}
|
||||
|
||||
do_execsql_test 1.9 {
|
||||
SELECT (a%5) FROM t1 GROUP BY (a%5)
|
||||
HAVING sum(b) FILTER (WHERE b<20) > 34
|
||||
ORDER BY 1
|
||||
} {3 4}
|
||||
|
||||
do_execsql_test 1.10 {
|
||||
SELECT (a%5), sum(b) FILTER (WHERE b<20) AS bbb
|
||||
FROM t1
|
||||
GROUP BY (a%5) HAVING sum(b) FILTER (WHERE b<20) >34
|
||||
ORDER BY 1
|
||||
} {3 49 4 46}
|
||||
|
||||
do_execsql_test 1.11 {
|
||||
SELECT (a%5), sum(b) FILTER (WHERE b<20) AS bbb
|
||||
FROM t1
|
||||
GROUP BY (a%5) HAVING sum(b) FILTER (WHERE b<20) >34
|
||||
ORDER BY 2
|
||||
} {4 46 3 49}
|
||||
|
||||
do_execsql_test 1.12 {
|
||||
SELECT (a%5),
|
||||
sum(b) FILTER (WHERE b<20) AS bbb,
|
||||
count(distinct b) FILTER (WHERE b<20 OR a=13) AS ccc
|
||||
FROM t1 GROUP BY (a%5)
|
||||
ORDER BY 2
|
||||
} {2 25 3 0 34 2 1 34 4 4 46 4 3 49 5}
|
||||
|
||||
do_execsql_test 1.13 {
|
||||
SELECT
|
||||
group_concat(CAST(b AS TEXT), '_') FILTER (WHERE b%2!=0),
|
||||
group_concat(CAST(b AS TEXT), '_') FILTER (WHERE b%2!=1),
|
||||
count(*) FILTER (WHERE b%2!=0),
|
||||
count(*) FILTER (WHERE b%2!=1)
|
||||
FROM t1;
|
||||
} {7_3_5_23_27_3_17_33_25_47_13_45_31_11_37_21_3_7_29_3_3_23_5_11_25_15_23 30_26_26_36_36_22_14_16_50_38_36_12_4_46_48_24_46_18_18 27 19}
|
||||
|
||||
|
||||
do_test 1.14 {
|
||||
set myres {}
|
||||
foreach r [db eval {SELECT
|
||||
avg(b) FILTER (WHERE b>a),
|
||||
avg(b) FILTER (WHERE b<a)
|
||||
FROM t1 GROUP BY (a%2) ORDER BY 1,2;}] {
|
||||
lappend myres [format %.4f [set r]]
|
||||
}
|
||||
set res2 {30.8333 13.7273 31.4167 13.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 {} {}
|
||||
} {}
|
||||
|
||||
do_execsql_test 1.15 {
|
||||
SELECT
|
||||
a/5,
|
||||
sum(b) FILTER (WHERE a%5=0),
|
||||
sum(b) FILTER (WHERE a%5=1),
|
||||
sum(b) FILTER (WHERE a%5=2),
|
||||
sum(b) FILTER (WHERE a%5=3),
|
||||
sum(b) FILTER (WHERE a%5=4)
|
||||
FROM t1 GROUP BY (a/5) ORDER BY 1;
|
||||
} {0 {} 7 3 5 30 1 26 23 27 3 17 2 26 33 25 {} 47 3 36 13 45 31 11
|
||||
4 36 37 21 22 14 5 16 3 7 29 50 6 38 3 36 12 4 7 46 3 48 23 {}
|
||||
8 24 5 46 11 {} 9 18 25 15 18 23}
|
||||
|
||||
finish_test
|
||||
|
Loading…
x
Reference in New Issue
Block a user