diff options
author | dan <dan@noemail.net> | 2018-06-18 20:34:43 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2018-06-18 20:34:43 +0000 |
commit | c95f38d45636435b6cdbe4eb72fc5342ee1deceb (patch) | |
tree | caea2e6b16becb7da585b62c1149083844f37dce /src/window.c | |
parent | f87e10c75ebb107c98ebf441d0cc753ec2442a54 (diff) | |
download | sqlite-c95f38d45636435b6cdbe4eb72fc5342ee1deceb.tar.gz sqlite-c95f38d45636435b6cdbe4eb72fc5342ee1deceb.zip |
Fix problems with using window functions in CREATE VIEW statements.
FossilOrigin-Name: 943bccd2a6bd4cf3e0534c1fa46885bfa2ba7b780ddcdff9f1ea4cbb3f04e786
Diffstat (limited to 'src/window.c')
-rw-r--r-- | src/window.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/window.c b/src/window.c index a61821847..9d5cadcdd 100644 --- a/src/window.c +++ b/src/window.c @@ -503,7 +503,7 @@ void sqlite3WindowUpdate( Window *pWin, /* Window frame to update */ FuncDef *pFunc /* Window function definition */ ){ - if( pWin->zName ){ + if( pWin->zName && pWin->eType==0 ){ Window *p; for(p=pList; p; p=p->pNextWin){ if( sqlite3StrICmp(p->zName, pWin->zName)==0 ) break; @@ -518,6 +518,7 @@ void sqlite3WindowUpdate( pWin->pEnd = sqlite3ExprDup(pParse->db, p->pEnd, 0); pWin->eStart = p->eStart; pWin->eEnd = p->eEnd; + pWin->eType = p->eType; } if( pFunc->funcFlags & SQLITE_FUNC_WINDOW ){ sqlite3 *db = pParse->db; @@ -800,6 +801,7 @@ Window *sqlite3WindowAlloc( Window *pWin = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); if( pWin ){ + assert( eType ); pWin->eType = eType; pWin->eStart = eStart; pWin->eEnd = eEnd; @@ -1918,6 +1920,7 @@ Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ if( p ){ pNew = sqlite3DbMallocZero(db, sizeof(Window)); if( pNew ){ + pNew->zName = sqlite3DbStrDup(db, p->zName); pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0); pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0); pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0); @@ -1933,6 +1936,24 @@ Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ } /* +** Return a copy of the linked list of Window objects passed as the +** second argument. +*/ +Window *sqlite3WindowListDup(sqlite3 *db, Window *p){ + Window *pWin; + Window *pRet = 0; + Window **pp = &pRet; + + for(pWin=p; pWin; pWin=pWin->pNextWin){ + *pp = sqlite3WindowDup(db, 0, pWin); + if( *pp==0 ) break; + pp = &((*pp)->pNextWin); + } + + return pRet; +} + +/* ** sqlite3WhereBegin() has already been called for the SELECT statement ** passed as the second argument when this function is invoked. It generates ** code to populate the Window.regResult register for each window function and |