aboutsummaryrefslogtreecommitdiff
path: root/src/window.c
diff options
context:
space:
mode:
authordan <dan@noemail.net>2019-07-13 16:39:38 +0000
committerdan <dan@noemail.net>2019-07-13 16:39:38 +0000
commitdf9d32441a3d2abf62ecfec60f2605dc1630b76b (patch)
tree8f698360de0417d86e248a0c686b3e2aa7d87cf7 /src/window.c
parent8616cff6c8541e2837ccb7a2bc5792de5aba962f (diff)
parent4f9adee289fcc8de83054332212c90f389609d4a (diff)
downloadsqlite-df9d32441a3d2abf62ecfec60f2605dc1630b76b.tar.gz
sqlite-df9d32441a3d2abf62ecfec60f2605dc1630b76b.zip
Add support for attaching a FILTER clause to an aggregate function.
FossilOrigin-Name: ee293e5aeac0b05a8b809095610fd8b4fdaf8e68cd368de90ec0d45e3582ffe5
Diffstat (limited to 'src/window.c')
-rw-r--r--src/window.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/src/window.c b/src/window.c
index dcd7107a4..ed39107b9 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1196,17 +1196,14 @@ void sqlite3WindowChain(Parse *pParse, Window *pWin, Window *pList){
void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){
if( p ){
assert( p->op==TK_FUNCTION );
- /* This routine is only called for the parser. If pWin was not
- ** allocated due to an OOM, then the parser would fail before ever
- ** invoking this routine */
- if( ALWAYS(pWin) ){
- p->y.pWin = pWin;
- ExprSetProperty(p, EP_WinFunc);
- pWin->pOwner = p;
- if( p->flags & EP_Distinct ){
- sqlite3ErrorMsg(pParse,
- "DISTINCT is not supported for window functions");
- }
+ assert( pWin );
+ p->y.pWin = pWin;
+ ExprSetProperty(p, EP_WinFunc);
+ pWin->pOwner = p;
+ if( (p->flags & EP_Distinct) && pWin->eFrmType!=TK_FILTER ){
+ sqlite3ErrorMsg(pParse,
+ "DISTINCT is not supported for window functions"
+ );
}
}else{
sqlite3WindowDelete(pParse->db, pWin);
@@ -1217,7 +1214,7 @@ void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){
** Return 0 if the two window objects are identical, or non-zero otherwise.
** Identical window objects can be processed in a single scan.
*/
-int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2){
+int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2, int bFilter){
if( p1->eFrmType!=p2->eFrmType ) return 1;
if( p1->eStart!=p2->eStart ) return 1;
if( p1->eEnd!=p2->eEnd ) return 1;
@@ -1226,6 +1223,9 @@ int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2){
if( sqlite3ExprCompare(pParse, p1->pEnd, p2->pEnd, -1) ) return 1;
if( sqlite3ExprListCompare(p1->pPartition, p2->pPartition, -1) ) return 1;
if( sqlite3ExprListCompare(p1->pOrderBy, p2->pOrderBy, -1) ) return 1;
+ if( bFilter ){
+ if( sqlite3ExprCompare(pParse, p1->pFilter, p2->pFilter, -1) ) return 1;
+ }
return 0;
}