1 /* 2 ** 2018 May 08 3 ** 4 ** The author disclaims copyright to this source code. In place of 5 ** a legal notice, here is a blessing: 6 ** 7 ** May you do good and not evil. 8 ** May you find forgiveness for yourself and forgive others. 9 ** May you share freely, never taking more than you give. 10 ** 11 ************************************************************************* 12 */ 13 #include "sqliteInt.h" 14 15 #ifndef SQLITE_OMIT_WINDOWFUNC 16 17 /* 18 ** SELECT REWRITING 19 ** 20 ** Any SELECT statement that contains one or more window functions in 21 ** either the select list or ORDER BY clause (the only two places window 22 ** functions may be used) is transformed by function sqlite3WindowRewrite() 23 ** in order to support window function processing. For example, with the 24 ** schema: 25 ** 26 ** CREATE TABLE t1(a, b, c, d, e, f, g); 27 ** 28 ** the statement: 29 ** 30 ** SELECT a+1, max(b) OVER (PARTITION BY c ORDER BY d) FROM t1 ORDER BY e; 31 ** 32 ** is transformed to: 33 ** 34 ** SELECT a+1, max(b) OVER (PARTITION BY c ORDER BY d) FROM ( 35 ** SELECT a, e, c, d, b FROM t1 ORDER BY c, d 36 ** ) ORDER BY e; 37 ** 38 ** The flattening optimization is disabled when processing this transformed 39 ** SELECT statement. This allows the implementation of the window function 40 ** (in this case max()) to process rows sorted in order of (c, d), which 41 ** makes things easier for obvious reasons. More generally: 42 ** 43 ** * FROM, WHERE, GROUP BY and HAVING clauses are all moved to 44 ** the sub-query. 45 ** 46 ** * ORDER BY, LIMIT and OFFSET remain part of the parent query. 47 ** 48 ** * Terminals from each of the expression trees that make up the 49 ** select-list and ORDER BY expressions in the parent query are 50 ** selected by the sub-query. For the purposes of the transformation, 51 ** terminals are column references and aggregate functions. 52 ** 53 ** If there is more than one window function in the SELECT that uses 54 ** the same window declaration (the OVER bit), then a single scan may 55 ** be used to process more than one window function. For example: 56 ** 57 ** SELECT max(b) OVER (PARTITION BY c ORDER BY d), 58 ** min(e) OVER (PARTITION BY c ORDER BY d) 59 ** FROM t1; 60 ** 61 ** is transformed in the same way as the example above. However: 62 ** 63 ** SELECT max(b) OVER (PARTITION BY c ORDER BY d), 64 ** min(e) OVER (PARTITION BY a ORDER BY b) 65 ** FROM t1; 66 ** 67 ** Must be transformed to: 68 ** 69 ** SELECT max(b) OVER (PARTITION BY c ORDER BY d) FROM ( 70 ** SELECT e, min(e) OVER (PARTITION BY a ORDER BY b), c, d, b FROM 71 ** SELECT a, e, c, d, b FROM t1 ORDER BY a, b 72 ** ) ORDER BY c, d 73 ** ) ORDER BY e; 74 ** 75 ** so that both min() and max() may process rows in the order defined by 76 ** their respective window declarations. 77 ** 78 ** INTERFACE WITH SELECT.C 79 ** 80 ** When processing the rewritten SELECT statement, code in select.c calls 81 ** sqlite3WhereBegin() to begin iterating through the results of the 82 ** sub-query, which is always implemented as a co-routine. It then calls 83 ** sqlite3WindowCodeStep() to process rows and finish the scan by calling 84 ** sqlite3WhereEnd(). 85 ** 86 ** sqlite3WindowCodeStep() generates VM code so that, for each row returned 87 ** by the sub-query a sub-routine (OP_Gosub) coded by select.c is invoked. 88 ** When the sub-routine is invoked: 89 ** 90 ** * The results of all window-functions for the row are stored 91 ** in the associated Window.regResult registers. 92 ** 93 ** * The required terminal values are stored in the current row of 94 ** temp table Window.iEphCsr. 95 ** 96 ** In some cases, depending on the window frame and the specific window 97 ** functions invoked, sqlite3WindowCodeStep() caches each entire partition 98 ** in a temp table before returning any rows. In other cases it does not. 99 ** This detail is encapsulated within this file, the code generated by 100 ** select.c is the same in either case. 101 ** 102 ** BUILT-IN WINDOW FUNCTIONS 103 ** 104 ** This implementation features the following built-in window functions: 105 ** 106 ** row_number() 107 ** rank() 108 ** dense_rank() 109 ** percent_rank() 110 ** cume_dist() 111 ** ntile(N) 112 ** lead(expr [, offset [, default]]) 113 ** lag(expr [, offset [, default]]) 114 ** first_value(expr) 115 ** last_value(expr) 116 ** nth_value(expr, N) 117 ** 118 ** These are the same built-in window functions supported by Postgres. 119 ** Although the behaviour of aggregate window functions (functions that 120 ** can be used as either aggregates or window funtions) allows them to 121 ** be implemented using an API, built-in window functions are much more 122 ** esoteric. Additionally, some window functions (e.g. nth_value()) 123 ** may only be implemented by caching the entire partition in memory. 124 ** As such, some built-in window functions use the same API as aggregate 125 ** window functions and some are implemented directly using VDBE 126 ** instructions. Additionally, for those functions that use the API, the 127 ** window frame is sometimes modified before the SELECT statement is 128 ** rewritten. For example, regardless of the specified window frame, the 129 ** row_number() function always uses: 130 ** 131 ** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 132 ** 133 ** See sqlite3WindowUpdate() for details. 134 ** 135 ** As well as some of the built-in window functions, aggregate window 136 ** functions min() and max() are implemented using VDBE instructions if 137 ** the start of the window frame is declared as anything other than 138 ** UNBOUNDED PRECEDING. 139 */ 140 141 /* 142 ** Implementation of built-in window function row_number(). Assumes that the 143 ** window frame has been coerced to: 144 ** 145 ** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 146 */ 147 static void row_numberStepFunc( 148 sqlite3_context *pCtx, 149 int nArg, 150 sqlite3_value **apArg 151 ){ 152 i64 *p = (i64*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 153 if( p ) (*p)++; 154 } 155 static void row_numberInvFunc( 156 sqlite3_context *pCtx, 157 int nArg, 158 sqlite3_value **apArg 159 ){ 160 } 161 static void row_numberValueFunc(sqlite3_context *pCtx){ 162 i64 *p = (i64*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 163 sqlite3_result_int64(pCtx, (p ? *p : 0)); 164 } 165 166 /* 167 ** Context object type used by rank(), dense_rank(), percent_rank() and 168 ** cume_dist(). 169 */ 170 struct CallCount { 171 i64 nValue; 172 i64 nStep; 173 i64 nTotal; 174 }; 175 176 /* 177 ** Implementation of built-in window function dense_rank(). Assumes that 178 ** the window frame has been set to: 179 ** 180 ** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 181 */ 182 static void dense_rankStepFunc( 183 sqlite3_context *pCtx, 184 int nArg, 185 sqlite3_value **apArg 186 ){ 187 struct CallCount *p; 188 p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 189 if( p ) p->nStep = 1; 190 } 191 static void dense_rankInvFunc( 192 sqlite3_context *pCtx, 193 int nArg, 194 sqlite3_value **apArg 195 ){ 196 } 197 static void dense_rankValueFunc(sqlite3_context *pCtx){ 198 struct CallCount *p; 199 p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 200 if( p ){ 201 if( p->nStep ){ 202 p->nValue++; 203 p->nStep = 0; 204 } 205 sqlite3_result_int64(pCtx, p->nValue); 206 } 207 } 208 209 /* 210 ** Implementation of built-in window function rank(). Assumes that 211 ** the window frame has been set to: 212 ** 213 ** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 214 */ 215 static void rankStepFunc( 216 sqlite3_context *pCtx, 217 int nArg, 218 sqlite3_value **apArg 219 ){ 220 struct CallCount *p; 221 p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 222 if( p ){ 223 p->nStep++; 224 if( p->nValue==0 ){ 225 p->nValue = p->nStep; 226 } 227 } 228 } 229 static void rankInvFunc( 230 sqlite3_context *pCtx, 231 int nArg, 232 sqlite3_value **apArg 233 ){ 234 } 235 static void rankValueFunc(sqlite3_context *pCtx){ 236 struct CallCount *p; 237 p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 238 if( p ){ 239 sqlite3_result_int64(pCtx, p->nValue); 240 p->nValue = 0; 241 } 242 } 243 244 /* 245 ** Implementation of built-in window function percent_rank(). Assumes that 246 ** the window frame has been set to: 247 ** 248 ** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 249 */ 250 static void percent_rankStepFunc( 251 sqlite3_context *pCtx, 252 int nArg, 253 sqlite3_value **apArg 254 ){ 255 struct CallCount *p; 256 assert( nArg==1 ); 257 258 p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 259 if( p ){ 260 if( p->nTotal==0 ){ 261 p->nTotal = sqlite3_value_int64(apArg[0]); 262 } 263 p->nStep++; 264 if( p->nValue==0 ){ 265 p->nValue = p->nStep; 266 } 267 } 268 } 269 static void percent_rankInvFunc( 270 sqlite3_context *pCtx, 271 int nArg, 272 sqlite3_value **apArg 273 ){ 274 } 275 static void percent_rankValueFunc(sqlite3_context *pCtx){ 276 struct CallCount *p; 277 p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 278 if( p ){ 279 if( p->nTotal>1 ){ 280 double r = (double)(p->nValue-1) / (double)(p->nTotal-1); 281 sqlite3_result_double(pCtx, r); 282 }else{ 283 sqlite3_result_double(pCtx, 0.0); 284 } 285 p->nValue = 0; 286 } 287 } 288 289 /* 290 ** Implementation of built-in window function cume_dist(). Assumes that 291 ** the window frame has been set to: 292 ** 293 ** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 294 */ 295 static void cume_distStepFunc( 296 sqlite3_context *pCtx, 297 int nArg, 298 sqlite3_value **apArg 299 ){ 300 struct CallCount *p; 301 assert( nArg==1 ); 302 303 p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 304 if( p ){ 305 if( p->nTotal==0 ){ 306 p->nTotal = sqlite3_value_int64(apArg[0]); 307 } 308 p->nStep++; 309 } 310 } 311 static void cume_distInvFunc( 312 sqlite3_context *pCtx, 313 int nArg, 314 sqlite3_value **apArg 315 ){ 316 } 317 static void cume_distValueFunc(sqlite3_context *pCtx){ 318 struct CallCount *p; 319 p = (struct CallCount*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 320 if( p && p->nTotal ){ 321 double r = (double)(p->nStep) / (double)(p->nTotal); 322 sqlite3_result_double(pCtx, r); 323 } 324 } 325 326 /* 327 ** Context object for ntile() window function. 328 */ 329 struct NtileCtx { 330 i64 nTotal; /* Total rows in partition */ 331 i64 nParam; /* Parameter passed to ntile(N) */ 332 i64 iRow; /* Current row */ 333 }; 334 335 /* 336 ** Implementation of ntile(). This assumes that the window frame has 337 ** been coerced to: 338 ** 339 ** ROWS UNBOUNDED PRECEDING AND CURRENT ROW 340 */ 341 static void ntileStepFunc( 342 sqlite3_context *pCtx, 343 int nArg, 344 sqlite3_value **apArg 345 ){ 346 struct NtileCtx *p; 347 assert( nArg==2 ); 348 p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 349 if( p ){ 350 if( p->nTotal==0 ){ 351 p->nParam = sqlite3_value_int64(apArg[0]); 352 p->nTotal = sqlite3_value_int64(apArg[1]); 353 if( p->nParam<=0 ){ 354 sqlite3_result_error( 355 pCtx, "argument of ntile must be a positive integer", -1 356 ); 357 } 358 } 359 p->iRow++; 360 } 361 } 362 static void ntileInvFunc( 363 sqlite3_context *pCtx, 364 int nArg, 365 sqlite3_value **apArg 366 ){ 367 } 368 static void ntileValueFunc(sqlite3_context *pCtx){ 369 struct NtileCtx *p; 370 p = (struct NtileCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 371 if( p && p->nParam>0 ){ 372 int nSize = (p->nTotal / p->nParam); 373 if( nSize==0 ){ 374 sqlite3_result_int64(pCtx, p->iRow); 375 }else{ 376 i64 nLarge = p->nTotal - p->nParam*nSize; 377 i64 iSmall = nLarge*(nSize+1); 378 i64 iRow = p->iRow-1; 379 380 assert( (nLarge*(nSize+1) + (p->nParam-nLarge)*nSize)==p->nTotal ); 381 382 if( iRow<iSmall ){ 383 sqlite3_result_int64(pCtx, 1 + iRow/(nSize+1)); 384 }else{ 385 sqlite3_result_int64(pCtx, 1 + nLarge + (iRow-iSmall)/nSize); 386 } 387 } 388 } 389 } 390 391 /* 392 ** Context object for last_value() window function. 393 */ 394 struct LastValueCtx { 395 sqlite3_value *pVal; 396 int nVal; 397 }; 398 399 /* 400 ** Implementation of last_value(). 401 */ 402 static void last_valueStepFunc( 403 sqlite3_context *pCtx, 404 int nArg, 405 sqlite3_value **apArg 406 ){ 407 struct LastValueCtx *p; 408 p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 409 if( p ){ 410 sqlite3_value_free(p->pVal); 411 p->pVal = sqlite3_value_dup(apArg[0]); 412 if( p->pVal==0 ){ 413 sqlite3_result_error_nomem(pCtx); 414 }else{ 415 p->nVal++; 416 } 417 } 418 } 419 static void last_valueInvFunc( 420 sqlite3_context *pCtx, 421 int nArg, 422 sqlite3_value **apArg 423 ){ 424 struct LastValueCtx *p; 425 p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 426 if( ALWAYS(p) ){ 427 p->nVal--; 428 if( p->nVal==0 ){ 429 sqlite3_value_free(p->pVal); 430 p->pVal = 0; 431 } 432 } 433 } 434 static void last_valueValueFunc(sqlite3_context *pCtx){ 435 struct LastValueCtx *p; 436 p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 437 if( p && p->pVal ){ 438 sqlite3_result_value(pCtx, p->pVal); 439 } 440 } 441 static void last_valueFinalizeFunc(sqlite3_context *pCtx){ 442 struct LastValueCtx *p; 443 p = (struct LastValueCtx*)sqlite3_aggregate_context(pCtx, sizeof(*p)); 444 if( p && p->pVal ){ 445 sqlite3_result_value(pCtx, p->pVal); 446 sqlite3_value_free(p->pVal); 447 p->pVal = 0; 448 } 449 } 450 451 /* 452 ** No-op implementations of nth_value(), first_value(), lead() and lag(). 453 ** These are all implemented inline using VDBE instructions. 454 */ 455 static void nth_valueStepFunc(sqlite3_context *pCtx, int n, sqlite3_value **a){} 456 static void nth_valueInvFunc(sqlite3_context *pCtx, int n, sqlite3_value **ap){} 457 static void nth_valueValueFunc(sqlite3_context *pCtx){} 458 static void first_valueStepFunc(sqlite3_context *p, int n, sqlite3_value **ap){} 459 static void first_valueInvFunc(sqlite3_context *p, int n, sqlite3_value **ap){} 460 static void first_valueValueFunc(sqlite3_context *pCtx){} 461 static void leadStepFunc(sqlite3_context *pCtx, int n, sqlite3_value **ap){} 462 static void leadInvFunc(sqlite3_context *pCtx, int n, sqlite3_value **ap){} 463 static void leadValueFunc(sqlite3_context *pCtx){} 464 static void lagStepFunc(sqlite3_context *pCtx, int n, sqlite3_value **ap){} 465 static void lagInvFunc(sqlite3_context *pCtx, int n, sqlite3_value **ap){} 466 static void lagValueFunc(sqlite3_context *pCtx){} 467 468 #define WINDOWFUNC(name,nArg,extra) { \ 469 nArg, (SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \ 470 name ## StepFunc, name ## ValueFunc, name ## ValueFunc, \ 471 name ## InvFunc, #name \ 472 } 473 474 #define WINDOWFUNCF(name,nArg,extra) { \ 475 nArg, (SQLITE_UTF8|SQLITE_FUNC_WINDOW|extra), 0, 0, \ 476 name ## StepFunc, name ## FinalizeFunc, name ## ValueFunc, \ 477 name ## InvFunc, #name \ 478 } 479 480 /* 481 ** Register those built-in window functions that are not also aggregates. 482 */ 483 void sqlite3WindowFunctions(void){ 484 static FuncDef aWindowFuncs[] = { 485 WINDOWFUNC(row_number, 0, 0), 486 WINDOWFUNC(dense_rank, 0, 0), 487 WINDOWFUNC(rank, 0, 0), 488 WINDOWFUNC(percent_rank, 0, SQLITE_FUNC_WINDOW_SIZE), 489 WINDOWFUNC(cume_dist, 0, SQLITE_FUNC_WINDOW_SIZE), 490 WINDOWFUNC(ntile, 1, SQLITE_FUNC_WINDOW_SIZE), 491 WINDOWFUNCF(last_value, 1, 0), 492 WINDOWFUNC(nth_value, 2, 0), 493 WINDOWFUNC(first_value, 1, 0), 494 WINDOWFUNC(lead, 1, 0), WINDOWFUNC(lead, 2, 0), WINDOWFUNC(lead, 3, 0), 495 WINDOWFUNC(lag, 1, 0), WINDOWFUNC(lag, 2, 0), WINDOWFUNC(lag, 3, 0), 496 }; 497 sqlite3InsertBuiltinFuncs(aWindowFuncs, ArraySize(aWindowFuncs)); 498 } 499 500 /* 501 ** This function is called immediately after resolving the function name 502 ** for a window function within a SELECT statement. Argument pList is a 503 ** linked list of WINDOW definitions for the current SELECT statement. 504 ** Argument pFunc is the function definition just resolved and pWin 505 ** is the Window object representing the associated OVER clause. This 506 ** function updates the contents of pWin as follows: 507 ** 508 ** * If the OVER clause refered to a named window (as in "max(x) OVER win"), 509 ** search list pList for a matching WINDOW definition, and update pWin 510 ** accordingly. If no such WINDOW clause can be found, leave an error 511 ** in pParse. 512 ** 513 ** * If the function is a built-in window function that requires the 514 ** window to be coerced (see "BUILT-IN WINDOW FUNCTIONS" at the top 515 ** of this file), pWin is updated here. 516 */ 517 void sqlite3WindowUpdate( 518 Parse *pParse, 519 Window *pList, /* List of named windows for this SELECT */ 520 Window *pWin, /* Window frame to update */ 521 FuncDef *pFunc /* Window function definition */ 522 ){ 523 if( pWin->zName && pWin->eType==0 ){ 524 Window *p; 525 for(p=pList; p; p=p->pNextWin){ 526 if( sqlite3StrICmp(p->zName, pWin->zName)==0 ) break; 527 } 528 if( p==0 ){ 529 sqlite3ErrorMsg(pParse, "no such window: %s", pWin->zName); 530 return; 531 } 532 pWin->pPartition = sqlite3ExprListDup(pParse->db, p->pPartition, 0); 533 pWin->pOrderBy = sqlite3ExprListDup(pParse->db, p->pOrderBy, 0); 534 pWin->pStart = sqlite3ExprDup(pParse->db, p->pStart, 0); 535 pWin->pEnd = sqlite3ExprDup(pParse->db, p->pEnd, 0); 536 pWin->eStart = p->eStart; 537 pWin->eEnd = p->eEnd; 538 pWin->eType = p->eType; 539 } 540 if( pFunc->funcFlags & SQLITE_FUNC_WINDOW ){ 541 sqlite3 *db = pParse->db; 542 if( pWin->pFilter ){ 543 sqlite3ErrorMsg(pParse, 544 "FILTER clause may only be used with aggregate window functions" 545 ); 546 }else 547 if( pFunc->xSFunc==row_numberStepFunc || pFunc->xSFunc==ntileStepFunc ){ 548 sqlite3ExprDelete(db, pWin->pStart); 549 sqlite3ExprDelete(db, pWin->pEnd); 550 pWin->pStart = pWin->pEnd = 0; 551 pWin->eType = TK_ROWS; 552 pWin->eStart = TK_UNBOUNDED; 553 pWin->eEnd = TK_CURRENT; 554 }else 555 556 if( pFunc->xSFunc==dense_rankStepFunc || pFunc->xSFunc==rankStepFunc 557 || pFunc->xSFunc==percent_rankStepFunc || pFunc->xSFunc==cume_distStepFunc 558 ){ 559 sqlite3ExprDelete(db, pWin->pStart); 560 sqlite3ExprDelete(db, pWin->pEnd); 561 pWin->pStart = pWin->pEnd = 0; 562 pWin->eType = TK_RANGE; 563 pWin->eStart = TK_UNBOUNDED; 564 pWin->eEnd = TK_CURRENT; 565 } 566 } 567 pWin->pFunc = pFunc; 568 } 569 570 /* 571 ** Context object passed through sqlite3WalkExprList() to 572 ** selectWindowRewriteExprCb() by selectWindowRewriteEList(). 573 */ 574 typedef struct WindowRewrite WindowRewrite; 575 struct WindowRewrite { 576 Window *pWin; 577 ExprList *pSub; 578 }; 579 580 /* 581 ** Callback function used by selectWindowRewriteEList(). If necessary, 582 ** this function appends to the output expression-list and updates 583 ** expression (*ppExpr) in place. 584 */ 585 static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ 586 struct WindowRewrite *p = pWalker->u.pRewrite; 587 Parse *pParse = pWalker->pParse; 588 589 switch( pExpr->op ){ 590 591 case TK_FUNCTION: 592 if( pExpr->pWin==0 ){ 593 break; 594 }else{ 595 Window *pWin; 596 for(pWin=p->pWin; pWin; pWin=pWin->pNextWin){ 597 if( pExpr->pWin==pWin ){ 598 assert( pWin->pOwner==pExpr ); 599 return WRC_Prune; 600 } 601 } 602 } 603 /* Fall through. */ 604 605 case TK_AGG_FUNCTION: 606 case TK_COLUMN: { 607 Expr *pDup = sqlite3ExprDup(pParse->db, pExpr, 0); 608 p->pSub = sqlite3ExprListAppend(pParse, p->pSub, pDup); 609 if( p->pSub ){ 610 assert( ExprHasProperty(pExpr, EP_Static)==0 ); 611 ExprSetProperty(pExpr, EP_Static); 612 sqlite3ExprDelete(pParse->db, pExpr); 613 ExprClearProperty(pExpr, EP_Static); 614 memset(pExpr, 0, sizeof(Expr)); 615 616 pExpr->op = TK_COLUMN; 617 pExpr->iColumn = p->pSub->nExpr-1; 618 pExpr->iTable = p->pWin->iEphCsr; 619 } 620 621 break; 622 } 623 624 default: /* no-op */ 625 break; 626 } 627 628 return WRC_Continue; 629 } 630 static int selectWindowRewriteSelectCb(Walker *pWalker, Select *pSelect){ 631 return WRC_Prune; 632 } 633 634 635 /* 636 ** Iterate through each expression in expression-list pEList. For each: 637 ** 638 ** * TK_COLUMN, 639 ** * aggregate function, or 640 ** * window function with a Window object that is not a member of the 641 ** linked list passed as the second argument (pWin) 642 ** 643 ** Append the node to output expression-list (*ppSub). And replace it 644 ** with a TK_COLUMN that reads the (N-1)th element of table 645 ** pWin->iEphCsr, where N is the number of elements in (*ppSub) after 646 ** appending the new one. 647 */ 648 static void selectWindowRewriteEList( 649 Parse *pParse, 650 Window *pWin, 651 ExprList *pEList, /* Rewrite expressions in this list */ 652 ExprList **ppSub /* IN/OUT: Sub-select expression-list */ 653 ){ 654 Walker sWalker; 655 WindowRewrite sRewrite; 656 657 memset(&sWalker, 0, sizeof(Walker)); 658 memset(&sRewrite, 0, sizeof(WindowRewrite)); 659 660 sRewrite.pSub = *ppSub; 661 sRewrite.pWin = pWin; 662 663 sWalker.pParse = pParse; 664 sWalker.xExprCallback = selectWindowRewriteExprCb; 665 sWalker.xSelectCallback = selectWindowRewriteSelectCb; 666 sWalker.u.pRewrite = &sRewrite; 667 668 (void)sqlite3WalkExprList(&sWalker, pEList); 669 670 *ppSub = sRewrite.pSub; 671 } 672 673 /* 674 ** Append a copy of each expression in expression-list pAppend to 675 ** expression list pList. Return a pointer to the result list. 676 */ 677 static ExprList *exprListAppendList( 678 Parse *pParse, /* Parsing context */ 679 ExprList *pList, /* List to which to append. Might be NULL */ 680 ExprList *pAppend /* List of values to append. Might be NULL */ 681 ){ 682 if( pAppend ){ 683 int i; 684 int nInit = pList ? pList->nExpr : 0; 685 for(i=0; i<pAppend->nExpr; i++){ 686 Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0); 687 pList = sqlite3ExprListAppend(pParse, pList, pDup); 688 if( pList ) pList->a[nInit+i].sortOrder = pAppend->a[i].sortOrder; 689 } 690 } 691 return pList; 692 } 693 694 /* 695 ** If the SELECT statement passed as the second argument does not invoke 696 ** any SQL window functions, this function is a no-op. Otherwise, it 697 ** rewrites the SELECT statement so that window function xStep functions 698 ** are invoked in the correct order as described under "SELECT REWRITING" 699 ** at the top of this file. 700 */ 701 int sqlite3WindowRewrite(Parse *pParse, Select *p){ 702 int rc = SQLITE_OK; 703 if( p->pWin ){ 704 Vdbe *v = sqlite3GetVdbe(pParse); 705 sqlite3 *db = pParse->db; 706 Select *pSub = 0; /* The subquery */ 707 SrcList *pSrc = p->pSrc; 708 Expr *pWhere = p->pWhere; 709 ExprList *pGroupBy = p->pGroupBy; 710 Expr *pHaving = p->pHaving; 711 ExprList *pSort = 0; 712 713 ExprList *pSublist = 0; /* Expression list for sub-query */ 714 Window *pMWin = p->pWin; /* Master window object */ 715 Window *pWin; /* Window object iterator */ 716 717 p->pSrc = 0; 718 p->pWhere = 0; 719 p->pGroupBy = 0; 720 p->pHaving = 0; 721 722 /* Create the ORDER BY clause for the sub-select. This is the concatenation 723 ** of the window PARTITION and ORDER BY clauses. Then, if this makes it 724 ** redundant, remove the ORDER BY from the parent SELECT. */ 725 pSort = sqlite3ExprListDup(db, pMWin->pPartition, 0); 726 pSort = exprListAppendList(pParse, pSort, pMWin->pOrderBy); 727 if( pSort && p->pOrderBy ){ 728 if( sqlite3ExprListCompare(pSort, p->pOrderBy, -1)==0 ){ 729 sqlite3ExprListDelete(db, p->pOrderBy); 730 p->pOrderBy = 0; 731 } 732 } 733 734 /* Assign a cursor number for the ephemeral table used to buffer rows. 735 ** The OpenEphemeral instruction is coded later, after it is known how 736 ** many columns the table will have. */ 737 pMWin->iEphCsr = pParse->nTab++; 738 739 selectWindowRewriteEList(pParse, pMWin, p->pEList, &pSublist); 740 selectWindowRewriteEList(pParse, pMWin, p->pOrderBy, &pSublist); 741 pMWin->nBufferCol = (pSublist ? pSublist->nExpr : 0); 742 743 /* Append the PARTITION BY and ORDER BY expressions to the to the 744 ** sub-select expression list. They are required to figure out where 745 ** boundaries for partitions and sets of peer rows lie. */ 746 pSublist = exprListAppendList(pParse, pSublist, pMWin->pPartition); 747 pSublist = exprListAppendList(pParse, pSublist, pMWin->pOrderBy); 748 749 /* Append the arguments passed to each window function to the 750 ** sub-select expression list. Also allocate two registers for each 751 ** window function - one for the accumulator, another for interim 752 ** results. */ 753 for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ 754 pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); 755 pSublist = exprListAppendList(pParse, pSublist, pWin->pOwner->x.pList); 756 if( pWin->pFilter ){ 757 Expr *pFilter = sqlite3ExprDup(db, pWin->pFilter, 0); 758 pSublist = sqlite3ExprListAppend(pParse, pSublist, pFilter); 759 } 760 pWin->regAccum = ++pParse->nMem; 761 pWin->regResult = ++pParse->nMem; 762 sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); 763 } 764 765 /* If there is no ORDER BY or PARTITION BY clause, and the window 766 ** function accepts zero arguments, and there are no other columns 767 ** selected (e.g. "SELECT row_number() OVER () FROM t1"), it is possible 768 ** that pSublist is still NULL here. Add a constant expression here to 769 ** keep everything legal in this case. 770 */ 771 if( pSublist==0 ){ 772 pSublist = sqlite3ExprListAppend(pParse, 0, 773 sqlite3ExprAlloc(db, TK_INTEGER, &sqlite3IntTokens[0], 0) 774 ); 775 } 776 777 pSub = sqlite3SelectNew( 778 pParse, pSublist, pSrc, pWhere, pGroupBy, pHaving, pSort, 0, 0 779 ); 780 p->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); 781 assert( p->pSrc || db->mallocFailed ); 782 if( p->pSrc ){ 783 p->pSrc->a[0].pSelect = pSub; 784 sqlite3SrcListAssignCursors(pParse, p->pSrc); 785 if( sqlite3ExpandSubquery(pParse, &p->pSrc->a[0]) ){ 786 rc = SQLITE_NOMEM; 787 }else{ 788 pSub->selFlags |= SF_Expanded; 789 p->selFlags &= ~SF_Aggregate; 790 sqlite3SelectPrep(pParse, pSub, 0); 791 } 792 793 sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, pSublist->nExpr); 794 }else{ 795 sqlite3SelectDelete(db, pSub); 796 } 797 if( db->mallocFailed ) rc = SQLITE_NOMEM; 798 } 799 800 return rc; 801 } 802 803 /* 804 ** Free the Window object passed as the second argument. 805 */ 806 void sqlite3WindowDelete(sqlite3 *db, Window *p){ 807 if( p ){ 808 sqlite3ExprDelete(db, p->pFilter); 809 sqlite3ExprListDelete(db, p->pPartition); 810 sqlite3ExprListDelete(db, p->pOrderBy); 811 sqlite3ExprDelete(db, p->pEnd); 812 sqlite3ExprDelete(db, p->pStart); 813 sqlite3DbFree(db, p->zName); 814 sqlite3DbFree(db, p); 815 } 816 } 817 818 /* 819 ** Free the linked list of Window objects starting at the second argument. 820 */ 821 void sqlite3WindowListDelete(sqlite3 *db, Window *p){ 822 while( p ){ 823 Window *pNext = p->pNextWin; 824 sqlite3WindowDelete(db, p); 825 p = pNext; 826 } 827 } 828 829 /* 830 ** The argument expression is an PRECEDING or FOLLOWING offset. The 831 ** value should be a non-negative integer. If the value is not a 832 ** constant, change it to NULL. The fact that it is then a non-negative 833 ** integer will be caught later. But it is important not to leave 834 ** variable values in the expression tree. 835 */ 836 static Expr *sqlite3WindowOffsetExpr(Parse *pParse, Expr *pExpr){ 837 if( 0==sqlite3ExprIsConstant(pExpr) ){ 838 sqlite3ExprDelete(pParse->db, pExpr); 839 pExpr = sqlite3ExprAlloc(pParse->db, TK_NULL, 0, 0); 840 } 841 return pExpr; 842 } 843 844 /* 845 ** Allocate and return a new Window object describing a Window Definition. 846 */ 847 Window *sqlite3WindowAlloc( 848 Parse *pParse, /* Parsing context */ 849 int eType, /* Frame type. TK_RANGE or TK_ROWS */ 850 int eStart, /* Start type: CURRENT, PRECEDING, FOLLOWING, UNBOUNDED */ 851 Expr *pStart, /* Start window size if TK_PRECEDING or FOLLOWING */ 852 int eEnd, /* End type: CURRENT, FOLLOWING, TK_UNBOUNDED, PRECEDING */ 853 Expr *pEnd /* End window size if TK_FOLLOWING or PRECEDING */ 854 ){ 855 Window *pWin = 0; 856 857 /* Parser assures the following: */ 858 assert( eType==TK_RANGE || eType==TK_ROWS ); 859 assert( eStart==TK_CURRENT || eStart==TK_PRECEDING 860 || eStart==TK_UNBOUNDED || eStart==TK_FOLLOWING ); 861 assert( eEnd==TK_CURRENT || eEnd==TK_FOLLOWING 862 || eEnd==TK_UNBOUNDED || eEnd==TK_PRECEDING ); 863 assert( (eStart==TK_PRECEDING || eStart==TK_FOLLOWING)==(pStart!=0) ); 864 assert( (eEnd==TK_FOLLOWING || eEnd==TK_PRECEDING)==(pEnd!=0) ); 865 866 867 /* If a frame is declared "RANGE" (not "ROWS"), then it may not use 868 ** either "<expr> PRECEDING" or "<expr> FOLLOWING". 869 */ 870 if( eType==TK_RANGE && (pStart!=0 || pEnd!=0) ){ 871 sqlite3ErrorMsg(pParse, "RANGE must use only UNBOUNDED or CURRENT ROW"); 872 goto windowAllocErr; 873 } 874 875 /* Additionally, the 876 ** starting boundary type may not occur earlier in the following list than 877 ** the ending boundary type: 878 ** 879 ** UNBOUNDED PRECEDING 880 ** <expr> PRECEDING 881 ** CURRENT ROW 882 ** <expr> FOLLOWING 883 ** UNBOUNDED FOLLOWING 884 ** 885 ** The parser ensures that "UNBOUNDED PRECEDING" cannot be used as an ending 886 ** boundary, and than "UNBOUNDED FOLLOWING" cannot be used as a starting 887 ** frame boundary. 888 */ 889 if( (eStart==TK_CURRENT && eEnd==TK_PRECEDING) 890 || (eStart==TK_FOLLOWING && (eEnd==TK_PRECEDING || eEnd==TK_CURRENT)) 891 ){ 892 sqlite3ErrorMsg(pParse, "unsupported frame delimiter for ROWS"); 893 goto windowAllocErr; 894 } 895 896 pWin = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); 897 if( pWin==0 ) goto windowAllocErr; 898 pWin->eType = eType; 899 pWin->eStart = eStart; 900 pWin->eEnd = eEnd; 901 pWin->pEnd = sqlite3WindowOffsetExpr(pParse, pEnd); 902 pWin->pStart = sqlite3WindowOffsetExpr(pParse, pStart); 903 return pWin; 904 905 windowAllocErr: 906 sqlite3ExprDelete(pParse->db, pEnd); 907 sqlite3ExprDelete(pParse->db, pStart); 908 return 0; 909 } 910 911 /* 912 ** Attach window object pWin to expression p. 913 */ 914 void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ 915 if( p ){ 916 if( pWin ){ 917 p->pWin = pWin; 918 pWin->pOwner = p; 919 if( p->flags & EP_Distinct ){ 920 sqlite3ErrorMsg(pParse, 921 "DISTINCT is not supported for window functions"); 922 } 923 } 924 }else{ 925 sqlite3WindowDelete(pParse->db, pWin); 926 } 927 } 928 929 /* 930 ** Return 0 if the two window objects are identical, or non-zero otherwise. 931 ** Identical window objects can be processed in a single scan. 932 */ 933 int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2){ 934 if( p1->eType!=p2->eType ) return 1; 935 if( p1->eStart!=p2->eStart ) return 1; 936 if( p1->eEnd!=p2->eEnd ) return 1; 937 if( sqlite3ExprCompare(pParse, p1->pStart, p2->pStart, -1) ) return 1; 938 if( sqlite3ExprCompare(pParse, p1->pEnd, p2->pEnd, -1) ) return 1; 939 if( sqlite3ExprListCompare(p1->pPartition, p2->pPartition, -1) ) return 1; 940 if( sqlite3ExprListCompare(p1->pOrderBy, p2->pOrderBy, -1) ) return 1; 941 return 0; 942 } 943 944 945 /* 946 ** This is called by code in select.c before it calls sqlite3WhereBegin() 947 ** to begin iterating through the sub-query results. It is used to allocate 948 ** and initialize registers and cursors used by sqlite3WindowCodeStep(). 949 */ 950 void sqlite3WindowCodeInit(Parse *pParse, Window *pMWin){ 951 Window *pWin; 952 Vdbe *v = sqlite3GetVdbe(pParse); 953 int nPart = (pMWin->pPartition ? pMWin->pPartition->nExpr : 0); 954 nPart += (pMWin->pOrderBy ? pMWin->pOrderBy->nExpr : 0); 955 if( nPart ){ 956 pMWin->regPart = pParse->nMem+1; 957 pParse->nMem += nPart; 958 sqlite3VdbeAddOp3(v, OP_Null, 0, pMWin->regPart, pMWin->regPart+nPart-1); 959 } 960 961 for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ 962 FuncDef *p = pWin->pFunc; 963 if( (p->funcFlags & SQLITE_FUNC_MINMAX) && pWin->eStart!=TK_UNBOUNDED ){ 964 /* The inline versions of min() and max() require a single ephemeral 965 ** table and 3 registers. The registers are used as follows: 966 ** 967 ** regApp+0: slot to copy min()/max() argument to for MakeRecord 968 ** regApp+1: integer value used to ensure keys are unique 969 ** regApp+2: output of MakeRecord 970 */ 971 ExprList *pList = pWin->pOwner->x.pList; 972 KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pList, 0, 0); 973 pWin->csrApp = pParse->nTab++; 974 pWin->regApp = pParse->nMem+1; 975 pParse->nMem += 3; 976 if( pKeyInfo && pWin->pFunc->zName[1]=='i' ){ 977 assert( pKeyInfo->aSortOrder[0]==0 ); 978 pKeyInfo->aSortOrder[0] = 1; 979 } 980 sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pWin->csrApp, 2); 981 sqlite3VdbeAppendP4(v, pKeyInfo, P4_KEYINFO); 982 sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); 983 } 984 else if( p->xSFunc==nth_valueStepFunc || p->xSFunc==first_valueStepFunc ){ 985 /* Allocate two registers at pWin->regApp. These will be used to 986 ** store the start and end index of the current frame. */ 987 assert( pMWin->iEphCsr ); 988 pWin->regApp = pParse->nMem+1; 989 pWin->csrApp = pParse->nTab++; 990 pParse->nMem += 2; 991 sqlite3VdbeAddOp2(v, OP_OpenDup, pWin->csrApp, pMWin->iEphCsr); 992 } 993 else if( p->xSFunc==leadStepFunc || p->xSFunc==lagStepFunc ){ 994 assert( pMWin->iEphCsr ); 995 pWin->csrApp = pParse->nTab++; 996 sqlite3VdbeAddOp2(v, OP_OpenDup, pWin->csrApp, pMWin->iEphCsr); 997 } 998 } 999 } 1000 1001 /* 1002 ** A "PRECEDING <expr>" (bEnd==0) or "FOLLOWING <expr>" (bEnd==1) has just 1003 ** been evaluated and the result left in register reg. This function generates 1004 ** VM code to check that the value is a non-negative integer and throws 1005 ** an exception if it is not. 1006 */ 1007 static void windowCheckFrameOffset(Parse *pParse, int reg, int bEnd){ 1008 static const char *azErr[] = { 1009 "frame starting offset must be a non-negative integer", 1010 "frame ending offset must be a non-negative integer" 1011 }; 1012 Vdbe *v = sqlite3GetVdbe(pParse); 1013 int regZero = sqlite3GetTempReg(pParse); 1014 sqlite3VdbeAddOp2(v, OP_Integer, 0, regZero); 1015 sqlite3VdbeAddOp2(v, OP_MustBeInt, reg, sqlite3VdbeCurrentAddr(v)+2); 1016 VdbeCoverage(v); 1017 sqlite3VdbeAddOp3(v, OP_Ge, regZero, sqlite3VdbeCurrentAddr(v)+2, reg); 1018 VdbeCoverage(v); 1019 sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_ERROR, OE_Abort); 1020 sqlite3VdbeAppendP4(v, (void*)azErr[bEnd], P4_STATIC); 1021 sqlite3ReleaseTempReg(pParse, regZero); 1022 } 1023 1024 /* 1025 ** Return the number of arguments passed to the window-function associated 1026 ** with the object passed as the only argument to this function. 1027 */ 1028 static int windowArgCount(Window *pWin){ 1029 ExprList *pList = pWin->pOwner->x.pList; 1030 return (pList ? pList->nExpr : 0); 1031 } 1032 1033 /* 1034 ** Generate VM code to invoke either xStep() (if bInverse is 0) or 1035 ** xInverse (if bInverse is non-zero) for each window function in the 1036 ** linked list starting at pMWin. Or, for built-in window functions 1037 ** that do not use the standard function API, generate the required 1038 ** inline VM code. 1039 ** 1040 ** If argument csr is greater than or equal to 0, then argument reg is 1041 ** the first register in an array of registers guaranteed to be large 1042 ** enough to hold the array of arguments for each function. In this case 1043 ** the arguments are extracted from the current row of csr into the 1044 ** array of registers before invoking OP_AggStep or OP_AggInverse 1045 ** 1046 ** Or, if csr is less than zero, then the array of registers at reg is 1047 ** already populated with all columns from the current row of the sub-query. 1048 ** 1049 ** If argument regPartSize is non-zero, then it is a register containing the 1050 ** number of rows in the current partition. 1051 */ 1052 static void windowAggStep( 1053 Parse *pParse, 1054 Window *pMWin, /* Linked list of window functions */ 1055 int csr, /* Read arguments from this cursor */ 1056 int bInverse, /* True to invoke xInverse instead of xStep */ 1057 int reg, /* Array of registers */ 1058 int regPartSize /* Register containing size of partition */ 1059 ){ 1060 Vdbe *v = sqlite3GetVdbe(pParse); 1061 Window *pWin; 1062 for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ 1063 int flags = pWin->pFunc->funcFlags; 1064 int regArg; 1065 int nArg = windowArgCount(pWin); 1066 1067 if( csr>=0 ){ 1068 int i; 1069 for(i=0; i<nArg; i++){ 1070 sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+i, reg+i); 1071 } 1072 regArg = reg; 1073 if( flags & SQLITE_FUNC_WINDOW_SIZE ){ 1074 if( nArg==0 ){ 1075 regArg = regPartSize; 1076 }else{ 1077 sqlite3VdbeAddOp2(v, OP_SCopy, regPartSize, reg+nArg); 1078 } 1079 nArg++; 1080 } 1081 }else{ 1082 assert( !(flags & SQLITE_FUNC_WINDOW_SIZE) ); 1083 regArg = reg + pWin->iArgCol; 1084 } 1085 1086 if( (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX) 1087 && pWin->eStart!=TK_UNBOUNDED 1088 ){ 1089 int addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regArg); 1090 VdbeCoverage(v); 1091 if( bInverse==0 ){ 1092 sqlite3VdbeAddOp2(v, OP_AddImm, pWin->regApp+1, 1); 1093 sqlite3VdbeAddOp2(v, OP_SCopy, regArg, pWin->regApp); 1094 sqlite3VdbeAddOp3(v, OP_MakeRecord, pWin->regApp, 2, pWin->regApp+2); 1095 sqlite3VdbeAddOp2(v, OP_IdxInsert, pWin->csrApp, pWin->regApp+2); 1096 }else{ 1097 sqlite3VdbeAddOp4Int(v, OP_SeekGE, pWin->csrApp, 0, regArg, 1); 1098 VdbeCoverage(v); 1099 sqlite3VdbeAddOp1(v, OP_Delete, pWin->csrApp); 1100 sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); 1101 } 1102 sqlite3VdbeJumpHere(v, addrIsNull); 1103 }else if( pWin->regApp ){ 1104 assert( pWin->pFunc->xSFunc==nth_valueStepFunc 1105 || pWin->pFunc->xSFunc==first_valueStepFunc 1106 ); 1107 assert( bInverse==0 || bInverse==1 ); 1108 sqlite3VdbeAddOp2(v, OP_AddImm, pWin->regApp+1-bInverse, 1); 1109 }else if( pWin->pFunc->xSFunc==leadStepFunc 1110 || pWin->pFunc->xSFunc==lagStepFunc 1111 ){ 1112 /* no-op */ 1113 }else{ 1114 int addrIf = 0; 1115 if( pWin->pFilter ){ 1116 int regTmp; 1117 assert( nArg==pWin->pOwner->x.pList->nExpr ); 1118 if( csr>0 ){ 1119 regTmp = sqlite3GetTempReg(pParse); 1120 sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+nArg,regTmp); 1121 }else{ 1122 regTmp = regArg + nArg; 1123 } 1124 addrIf = sqlite3VdbeAddOp3(v, OP_IfNot, regTmp, 0, 1); 1125 VdbeCoverage(v); 1126 if( csr>0 ){ 1127 sqlite3ReleaseTempReg(pParse, regTmp); 1128 } 1129 } 1130 if( pWin->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ 1131 CollSeq *pColl; 1132 pColl = sqlite3ExprNNCollSeq(pParse, pWin->pOwner->x.pList->a[0].pExpr); 1133 sqlite3VdbeAddOp4(v, OP_CollSeq, 0,0,0, (const char*)pColl, P4_COLLSEQ); 1134 } 1135 sqlite3VdbeAddOp3(v, bInverse? OP_AggInverse : OP_AggStep, 1136 bInverse, regArg, pWin->regAccum); 1137 sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); 1138 sqlite3VdbeChangeP5(v, (u8)nArg); 1139 if( addrIf ) sqlite3VdbeJumpHere(v, addrIf); 1140 } 1141 } 1142 } 1143 1144 /* 1145 ** Generate VM code to invoke either xValue() (bFinal==0) or xFinalize() 1146 ** (bFinal==1) for each window function in the linked list starting at 1147 ** pMWin. Or, for built-in window-functions that do not use the standard 1148 ** API, generate the equivalent VM code. 1149 */ 1150 static void windowAggFinal(Parse *pParse, Window *pMWin, int bFinal){ 1151 Vdbe *v = sqlite3GetVdbe(pParse); 1152 Window *pWin; 1153 1154 for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ 1155 if( (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX) 1156 && pWin->eStart!=TK_UNBOUNDED 1157 ){ 1158 sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); 1159 sqlite3VdbeAddOp1(v, OP_Last, pWin->csrApp); 1160 VdbeCoverage(v); 1161 sqlite3VdbeAddOp3(v, OP_Column, pWin->csrApp, 0, pWin->regResult); 1162 sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); 1163 if( bFinal ){ 1164 sqlite3VdbeAddOp1(v, OP_ResetSorter, pWin->csrApp); 1165 } 1166 }else if( pWin->regApp ){ 1167 }else{ 1168 if( bFinal ){ 1169 sqlite3VdbeAddOp2(v, OP_AggFinal, pWin->regAccum, windowArgCount(pWin)); 1170 sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); 1171 sqlite3VdbeAddOp2(v, OP_Copy, pWin->regAccum, pWin->regResult); 1172 sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); 1173 }else{ 1174 sqlite3VdbeAddOp3(v, OP_AggValue, pWin->regAccum, windowArgCount(pWin), 1175 pWin->regResult); 1176 sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); 1177 } 1178 } 1179 } 1180 } 1181 1182 /* 1183 ** This function generates VM code to invoke the sub-routine at address 1184 ** lblFlushPart once for each partition with the entire partition cached in 1185 ** the Window.iEphCsr temp table. 1186 */ 1187 static void windowPartitionCache( 1188 Parse *pParse, 1189 Select *p, /* The rewritten SELECT statement */ 1190 WhereInfo *pWInfo, /* WhereInfo to call WhereEnd() on */ 1191 int regFlushPart, /* Register to use with Gosub lblFlushPart */ 1192 int lblFlushPart, /* Subroutine to Gosub to */ 1193 int *pRegSize /* OUT: Register containing partition size */ 1194 ){ 1195 Window *pMWin = p->pWin; 1196 Vdbe *v = sqlite3GetVdbe(pParse); 1197 int iSubCsr = p->pSrc->a[0].iCursor; 1198 int nSub = p->pSrc->a[0].pTab->nCol; 1199 int k; 1200 1201 int reg = pParse->nMem+1; 1202 int regRecord = reg+nSub; 1203 int regRowid = regRecord+1; 1204 1205 *pRegSize = regRowid; 1206 pParse->nMem += nSub + 2; 1207 1208 /* Martial the row returned by the sub-select into an array of 1209 ** registers. */ 1210 for(k=0; k<nSub; k++){ 1211 sqlite3VdbeAddOp3(v, OP_Column, iSubCsr, k, reg+k); 1212 } 1213 sqlite3VdbeAddOp3(v, OP_MakeRecord, reg, nSub, regRecord); 1214 1215 /* Check if this is the start of a new partition. If so, call the 1216 ** flush_partition sub-routine. */ 1217 if( pMWin->pPartition ){ 1218 int addr; 1219 ExprList *pPart = pMWin->pPartition; 1220 int nPart = pPart->nExpr; 1221 int regNewPart = reg + pMWin->nBufferCol; 1222 KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pPart, 0, 0); 1223 1224 addr = sqlite3VdbeAddOp3(v, OP_Compare, regNewPart, pMWin->regPart,nPart); 1225 sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); 1226 sqlite3VdbeAddOp3(v, OP_Jump, addr+2, addr+4, addr+2); 1227 VdbeCoverage(v); 1228 sqlite3VdbeAddOp3(v, OP_Copy, regNewPart, pMWin->regPart, nPart-1); 1229 sqlite3VdbeAddOp2(v, OP_Gosub, regFlushPart, lblFlushPart); 1230 } 1231 1232 /* Buffer the current row in the ephemeral table. */ 1233 sqlite3VdbeAddOp2(v, OP_NewRowid, pMWin->iEphCsr, regRowid); 1234 sqlite3VdbeAddOp3(v, OP_Insert, pMWin->iEphCsr, regRecord, regRowid); 1235 1236 /* End of the input loop */ 1237 sqlite3WhereEnd(pWInfo); 1238 1239 /* Invoke "flush_partition" to deal with the final (or only) partition */ 1240 sqlite3VdbeAddOp2(v, OP_Gosub, regFlushPart, lblFlushPart); 1241 } 1242 1243 /* 1244 ** Invoke the sub-routine at regGosub (generated by code in select.c) to 1245 ** return the current row of Window.iEphCsr. If all window functions are 1246 ** aggregate window functions that use the standard API, a single 1247 ** OP_Gosub instruction is all that this routine generates. Extra VM code 1248 ** for per-row processing is only generated for the following built-in window 1249 ** functions: 1250 ** 1251 ** nth_value() 1252 ** first_value() 1253 ** lag() 1254 ** lead() 1255 */ 1256 static void windowReturnOneRow( 1257 Parse *pParse, 1258 Window *pMWin, 1259 int regGosub, 1260 int addrGosub 1261 ){ 1262 Vdbe *v = sqlite3GetVdbe(pParse); 1263 Window *pWin; 1264 for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ 1265 FuncDef *pFunc = pWin->pFunc; 1266 if( pFunc->xSFunc==nth_valueStepFunc 1267 || pFunc->xSFunc==first_valueStepFunc 1268 ){ 1269 int csr = pWin->csrApp; 1270 int lbl = sqlite3VdbeMakeLabel(v); 1271 int tmpReg = sqlite3GetTempReg(pParse); 1272 sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); 1273 1274 if( pFunc->xSFunc==nth_valueStepFunc ){ 1275 sqlite3VdbeAddOp3(v, OP_Column, pMWin->iEphCsr, pWin->iArgCol+1,tmpReg); 1276 }else{ 1277 sqlite3VdbeAddOp2(v, OP_Integer, 1, tmpReg); 1278 } 1279 sqlite3VdbeAddOp3(v, OP_Add, tmpReg, pWin->regApp, tmpReg); 1280 sqlite3VdbeAddOp3(v, OP_Gt, pWin->regApp+1, lbl, tmpReg); 1281 VdbeCoverage(v); 1282 sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, lbl, tmpReg); 1283 VdbeCoverage(v); 1284 sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); 1285 sqlite3VdbeResolveLabel(v, lbl); 1286 sqlite3ReleaseTempReg(pParse, tmpReg); 1287 } 1288 else if( pFunc->xSFunc==leadStepFunc || pFunc->xSFunc==lagStepFunc ){ 1289 int nArg = pWin->pOwner->x.pList->nExpr; 1290 int iEph = pMWin->iEphCsr; 1291 int csr = pWin->csrApp; 1292 int lbl = sqlite3VdbeMakeLabel(v); 1293 int tmpReg = sqlite3GetTempReg(pParse); 1294 1295 if( nArg<3 ){ 1296 sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); 1297 }else{ 1298 sqlite3VdbeAddOp3(v, OP_Column, iEph, pWin->iArgCol+2, pWin->regResult); 1299 } 1300 sqlite3VdbeAddOp2(v, OP_Rowid, iEph, tmpReg); 1301 if( nArg<2 ){ 1302 int val = (pFunc->xSFunc==leadStepFunc ? 1 : -1); 1303 sqlite3VdbeAddOp2(v, OP_AddImm, tmpReg, val); 1304 }else{ 1305 int op = (pFunc->xSFunc==leadStepFunc ? OP_Add : OP_Subtract); 1306 int tmpReg2 = sqlite3GetTempReg(pParse); 1307 sqlite3VdbeAddOp3(v, OP_Column, iEph, pWin->iArgCol+1, tmpReg2); 1308 sqlite3VdbeAddOp3(v, op, tmpReg2, tmpReg, tmpReg); 1309 sqlite3ReleaseTempReg(pParse, tmpReg2); 1310 } 1311 1312 sqlite3VdbeAddOp3(v, OP_SeekRowid, csr, lbl, tmpReg); 1313 VdbeCoverage(v); 1314 sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol, pWin->regResult); 1315 sqlite3VdbeResolveLabel(v, lbl); 1316 sqlite3ReleaseTempReg(pParse, tmpReg); 1317 } 1318 } 1319 sqlite3VdbeAddOp2(v, OP_Gosub, regGosub, addrGosub); 1320 } 1321 1322 /* 1323 ** Invoke the code generated by windowReturnOneRow() and, optionally, the 1324 ** xInverse() function for each window function, for one or more rows 1325 ** from the Window.iEphCsr temp table. This routine generates VM code 1326 ** similar to: 1327 ** 1328 ** while( regCtr>0 ){ 1329 ** regCtr--; 1330 ** windowReturnOneRow() 1331 ** if( bInverse ){ 1332 ** AggInverse 1333 ** } 1334 ** Next (Window.iEphCsr) 1335 ** } 1336 */ 1337 static void windowReturnRows( 1338 Parse *pParse, 1339 Window *pMWin, /* List of window functions */ 1340 int regCtr, /* Register containing number of rows */ 1341 int regGosub, /* Register for Gosub addrGosub */ 1342 int addrGosub, /* Address of sub-routine for ReturnOneRow */ 1343 int regInvArg, /* Array of registers for xInverse args */ 1344 int regInvSize /* Register containing size of partition */ 1345 ){ 1346 int addr; 1347 Vdbe *v = sqlite3GetVdbe(pParse); 1348 windowAggFinal(pParse, pMWin, 0); 1349 addr = sqlite3VdbeAddOp3(v, OP_IfPos, regCtr, sqlite3VdbeCurrentAddr(v)+2 ,1); 1350 VdbeCoverage(v); 1351 sqlite3VdbeAddOp2(v, OP_Goto, 0, 0); 1352 windowReturnOneRow(pParse, pMWin, regGosub, addrGosub); 1353 if( regInvArg ){ 1354 windowAggStep(pParse, pMWin, pMWin->iEphCsr, 1, regInvArg, regInvSize); 1355 } 1356 sqlite3VdbeAddOp2(v, OP_Next, pMWin->iEphCsr, addr); 1357 VdbeCoverage(v); 1358 sqlite3VdbeJumpHere(v, addr+1); /* The OP_Goto */ 1359 } 1360 1361 /* 1362 ** Generate code to set the accumulator register for each window function 1363 ** in the linked list passed as the second argument to NULL. And perform 1364 ** any equivalent initialization required by any built-in window functions 1365 ** in the list. 1366 */ 1367 static int windowInitAccum(Parse *pParse, Window *pMWin){ 1368 Vdbe *v = sqlite3GetVdbe(pParse); 1369 int regArg; 1370 int nArg = 0; 1371 Window *pWin; 1372 for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ 1373 FuncDef *pFunc = pWin->pFunc; 1374 sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); 1375 nArg = MAX(nArg, windowArgCount(pWin)); 1376 if( pFunc->xSFunc==nth_valueStepFunc 1377 || pFunc->xSFunc==first_valueStepFunc 1378 ){ 1379 sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp); 1380 sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); 1381 } 1382 1383 if( (pFunc->funcFlags & SQLITE_FUNC_MINMAX) && pWin->csrApp ){ 1384 assert( pWin->eStart!=TK_UNBOUNDED ); 1385 sqlite3VdbeAddOp1(v, OP_ResetSorter, pWin->csrApp); 1386 sqlite3VdbeAddOp2(v, OP_Integer, 0, pWin->regApp+1); 1387 } 1388 } 1389 regArg = pParse->nMem+1; 1390 pParse->nMem += nArg; 1391 return regArg; 1392 } 1393 1394 1395 /* 1396 ** This function does the work of sqlite3WindowCodeStep() for all "ROWS" 1397 ** window frame types except for "BETWEEN UNBOUNDED PRECEDING AND CURRENT 1398 ** ROW". Pseudo-code for each follows. 1399 ** 1400 ** ROWS BETWEEN <expr1> PRECEDING AND <expr2> FOLLOWING 1401 ** 1402 ** ... 1403 ** if( new partition ){ 1404 ** Gosub flush_partition 1405 ** } 1406 ** Insert (record in eph-table) 1407 ** sqlite3WhereEnd() 1408 ** Gosub flush_partition 1409 ** 1410 ** flush_partition: 1411 ** Once { 1412 ** OpenDup (iEphCsr -> csrStart) 1413 ** OpenDup (iEphCsr -> csrEnd) 1414 ** } 1415 ** regStart = <expr1> // PRECEDING expression 1416 ** regEnd = <expr2> // FOLLOWING expression 1417 ** if( regStart<0 || regEnd<0 ){ error! } 1418 ** Rewind (csr,csrStart,csrEnd) // if EOF goto flush_partition_done 1419 ** Next(csrEnd) // if EOF skip Aggstep 1420 ** Aggstep (csrEnd) 1421 ** if( (regEnd--)<=0 ){ 1422 ** AggFinal (xValue) 1423 ** Gosub addrGosub 1424 ** Next(csr) // if EOF goto flush_partition_done 1425 ** if( (regStart--)<=0 ){ 1426 ** AggInverse (csrStart) 1427 ** Next(csrStart) 1428 ** } 1429 ** } 1430 ** flush_partition_done: 1431 ** ResetSorter (csr) 1432 ** Return 1433 ** 1434 ** ROWS BETWEEN <expr> PRECEDING AND CURRENT ROW 1435 ** ROWS BETWEEN CURRENT ROW AND <expr> FOLLOWING 1436 ** ROWS BETWEEN UNBOUNDED PRECEDING AND <expr> FOLLOWING 1437 ** 1438 ** These are similar to the above. For "CURRENT ROW", intialize the 1439 ** register to 0. For "UNBOUNDED PRECEDING" to infinity. 1440 ** 1441 ** ROWS BETWEEN <expr> PRECEDING AND UNBOUNDED FOLLOWING 1442 ** ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 1443 ** 1444 ** Rewind (csr,csrStart,csrEnd) // if EOF goto flush_partition_done 1445 ** while( 1 ){ 1446 ** Next(csrEnd) // Exit while(1) at EOF 1447 ** Aggstep (csrEnd) 1448 ** } 1449 ** while( 1 ){ 1450 ** AggFinal (xValue) 1451 ** Gosub addrGosub 1452 ** Next(csr) // if EOF goto flush_partition_done 1453 ** if( (regStart--)<=0 ){ 1454 ** AggInverse (csrStart) 1455 ** Next(csrStart) 1456 ** } 1457 ** } 1458 ** 1459 ** For the "CURRENT ROW AND UNBOUNDED FOLLOWING" case, the final if() 1460 ** condition is always true (as if regStart were initialized to 0). 1461 ** 1462 ** RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 1463 ** 1464 ** This is the only RANGE case handled by this routine. It modifies the 1465 ** second while( 1 ) loop in "ROWS BETWEEN CURRENT ... UNBOUNDED..." to 1466 ** be: 1467 ** 1468 ** while( 1 ){ 1469 ** AggFinal (xValue) 1470 ** while( 1 ){ 1471 ** regPeer++ 1472 ** Gosub addrGosub 1473 ** Next(csr) // if EOF goto flush_partition_done 1474 ** if( new peer ) break; 1475 ** } 1476 ** while( (regPeer--)>0 ){ 1477 ** AggInverse (csrStart) 1478 ** Next(csrStart) 1479 ** } 1480 ** } 1481 ** 1482 ** ROWS BETWEEN <expr> FOLLOWING AND <expr> FOLLOWING 1483 ** 1484 ** regEnd = regEnd - regStart 1485 ** Rewind (csr,csrStart,csrEnd) // if EOF goto flush_partition_done 1486 ** Aggstep (csrEnd) 1487 ** Next(csrEnd) // if EOF fall-through 1488 ** if( (regEnd--)<=0 ){ 1489 ** if( (regStart--)<=0 ){ 1490 ** AggFinal (xValue) 1491 ** Gosub addrGosub 1492 ** Next(csr) // if EOF goto flush_partition_done 1493 ** } 1494 ** AggInverse (csrStart) 1495 ** Next (csrStart) 1496 ** } 1497 ** 1498 ** ROWS BETWEEN <expr> PRECEDING AND <expr> PRECEDING 1499 ** 1500 ** Replace the bit after "Rewind" in the above with: 1501 ** 1502 ** if( (regEnd--)<=0 ){ 1503 ** AggStep (csrEnd) 1504 ** Next (csrEnd) 1505 ** } 1506 ** AggFinal (xValue) 1507 ** Gosub addrGosub 1508 ** Next(csr) // if EOF goto flush_partition_done 1509 ** if( (regStart--)<=0 ){ 1510 ** AggInverse (csr2) 1511 ** Next (csr2) 1512 ** } 1513 ** 1514 */ 1515 static void windowCodeRowExprStep( 1516 Parse *pParse, 1517 Select *p, 1518 WhereInfo *pWInfo, 1519 int regGosub, 1520 int addrGosub 1521 ){ 1522 Window *pMWin = p->pWin; 1523 Vdbe *v = sqlite3GetVdbe(pParse); 1524 int regFlushPart; /* Register for "Gosub flush_partition" */ 1525 int lblFlushPart; /* Label for "Gosub flush_partition" */ 1526 int lblFlushDone; /* Label for "Gosub flush_partition_done" */ 1527 1528 int regArg; 1529 int addr; 1530 int csrStart = pParse->nTab++; 1531 int csrEnd = pParse->nTab++; 1532 int regStart; /* Value of <expr> PRECEDING */ 1533 int regEnd; /* Value of <expr> FOLLOWING */ 1534 int addrGoto; 1535 int addrTop; 1536 int addrIfPos1; 1537 int addrIfPos2; 1538 int regSize = 0; 1539 1540 assert( pMWin->eStart==TK_PRECEDING 1541 || pMWin->eStart==TK_CURRENT 1542 || pMWin->eStart==TK_FOLLOWING 1543 || pMWin->eStart==TK_UNBOUNDED 1544 ); 1545 assert( pMWin->eEnd==TK_FOLLOWING 1546 || pMWin->eEnd==TK_CURRENT 1547 || pMWin->eEnd==TK_UNBOUNDED 1548 || pMWin->eEnd==TK_PRECEDING 1549 ); 1550 1551 /* Allocate register and label for the "flush_partition" sub-routine. */ 1552 regFlushPart = ++pParse->nMem; 1553 lblFlushPart = sqlite3VdbeMakeLabel(v); 1554 lblFlushDone = sqlite3VdbeMakeLabel(v); 1555 1556 regStart = ++pParse->nMem; 1557 regEnd = ++pParse->nMem; 1558 1559 windowPartitionCache(pParse, p, pWInfo, regFlushPart, lblFlushPart, ®Size); 1560 1561 addrGoto = sqlite3VdbeAddOp0(v, OP_Goto); 1562 1563 /* Start of "flush_partition" */ 1564 sqlite3VdbeResolveLabel(v, lblFlushPart); 1565 sqlite3VdbeAddOp2(v, OP_Once, 0, sqlite3VdbeCurrentAddr(v)+3); 1566 VdbeCoverage(v); 1567 sqlite3VdbeAddOp2(v, OP_OpenDup, csrStart, pMWin->iEphCsr); 1568 sqlite3VdbeAddOp2(v, OP_OpenDup, csrEnd, pMWin->iEphCsr); 1569 1570 /* If either regStart or regEnd are not non-negative integers, throw 1571 ** an exception. */ 1572 if( pMWin->pStart ){ 1573 sqlite3ExprCode(pParse, pMWin->pStart, regStart); 1574 windowCheckFrameOffset(pParse, regStart, 0); 1575 } 1576 if( pMWin->pEnd ){ 1577 sqlite3ExprCode(pParse, pMWin->pEnd, regEnd); 1578 windowCheckFrameOffset(pParse, regEnd, 1); 1579 } 1580 1581 /* If this is "ROWS <expr1> FOLLOWING AND ROWS <expr2> FOLLOWING", do: 1582 ** 1583 ** if( regEnd<regStart ){ 1584 ** // The frame always consists of 0 rows 1585 ** regStart = regSize; 1586 ** } 1587 ** regEnd = regEnd - regStart; 1588 */ 1589 if( pMWin->pEnd && pMWin->pStart && pMWin->eStart==TK_FOLLOWING ){ 1590 assert( pMWin->eEnd==TK_FOLLOWING ); 1591 sqlite3VdbeAddOp3(v, OP_Ge, regStart, sqlite3VdbeCurrentAddr(v)+2, regEnd); 1592 VdbeCoverage(v); 1593 sqlite3VdbeAddOp2(v, OP_Copy, regSize, regStart); 1594 sqlite3VdbeAddOp3(v, OP_Subtract, regStart, regEnd, regEnd); 1595 } 1596 1597 if( pMWin->pEnd && pMWin->pStart && pMWin->eEnd==TK_PRECEDING ){ 1598 assert( pMWin->eStart==TK_PRECEDING ); 1599 sqlite3VdbeAddOp3(v, OP_Le, regStart, sqlite3VdbeCurrentAddr(v)+3, regEnd); 1600 VdbeCoverage(v); 1601 sqlite3VdbeAddOp2(v, OP_Copy, regSize, regStart); 1602 sqlite3VdbeAddOp2(v, OP_Copy, regSize, regEnd); 1603 } 1604 1605 /* Initialize the accumulator register for each window function to NULL */ 1606 regArg = windowInitAccum(pParse, pMWin); 1607 1608 sqlite3VdbeAddOp2(v, OP_Rewind, pMWin->iEphCsr, lblFlushDone); 1609 VdbeCoverage(v); 1610 sqlite3VdbeAddOp2(v, OP_Rewind, csrStart, lblFlushDone); 1611 VdbeCoverageNeverTaken(v); 1612 sqlite3VdbeChangeP5(v, 1); 1613 sqlite3VdbeAddOp2(v, OP_Rewind, csrEnd, lblFlushDone); 1614 VdbeCoverageNeverTaken(v); 1615 sqlite3VdbeChangeP5(v, 1); 1616 1617 /* Invoke AggStep function for each window function using the row that 1618 ** csrEnd currently points to. Or, if csrEnd is already at EOF, 1619 ** do nothing. */ 1620 addrTop = sqlite3VdbeCurrentAddr(v); 1621 if( pMWin->eEnd==TK_PRECEDING ){ 1622 addrIfPos1 = sqlite3VdbeAddOp3(v, OP_IfPos, regEnd, 0 , 1); 1623 VdbeCoverage(v); 1624 } 1625 sqlite3VdbeAddOp2(v, OP_Next, csrEnd, sqlite3VdbeCurrentAddr(v)+2); 1626 VdbeCoverage(v); 1627 addr = sqlite3VdbeAddOp0(v, OP_Goto); 1628 windowAggStep(pParse, pMWin, csrEnd, 0, regArg, regSize); 1629 if( pMWin->eEnd==TK_UNBOUNDED ){ 1630 sqlite3VdbeAddOp2(v, OP_Goto, 0, addrTop); 1631 sqlite3VdbeJumpHere(v, addr); 1632 addrTop = sqlite3VdbeCurrentAddr(v); 1633 }else{ 1634 sqlite3VdbeJumpHere(v, addr); 1635 if( pMWin->eEnd==TK_PRECEDING ){ 1636 sqlite3VdbeJumpHere(v, addrIfPos1); 1637 } 1638 } 1639 1640 if( pMWin->eEnd==TK_FOLLOWING ){ 1641 addrIfPos1 = sqlite3VdbeAddOp3(v, OP_IfPos, regEnd, 0 , 1); 1642 VdbeCoverage(v); 1643 } 1644 if( pMWin->eStart==TK_FOLLOWING ){ 1645 addrIfPos2 = sqlite3VdbeAddOp3(v, OP_IfPos, regStart, 0 , 1); 1646 VdbeCoverage(v); 1647 } 1648 windowAggFinal(pParse, pMWin, 0); 1649 windowReturnOneRow(pParse, pMWin, regGosub, addrGosub); 1650 sqlite3VdbeAddOp2(v, OP_Next, pMWin->iEphCsr, sqlite3VdbeCurrentAddr(v)+2); 1651 VdbeCoverage(v); 1652 sqlite3VdbeAddOp2(v, OP_Goto, 0, lblFlushDone); 1653 if( pMWin->eStart==TK_FOLLOWING ){ 1654 sqlite3VdbeJumpHere(v, addrIfPos2); 1655 } 1656 1657 if( pMWin->eStart==TK_CURRENT 1658 || pMWin->eStart==TK_PRECEDING 1659 || pMWin->eStart==TK_FOLLOWING 1660 ){ 1661 int lblSkipInverse = sqlite3VdbeMakeLabel(v);; 1662 if( pMWin->eStart==TK_PRECEDING ){ 1663 sqlite3VdbeAddOp3(v, OP_IfPos, regStart, lblSkipInverse, 1); 1664 VdbeCoverage(v); 1665 } 1666 if( pMWin->eStart==TK_FOLLOWING ){ 1667 sqlite3VdbeAddOp2(v, OP_Next, csrStart, sqlite3VdbeCurrentAddr(v)+2); 1668 VdbeCoverage(v); 1669 sqlite3VdbeAddOp2(v, OP_Goto, 0, lblSkipInverse); 1670 }else{ 1671 sqlite3VdbeAddOp2(v, OP_Next, csrStart, sqlite3VdbeCurrentAddr(v)+1); 1672 VdbeCoverage(v); 1673 } 1674 windowAggStep(pParse, pMWin, csrStart, 1, regArg, regSize); 1675 sqlite3VdbeResolveLabel(v, lblSkipInverse); 1676 } 1677 if( pMWin->eEnd==TK_FOLLOWING ){ 1678 sqlite3VdbeJumpHere(v, addrIfPos1); 1679 } 1680 sqlite3VdbeAddOp2(v, OP_Goto, 0, addrTop); 1681 1682 /* flush_partition_done: */ 1683 sqlite3VdbeResolveLabel(v, lblFlushDone); 1684 sqlite3VdbeAddOp1(v, OP_ResetSorter, pMWin->iEphCsr); 1685 sqlite3VdbeAddOp1(v, OP_Return, regFlushPart); 1686 1687 /* Jump to here to skip over flush_partition */ 1688 sqlite3VdbeJumpHere(v, addrGoto); 1689 } 1690 1691 /* 1692 ** This function does the work of sqlite3WindowCodeStep() for cases that 1693 ** would normally be handled by windowCodeDefaultStep() when there are 1694 ** one or more built-in window-functions that require the entire partition 1695 ** to be cached in a temp table before any rows can be returned. Additionally. 1696 ** "RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING" is always handled by 1697 ** this function. 1698 ** 1699 ** Pseudo-code corresponding to the VM code generated by this function 1700 ** for each type of window follows. 1701 ** 1702 ** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 1703 ** 1704 ** flush_partition: 1705 ** Once { 1706 ** OpenDup (iEphCsr -> csrLead) 1707 ** } 1708 ** Integer ctr 0 1709 ** foreach row (csrLead){ 1710 ** if( new peer ){ 1711 ** AggFinal (xValue) 1712 ** for(i=0; i<ctr; i++){ 1713 ** Gosub addrGosub 1714 ** Next iEphCsr 1715 ** } 1716 ** Integer ctr 0 1717 ** } 1718 ** AggStep (csrLead) 1719 ** Incr ctr 1720 ** } 1721 ** 1722 ** AggFinal (xFinalize) 1723 ** for(i=0; i<ctr; i++){ 1724 ** Gosub addrGosub 1725 ** Next iEphCsr 1726 ** } 1727 ** 1728 ** ResetSorter (csr) 1729 ** Return 1730 ** 1731 ** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 1732 ** 1733 ** As above, except that the "if( new peer )" branch is always taken. 1734 ** 1735 ** RANGE BETWEEN CURRENT ROW AND CURRENT ROW 1736 ** 1737 ** As above, except that each of the for() loops becomes: 1738 ** 1739 ** for(i=0; i<ctr; i++){ 1740 ** Gosub addrGosub 1741 ** AggInverse (iEphCsr) 1742 ** Next iEphCsr 1743 ** } 1744 ** 1745 ** RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 1746 ** 1747 ** flush_partition: 1748 ** Once { 1749 ** OpenDup (iEphCsr -> csrLead) 1750 ** } 1751 ** foreach row (csrLead) { 1752 ** AggStep (csrLead) 1753 ** } 1754 ** foreach row (iEphCsr) { 1755 ** Gosub addrGosub 1756 ** } 1757 ** 1758 ** RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 1759 ** 1760 ** flush_partition: 1761 ** Once { 1762 ** OpenDup (iEphCsr -> csrLead) 1763 ** } 1764 ** foreach row (csrLead){ 1765 ** AggStep (csrLead) 1766 ** } 1767 ** Rewind (csrLead) 1768 ** Integer ctr 0 1769 ** foreach row (csrLead){ 1770 ** if( new peer ){ 1771 ** AggFinal (xValue) 1772 ** for(i=0; i<ctr; i++){ 1773 ** Gosub addrGosub 1774 ** AggInverse (iEphCsr) 1775 ** Next iEphCsr 1776 ** } 1777 ** Integer ctr 0 1778 ** } 1779 ** Incr ctr 1780 ** } 1781 ** 1782 ** AggFinal (xFinalize) 1783 ** for(i=0; i<ctr; i++){ 1784 ** Gosub addrGosub 1785 ** Next iEphCsr 1786 ** } 1787 ** 1788 ** ResetSorter (csr) 1789 ** Return 1790 */ 1791 static void windowCodeCacheStep( 1792 Parse *pParse, 1793 Select *p, 1794 WhereInfo *pWInfo, 1795 int regGosub, 1796 int addrGosub 1797 ){ 1798 Window *pMWin = p->pWin; 1799 Vdbe *v = sqlite3GetVdbe(pParse); 1800 int k; 1801 int addr; 1802 ExprList *pPart = pMWin->pPartition; 1803 ExprList *pOrderBy = pMWin->pOrderBy; 1804 int nPeer = pOrderBy ? pOrderBy->nExpr : 0; 1805 int regNewPeer; 1806 1807 int addrGoto; /* Address of Goto used to jump flush_par.. */ 1808 int addrNext; /* Jump here for next iteration of loop */ 1809 int regFlushPart; 1810 int lblFlushPart; 1811 int csrLead; 1812 int regCtr; 1813 int regArg; /* Register array to martial function args */ 1814 int regSize; 1815 int lblEmpty; 1816 int bReverse = pMWin->pOrderBy && pMWin->eStart==TK_CURRENT 1817 && pMWin->eEnd==TK_UNBOUNDED; 1818 1819 assert( (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_CURRENT) 1820 || (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_UNBOUNDED) 1821 || (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_CURRENT) 1822 || (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_UNBOUNDED) 1823 ); 1824 1825 lblEmpty = sqlite3VdbeMakeLabel(v); 1826 regNewPeer = pParse->nMem+1; 1827 pParse->nMem += nPeer; 1828 1829 /* Allocate register and label for the "flush_partition" sub-routine. */ 1830 regFlushPart = ++pParse->nMem; 1831 lblFlushPart = sqlite3VdbeMakeLabel(v); 1832 1833 csrLead = pParse->nTab++; 1834 regCtr = ++pParse->nMem; 1835 1836 windowPartitionCache(pParse, p, pWInfo, regFlushPart, lblFlushPart, ®Size); 1837 addrGoto = sqlite3VdbeAddOp0(v, OP_Goto); 1838 1839 /* Start of "flush_partition" */ 1840 sqlite3VdbeResolveLabel(v, lblFlushPart); 1841 sqlite3VdbeAddOp2(v, OP_Once, 0, sqlite3VdbeCurrentAddr(v)+2); 1842 VdbeCoverage(v); 1843 sqlite3VdbeAddOp2(v, OP_OpenDup, csrLead, pMWin->iEphCsr); 1844 1845 /* Initialize the accumulator register for each window function to NULL */ 1846 regArg = windowInitAccum(pParse, pMWin); 1847 1848 sqlite3VdbeAddOp2(v, OP_Integer, 0, regCtr); 1849 sqlite3VdbeAddOp2(v, OP_Rewind, csrLead, lblEmpty); 1850 VdbeCoverage(v); 1851 sqlite3VdbeAddOp2(v, OP_Rewind, pMWin->iEphCsr, lblEmpty); 1852 VdbeCoverageNeverTaken(v); 1853 1854 if( bReverse ){ 1855 int addr = sqlite3VdbeCurrentAddr(v); 1856 windowAggStep(pParse, pMWin, csrLead, 0, regArg, regSize); 1857 sqlite3VdbeAddOp2(v, OP_Next, csrLead, addr); 1858 VdbeCoverage(v); 1859 sqlite3VdbeAddOp2(v, OP_Rewind, csrLead, lblEmpty); 1860 VdbeCoverageNeverTaken(v); 1861 } 1862 addrNext = sqlite3VdbeCurrentAddr(v); 1863 1864 if( pOrderBy && (pMWin->eEnd==TK_CURRENT || pMWin->eStart==TK_CURRENT) ){ 1865 int bCurrent = (pMWin->eStart==TK_CURRENT); 1866 int addrJump = 0; /* Address of OP_Jump below */ 1867 if( pMWin->eType==TK_RANGE ){ 1868 int iOff = pMWin->nBufferCol + (pPart ? pPart->nExpr : 0); 1869 int regPeer = pMWin->regPart + (pPart ? pPart->nExpr : 0); 1870 KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pOrderBy, 0, 0); 1871 for(k=0; k<nPeer; k++){ 1872 sqlite3VdbeAddOp3(v, OP_Column, csrLead, iOff+k, regNewPeer+k); 1873 } 1874 addr = sqlite3VdbeAddOp3(v, OP_Compare, regNewPeer, regPeer, nPeer); 1875 sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); 1876 addrJump = sqlite3VdbeAddOp3(v, OP_Jump, addr+2, 0, addr+2); 1877 VdbeCoverage(v); 1878 sqlite3VdbeAddOp3(v, OP_Copy, regNewPeer, regPeer, nPeer-1); 1879 } 1880 1881 windowReturnRows(pParse, pMWin, regCtr, regGosub, addrGosub, 1882 (bCurrent ? regArg : 0), (bCurrent ? regSize : 0) 1883 ); 1884 if( addrJump ) sqlite3VdbeJumpHere(v, addrJump); 1885 } 1886 1887 if( bReverse==0 ){ 1888 windowAggStep(pParse, pMWin, csrLead, 0, regArg, regSize); 1889 } 1890 sqlite3VdbeAddOp2(v, OP_AddImm, regCtr, 1); 1891 sqlite3VdbeAddOp2(v, OP_Next, csrLead, addrNext); 1892 VdbeCoverage(v); 1893 1894 windowReturnRows(pParse, pMWin, regCtr, regGosub, addrGosub, 0, 0); 1895 1896 sqlite3VdbeResolveLabel(v, lblEmpty); 1897 sqlite3VdbeAddOp1(v, OP_ResetSorter, pMWin->iEphCsr); 1898 sqlite3VdbeAddOp1(v, OP_Return, regFlushPart); 1899 1900 /* Jump to here to skip over flush_partition */ 1901 sqlite3VdbeJumpHere(v, addrGoto); 1902 } 1903 1904 1905 /* 1906 ** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 1907 ** 1908 ** ... 1909 ** if( new partition ){ 1910 ** AggFinal (xFinalize) 1911 ** Gosub addrGosub 1912 ** ResetSorter eph-table 1913 ** } 1914 ** else if( new peer ){ 1915 ** AggFinal (xValue) 1916 ** Gosub addrGosub 1917 ** ResetSorter eph-table 1918 ** } 1919 ** AggStep 1920 ** Insert (record into eph-table) 1921 ** sqlite3WhereEnd() 1922 ** AggFinal (xFinalize) 1923 ** Gosub addrGosub 1924 ** 1925 ** RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 1926 ** 1927 ** As above, except take no action for a "new peer". Invoke 1928 ** the sub-routine once only for each partition. 1929 ** 1930 ** RANGE BETWEEN CURRENT ROW AND CURRENT ROW 1931 ** 1932 ** As above, except that the "new peer" condition is handled in the 1933 ** same way as "new partition" (so there is no "else if" block). 1934 ** 1935 ** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 1936 ** 1937 ** As above, except assume every row is a "new peer". 1938 */ 1939 static void windowCodeDefaultStep( 1940 Parse *pParse, 1941 Select *p, 1942 WhereInfo *pWInfo, 1943 int regGosub, 1944 int addrGosub 1945 ){ 1946 Window *pMWin = p->pWin; 1947 Vdbe *v = sqlite3GetVdbe(pParse); 1948 int k; 1949 int iSubCsr = p->pSrc->a[0].iCursor; 1950 int nSub = p->pSrc->a[0].pTab->nCol; 1951 int reg = pParse->nMem+1; 1952 int regRecord = reg+nSub; 1953 int regRowid = regRecord+1; 1954 int addr; 1955 ExprList *pPart = pMWin->pPartition; 1956 ExprList *pOrderBy = pMWin->pOrderBy; 1957 1958 assert( pMWin->eType==TK_RANGE 1959 || (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_CURRENT) 1960 ); 1961 1962 assert( (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_CURRENT) 1963 || (pMWin->eStart==TK_UNBOUNDED && pMWin->eEnd==TK_UNBOUNDED) 1964 || (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_CURRENT) 1965 || (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_UNBOUNDED && !pOrderBy) 1966 ); 1967 1968 if( pMWin->eEnd==TK_UNBOUNDED ){ 1969 pOrderBy = 0; 1970 } 1971 1972 pParse->nMem += nSub + 2; 1973 1974 /* Martial the row returned by the sub-select into an array of 1975 ** registers. */ 1976 for(k=0; k<nSub; k++){ 1977 sqlite3VdbeAddOp3(v, OP_Column, iSubCsr, k, reg+k); 1978 } 1979 1980 /* Check if this is the start of a new partition or peer group. */ 1981 if( pPart || pOrderBy ){ 1982 int nPart = (pPart ? pPart->nExpr : 0); 1983 int addrGoto = 0; 1984 int addrJump = 0; 1985 int nPeer = (pOrderBy ? pOrderBy->nExpr : 0); 1986 1987 if( pPart ){ 1988 int regNewPart = reg + pMWin->nBufferCol; 1989 KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pPart, 0, 0); 1990 addr = sqlite3VdbeAddOp3(v, OP_Compare, regNewPart, pMWin->regPart,nPart); 1991 sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); 1992 addrJump = sqlite3VdbeAddOp3(v, OP_Jump, addr+2, 0, addr+2); 1993 VdbeCoverage(v); 1994 windowAggFinal(pParse, pMWin, 1); 1995 if( pOrderBy ){ 1996 addrGoto = sqlite3VdbeAddOp0(v, OP_Goto); 1997 } 1998 } 1999 2000 if( pOrderBy ){ 2001 int regNewPeer = reg + pMWin->nBufferCol + nPart; 2002 int regPeer = pMWin->regPart + nPart; 2003 2004 if( addrJump ) sqlite3VdbeJumpHere(v, addrJump); 2005 if( pMWin->eType==TK_RANGE ){ 2006 KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pOrderBy, 0, 0); 2007 addr = sqlite3VdbeAddOp3(v, OP_Compare, regNewPeer, regPeer, nPeer); 2008 sqlite3VdbeAppendP4(v, (void*)pKeyInfo, P4_KEYINFO); 2009 addrJump = sqlite3VdbeAddOp3(v, OP_Jump, addr+2, 0, addr+2); 2010 VdbeCoverage(v); 2011 }else{ 2012 addrJump = 0; 2013 } 2014 windowAggFinal(pParse, pMWin, pMWin->eStart==TK_CURRENT); 2015 if( addrGoto ) sqlite3VdbeJumpHere(v, addrGoto); 2016 } 2017 2018 sqlite3VdbeAddOp2(v, OP_Rewind, pMWin->iEphCsr,sqlite3VdbeCurrentAddr(v)+3); 2019 VdbeCoverage(v); 2020 sqlite3VdbeAddOp2(v, OP_Gosub, regGosub, addrGosub); 2021 sqlite3VdbeAddOp2(v, OP_Next, pMWin->iEphCsr, sqlite3VdbeCurrentAddr(v)-1); 2022 VdbeCoverage(v); 2023 2024 sqlite3VdbeAddOp1(v, OP_ResetSorter, pMWin->iEphCsr); 2025 sqlite3VdbeAddOp3( 2026 v, OP_Copy, reg+pMWin->nBufferCol, pMWin->regPart, nPart+nPeer-1 2027 ); 2028 2029 if( addrJump ) sqlite3VdbeJumpHere(v, addrJump); 2030 } 2031 2032 /* Invoke step function for window functions */ 2033 windowAggStep(pParse, pMWin, -1, 0, reg, 0); 2034 2035 /* Buffer the current row in the ephemeral table. */ 2036 if( pMWin->nBufferCol>0 ){ 2037 sqlite3VdbeAddOp3(v, OP_MakeRecord, reg, pMWin->nBufferCol, regRecord); 2038 }else{ 2039 sqlite3VdbeAddOp2(v, OP_Blob, 0, regRecord); 2040 sqlite3VdbeAppendP4(v, (void*)"", 0); 2041 } 2042 sqlite3VdbeAddOp2(v, OP_NewRowid, pMWin->iEphCsr, regRowid); 2043 sqlite3VdbeAddOp3(v, OP_Insert, pMWin->iEphCsr, regRecord, regRowid); 2044 2045 /* End the database scan loop. */ 2046 sqlite3WhereEnd(pWInfo); 2047 2048 windowAggFinal(pParse, pMWin, 1); 2049 sqlite3VdbeAddOp2(v, OP_Rewind, pMWin->iEphCsr,sqlite3VdbeCurrentAddr(v)+3); 2050 VdbeCoverage(v); 2051 sqlite3VdbeAddOp2(v, OP_Gosub, regGosub, addrGosub); 2052 sqlite3VdbeAddOp2(v, OP_Next, pMWin->iEphCsr, sqlite3VdbeCurrentAddr(v)-1); 2053 VdbeCoverage(v); 2054 } 2055 2056 /* 2057 ** Allocate and return a duplicate of the Window object indicated by the 2058 ** third argument. Set the Window.pOwner field of the new object to 2059 ** pOwner. 2060 */ 2061 Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ 2062 Window *pNew = 0; 2063 if( p ){ 2064 pNew = sqlite3DbMallocZero(db, sizeof(Window)); 2065 if( pNew ){ 2066 pNew->zName = sqlite3DbStrDup(db, p->zName); 2067 pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0); 2068 pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0); 2069 pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0); 2070 pNew->eType = p->eType; 2071 pNew->eEnd = p->eEnd; 2072 pNew->eStart = p->eStart; 2073 pNew->pStart = sqlite3ExprDup(db, p->pStart, 0); 2074 pNew->pEnd = sqlite3ExprDup(db, p->pEnd, 0); 2075 pNew->pOwner = pOwner; 2076 } 2077 } 2078 return pNew; 2079 } 2080 2081 /* 2082 ** Return a copy of the linked list of Window objects passed as the 2083 ** second argument. 2084 */ 2085 Window *sqlite3WindowListDup(sqlite3 *db, Window *p){ 2086 Window *pWin; 2087 Window *pRet = 0; 2088 Window **pp = &pRet; 2089 2090 for(pWin=p; pWin; pWin=pWin->pNextWin){ 2091 *pp = sqlite3WindowDup(db, 0, pWin); 2092 if( *pp==0 ) break; 2093 pp = &((*pp)->pNextWin); 2094 } 2095 2096 return pRet; 2097 } 2098 2099 /* 2100 ** sqlite3WhereBegin() has already been called for the SELECT statement 2101 ** passed as the second argument when this function is invoked. It generates 2102 ** code to populate the Window.regResult register for each window function and 2103 ** invoke the sub-routine at instruction addrGosub once for each row. 2104 ** This function calls sqlite3WhereEnd() before returning. 2105 */ 2106 void sqlite3WindowCodeStep( 2107 Parse *pParse, /* Parse context */ 2108 Select *p, /* Rewritten SELECT statement */ 2109 WhereInfo *pWInfo, /* Context returned by sqlite3WhereBegin() */ 2110 int regGosub, /* Register for OP_Gosub */ 2111 int addrGosub /* OP_Gosub here to return each row */ 2112 ){ 2113 Window *pMWin = p->pWin; 2114 2115 /* There are three different functions that may be used to do the work 2116 ** of this one, depending on the window frame and the specific built-in 2117 ** window functions used (if any). 2118 ** 2119 ** windowCodeRowExprStep() handles all "ROWS" window frames, except for: 2120 ** 2121 ** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 2122 ** 2123 ** The exception is because windowCodeRowExprStep() implements all window 2124 ** frame types by caching the entire partition in a temp table, and 2125 ** "ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW" is easy enough to 2126 ** implement without such a cache. 2127 ** 2128 ** windowCodeCacheStep() is used for: 2129 ** 2130 ** RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 2131 ** 2132 ** It is also used for anything not handled by windowCodeRowExprStep() 2133 ** that invokes a built-in window function that requires the entire 2134 ** partition to be cached in a temp table before any rows are returned 2135 ** (e.g. nth_value() or percent_rank()). 2136 ** 2137 ** Finally, assuming there is no built-in window function that requires 2138 ** the partition to be cached, windowCodeDefaultStep() is used for: 2139 ** 2140 ** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 2141 ** RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 2142 ** RANGE BETWEEN CURRENT ROW AND CURRENT ROW 2143 ** ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 2144 ** 2145 ** windowCodeDefaultStep() is the only one of the three functions that 2146 ** does not cache each partition in a temp table before beginning to 2147 ** return rows. 2148 */ 2149 if( pMWin->eType==TK_ROWS 2150 && (pMWin->eStart!=TK_UNBOUNDED||pMWin->eEnd!=TK_CURRENT||!pMWin->pOrderBy) 2151 ){ 2152 windowCodeRowExprStep(pParse, p, pWInfo, regGosub, addrGosub); 2153 }else{ 2154 Window *pWin; 2155 int bCache = 0; /* True to use CacheStep() */ 2156 2157 if( pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_UNBOUNDED ){ 2158 bCache = 1; 2159 }else{ 2160 for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ 2161 FuncDef *pFunc = pWin->pFunc; 2162 if( (pFunc->funcFlags & SQLITE_FUNC_WINDOW_SIZE) 2163 || (pFunc->xSFunc==nth_valueStepFunc) 2164 || (pFunc->xSFunc==first_valueStepFunc) 2165 || (pFunc->xSFunc==leadStepFunc) 2166 || (pFunc->xSFunc==lagStepFunc) 2167 ){ 2168 bCache = 1; 2169 break; 2170 } 2171 } 2172 } 2173 2174 /* Otherwise, call windowCodeDefaultStep(). */ 2175 if( bCache ){ 2176 windowCodeCacheStep(pParse, p, pWInfo, regGosub, addrGosub); 2177 }else{ 2178 windowCodeDefaultStep(pParse, p, pWInfo, regGosub, addrGosub); 2179 } 2180 } 2181 } 2182 2183 #endif /* SQLITE_OMIT_WINDOWFUNC */ 2184