| OLD | NEW |
| 1 /* | 1 /* |
| 2 ** 2001 September 15 | 2 ** 2001 September 15 |
| 3 ** | 3 ** |
| 4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
| 5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
| 6 ** | 6 ** |
| 7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
| 8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
| 9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
| 10 ** | 10 ** |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 } | 84 } |
| 85 Expr *sqlite3ExprAddCollateString(Parse *pParse, Expr *pExpr, const char *zC){ | 85 Expr *sqlite3ExprAddCollateString(Parse *pParse, Expr *pExpr, const char *zC){ |
| 86 Token s; | 86 Token s; |
| 87 assert( zC!=0 ); | 87 assert( zC!=0 ); |
| 88 s.z = zC; | 88 s.z = zC; |
| 89 s.n = sqlite3Strlen30(s.z); | 89 s.n = sqlite3Strlen30(s.z); |
| 90 return sqlite3ExprAddCollateToken(pParse, pExpr, &s, 0); | 90 return sqlite3ExprAddCollateToken(pParse, pExpr, &s, 0); |
| 91 } | 91 } |
| 92 | 92 |
| 93 /* | 93 /* |
| 94 ** Skip over any TK_COLLATE or TK_AS operators and any unlikely() | 94 ** Skip over any TK_COLLATE operators and any unlikely() |
| 95 ** or likelihood() function at the root of an expression. | 95 ** or likelihood() function at the root of an expression. |
| 96 */ | 96 */ |
| 97 Expr *sqlite3ExprSkipCollate(Expr *pExpr){ | 97 Expr *sqlite3ExprSkipCollate(Expr *pExpr){ |
| 98 while( pExpr && ExprHasProperty(pExpr, EP_Skip) ){ | 98 while( pExpr && ExprHasProperty(pExpr, EP_Skip) ){ |
| 99 if( ExprHasProperty(pExpr, EP_Unlikely) ){ | 99 if( ExprHasProperty(pExpr, EP_Unlikely) ){ |
| 100 assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); | 100 assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); |
| 101 assert( pExpr->x.pList->nExpr>0 ); | 101 assert( pExpr->x.pList->nExpr>0 ); |
| 102 assert( pExpr->op==TK_FUNCTION ); | 102 assert( pExpr->op==TK_FUNCTION ); |
| 103 pExpr = pExpr->x.pList->a[0].pExpr; | 103 pExpr = pExpr->x.pList->a[0].pExpr; |
| 104 }else{ | 104 }else{ |
| 105 assert( pExpr->op==TK_COLLATE || pExpr->op==TK_AS ); | 105 assert( pExpr->op==TK_COLLATE ); |
| 106 pExpr = pExpr->pLeft; | 106 pExpr = pExpr->pLeft; |
| 107 } | 107 } |
| 108 } | 108 } |
| 109 return pExpr; | 109 return pExpr; |
| 110 } | 110 } |
| 111 | 111 |
| 112 /* | 112 /* |
| 113 ** Return the collation sequence for the expression pExpr. If | 113 ** Return the collation sequence for the expression pExpr. If |
| 114 ** there is no defined collating sequence, return NULL. | 114 ** there is no defined collating sequence, return NULL. |
| 115 ** | 115 ** |
| (...skipping 10 matching lines...) Expand all Loading... |
| 126 int op = p->op; | 126 int op = p->op; |
| 127 if( p->flags & EP_Generic ) break; | 127 if( p->flags & EP_Generic ) break; |
| 128 if( op==TK_CAST || op==TK_UPLUS ){ | 128 if( op==TK_CAST || op==TK_UPLUS ){ |
| 129 p = p->pLeft; | 129 p = p->pLeft; |
| 130 continue; | 130 continue; |
| 131 } | 131 } |
| 132 if( op==TK_COLLATE || (op==TK_REGISTER && p->op2==TK_COLLATE) ){ | 132 if( op==TK_COLLATE || (op==TK_REGISTER && p->op2==TK_COLLATE) ){ |
| 133 pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken); | 133 pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken); |
| 134 break; | 134 break; |
| 135 } | 135 } |
| 136 if( p->pTab!=0 | 136 if( (op==TK_AGG_COLUMN || op==TK_COLUMN |
| 137 && (op==TK_AGG_COLUMN || op==TK_COLUMN | |
| 138 || op==TK_REGISTER || op==TK_TRIGGER) | 137 || op==TK_REGISTER || op==TK_TRIGGER) |
| 138 && p->pTab!=0 |
| 139 ){ | 139 ){ |
| 140 /* op==TK_REGISTER && p->pTab!=0 happens when pExpr was originally | 140 /* op==TK_REGISTER && p->pTab!=0 happens when pExpr was originally |
| 141 ** a TK_COLUMN but was previously evaluated and cached in a register */ | 141 ** a TK_COLUMN but was previously evaluated and cached in a register */ |
| 142 int j = p->iColumn; | 142 int j = p->iColumn; |
| 143 if( j>=0 ){ | 143 if( j>=0 ){ |
| 144 const char *zColl = p->pTab->aCol[j].zColl; | 144 const char *zColl = p->pTab->aCol[j].zColl; |
| 145 pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); | 145 pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); |
| 146 } | 146 } |
| 147 break; | 147 break; |
| 148 } | 148 } |
| 149 if( p->flags & EP_Collate ){ | 149 if( p->flags & EP_Collate ){ |
| 150 if( ALWAYS(p->pLeft) && (p->pLeft->flags & EP_Collate)!=0 ){ | 150 if( p->pLeft && (p->pLeft->flags & EP_Collate)!=0 ){ |
| 151 p = p->pLeft; | 151 p = p->pLeft; |
| 152 }else{ | 152 }else{ |
| 153 p = p->pRight; | 153 Expr *pNext = p->pRight; |
| 154 /* The Expr.x union is never used at the same time as Expr.pRight */ |
| 155 assert( p->x.pList==0 || p->pRight==0 ); |
| 156 /* p->flags holds EP_Collate and p->pLeft->flags does not. And |
| 157 ** p->x.pSelect cannot. So if p->x.pLeft exists, it must hold at |
| 158 ** least one EP_Collate. Thus the following two ALWAYS. */ |
| 159 if( p->x.pList!=0 && ALWAYS(!ExprHasProperty(p, EP_xIsSelect)) ){ |
| 160 int i; |
| 161 for(i=0; ALWAYS(i<p->x.pList->nExpr); i++){ |
| 162 if( ExprHasProperty(p->x.pList->a[i].pExpr, EP_Collate) ){ |
| 163 pNext = p->x.pList->a[i].pExpr; |
| 164 break; |
| 165 } |
| 166 } |
| 167 } |
| 168 p = pNext; |
| 154 } | 169 } |
| 155 }else{ | 170 }else{ |
| 156 break; | 171 break; |
| 157 } | 172 } |
| 158 } | 173 } |
| 159 if( sqlite3CheckCollSeq(pParse, pColl) ){ | 174 if( sqlite3CheckCollSeq(pParse, pColl) ){ |
| 160 pColl = 0; | 175 pColl = 0; |
| 161 } | 176 } |
| 162 return pColl; | 177 return pColl; |
| 163 } | 178 } |
| 164 | 179 |
| 165 /* | 180 /* |
| 166 ** pExpr is an operand of a comparison operator. aff2 is the | 181 ** pExpr is an operand of a comparison operator. aff2 is the |
| 167 ** type affinity of the other operand. This routine returns the | 182 ** type affinity of the other operand. This routine returns the |
| 168 ** type affinity that should be used for the comparison operator. | 183 ** type affinity that should be used for the comparison operator. |
| 169 */ | 184 */ |
| 170 char sqlite3CompareAffinity(Expr *pExpr, char aff2){ | 185 char sqlite3CompareAffinity(Expr *pExpr, char aff2){ |
| 171 char aff1 = sqlite3ExprAffinity(pExpr); | 186 char aff1 = sqlite3ExprAffinity(pExpr); |
| 172 if( aff1 && aff2 ){ | 187 if( aff1 && aff2 ){ |
| 173 /* Both sides of the comparison are columns. If one has numeric | 188 /* Both sides of the comparison are columns. If one has numeric |
| 174 ** affinity, use that. Otherwise use no affinity. | 189 ** affinity, use that. Otherwise use no affinity. |
| 175 */ | 190 */ |
| 176 if( sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2) ){ | 191 if( sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2) ){ |
| 177 return SQLITE_AFF_NUMERIC; | 192 return SQLITE_AFF_NUMERIC; |
| 178 }else{ | 193 }else{ |
| 179 return SQLITE_AFF_NONE; | 194 return SQLITE_AFF_BLOB; |
| 180 } | 195 } |
| 181 }else if( !aff1 && !aff2 ){ | 196 }else if( !aff1 && !aff2 ){ |
| 182 /* Neither side of the comparison is a column. Compare the | 197 /* Neither side of the comparison is a column. Compare the |
| 183 ** results directly. | 198 ** results directly. |
| 184 */ | 199 */ |
| 185 return SQLITE_AFF_NONE; | 200 return SQLITE_AFF_BLOB; |
| 186 }else{ | 201 }else{ |
| 187 /* One side is a column, the other is not. Use the columns affinity. */ | 202 /* One side is a column, the other is not. Use the columns affinity. */ |
| 188 assert( aff1==0 || aff2==0 ); | 203 assert( aff1==0 || aff2==0 ); |
| 189 return (aff1 + aff2); | 204 return (aff1 + aff2); |
| 190 } | 205 } |
| 191 } | 206 } |
| 192 | 207 |
| 193 /* | 208 /* |
| 194 ** pExpr is a comparison operator. Return the type affinity that should | 209 ** pExpr is a comparison operator. Return the type affinity that should |
| 195 ** be applied to both operands prior to doing the comparison. | 210 ** be applied to both operands prior to doing the comparison. |
| 196 */ | 211 */ |
| 197 static char comparisonAffinity(Expr *pExpr){ | 212 static char comparisonAffinity(Expr *pExpr){ |
| 198 char aff; | 213 char aff; |
| 199 assert( pExpr->op==TK_EQ || pExpr->op==TK_IN || pExpr->op==TK_LT || | 214 assert( pExpr->op==TK_EQ || pExpr->op==TK_IN || pExpr->op==TK_LT || |
| 200 pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE || | 215 pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE || |
| 201 pExpr->op==TK_NE || pExpr->op==TK_IS || pExpr->op==TK_ISNOT ); | 216 pExpr->op==TK_NE || pExpr->op==TK_IS || pExpr->op==TK_ISNOT ); |
| 202 assert( pExpr->pLeft ); | 217 assert( pExpr->pLeft ); |
| 203 aff = sqlite3ExprAffinity(pExpr->pLeft); | 218 aff = sqlite3ExprAffinity(pExpr->pLeft); |
| 204 if( pExpr->pRight ){ | 219 if( pExpr->pRight ){ |
| 205 aff = sqlite3CompareAffinity(pExpr->pRight, aff); | 220 aff = sqlite3CompareAffinity(pExpr->pRight, aff); |
| 206 }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ | 221 }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ |
| 207 aff = sqlite3CompareAffinity(pExpr->x.pSelect->pEList->a[0].pExpr, aff); | 222 aff = sqlite3CompareAffinity(pExpr->x.pSelect->pEList->a[0].pExpr, aff); |
| 208 }else if( !aff ){ | 223 }else if( !aff ){ |
| 209 aff = SQLITE_AFF_NONE; | 224 aff = SQLITE_AFF_BLOB; |
| 210 } | 225 } |
| 211 return aff; | 226 return aff; |
| 212 } | 227 } |
| 213 | 228 |
| 214 /* | 229 /* |
| 215 ** pExpr is a comparison expression, eg. '=', '<', IN(...) etc. | 230 ** pExpr is a comparison expression, eg. '=', '<', IN(...) etc. |
| 216 ** idx_affinity is the affinity of an indexed column. Return true | 231 ** idx_affinity is the affinity of an indexed column. Return true |
| 217 ** if the index with affinity idx_affinity may be used to implement | 232 ** if the index with affinity idx_affinity may be used to implement |
| 218 ** the comparison in pExpr. | 233 ** the comparison in pExpr. |
| 219 */ | 234 */ |
| 220 int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){ | 235 int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){ |
| 221 char aff = comparisonAffinity(pExpr); | 236 char aff = comparisonAffinity(pExpr); |
| 222 switch( aff ){ | 237 switch( aff ){ |
| 223 case SQLITE_AFF_NONE: | 238 case SQLITE_AFF_BLOB: |
| 224 return 1; | 239 return 1; |
| 225 case SQLITE_AFF_TEXT: | 240 case SQLITE_AFF_TEXT: |
| 226 return idx_affinity==SQLITE_AFF_TEXT; | 241 return idx_affinity==SQLITE_AFF_TEXT; |
| 227 default: | 242 default: |
| 228 return sqlite3IsNumericAffinity(idx_affinity); | 243 return sqlite3IsNumericAffinity(idx_affinity); |
| 229 } | 244 } |
| 230 } | 245 } |
| 231 | 246 |
| 232 /* | 247 /* |
| 233 ** Return the P5 value that should be used for a binary comparison | 248 ** Return the P5 value that should be used for a binary comparison |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 heightOfSelect(p->pPrior, pnHeight); | 364 heightOfSelect(p->pPrior, pnHeight); |
| 350 } | 365 } |
| 351 } | 366 } |
| 352 | 367 |
| 353 /* | 368 /* |
| 354 ** Set the Expr.nHeight variable in the structure passed as an | 369 ** Set the Expr.nHeight variable in the structure passed as an |
| 355 ** argument. An expression with no children, Expr.pList or | 370 ** argument. An expression with no children, Expr.pList or |
| 356 ** Expr.pSelect member has a height of 1. Any other expression | 371 ** Expr.pSelect member has a height of 1. Any other expression |
| 357 ** has a height equal to the maximum height of any other | 372 ** has a height equal to the maximum height of any other |
| 358 ** referenced Expr plus one. | 373 ** referenced Expr plus one. |
| 374 ** |
| 375 ** Also propagate EP_Propagate flags up from Expr.x.pList to Expr.flags, |
| 376 ** if appropriate. |
| 359 */ | 377 */ |
| 360 static void exprSetHeight(Expr *p){ | 378 static void exprSetHeight(Expr *p){ |
| 361 int nHeight = 0; | 379 int nHeight = 0; |
| 362 heightOfExpr(p->pLeft, &nHeight); | 380 heightOfExpr(p->pLeft, &nHeight); |
| 363 heightOfExpr(p->pRight, &nHeight); | 381 heightOfExpr(p->pRight, &nHeight); |
| 364 if( ExprHasProperty(p, EP_xIsSelect) ){ | 382 if( ExprHasProperty(p, EP_xIsSelect) ){ |
| 365 heightOfSelect(p->x.pSelect, &nHeight); | 383 heightOfSelect(p->x.pSelect, &nHeight); |
| 366 }else{ | 384 }else if( p->x.pList ){ |
| 367 heightOfExprList(p->x.pList, &nHeight); | 385 heightOfExprList(p->x.pList, &nHeight); |
| 386 p->flags |= EP_Propagate & sqlite3ExprListFlags(p->x.pList); |
| 368 } | 387 } |
| 369 p->nHeight = nHeight + 1; | 388 p->nHeight = nHeight + 1; |
| 370 } | 389 } |
| 371 | 390 |
| 372 /* | 391 /* |
| 373 ** Set the Expr.nHeight variable using the exprSetHeight() function. If | 392 ** Set the Expr.nHeight variable using the exprSetHeight() function. If |
| 374 ** the height is greater than the maximum allowed expression depth, | 393 ** the height is greater than the maximum allowed expression depth, |
| 375 ** leave an error in pParse. | 394 ** leave an error in pParse. |
| 395 ** |
| 396 ** Also propagate all EP_Propagate flags from the Expr.x.pList into |
| 397 ** Expr.flags. |
| 376 */ | 398 */ |
| 377 void sqlite3ExprSetHeight(Parse *pParse, Expr *p){ | 399 void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ |
| 400 if( pParse->nErr ) return; |
| 378 exprSetHeight(p); | 401 exprSetHeight(p); |
| 379 sqlite3ExprCheckHeight(pParse, p->nHeight); | 402 sqlite3ExprCheckHeight(pParse, p->nHeight); |
| 380 } | 403 } |
| 381 | 404 |
| 382 /* | 405 /* |
| 383 ** Return the maximum height of any expression tree referenced | 406 ** Return the maximum height of any expression tree referenced |
| 384 ** by the select statement passed as an argument. | 407 ** by the select statement passed as an argument. |
| 385 */ | 408 */ |
| 386 int sqlite3SelectExprHeight(Select *p){ | 409 int sqlite3SelectExprHeight(Select *p){ |
| 387 int nHeight = 0; | 410 int nHeight = 0; |
| 388 heightOfSelect(p, &nHeight); | 411 heightOfSelect(p, &nHeight); |
| 389 return nHeight; | 412 return nHeight; |
| 390 } | 413 } |
| 391 #else | 414 #else /* ABOVE: Height enforcement enabled. BELOW: Height enforcement off */ |
| 392 #define exprSetHeight(y) | 415 /* |
| 416 ** Propagate all EP_Propagate flags from the Expr.x.pList into |
| 417 ** Expr.flags. |
| 418 */ |
| 419 void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ |
| 420 if( p && p->x.pList && !ExprHasProperty(p, EP_xIsSelect) ){ |
| 421 p->flags |= EP_Propagate & sqlite3ExprListFlags(p->x.pList); |
| 422 } |
| 423 } |
| 424 #define exprSetHeight(y) |
| 393 #endif /* SQLITE_MAX_EXPR_DEPTH>0 */ | 425 #endif /* SQLITE_MAX_EXPR_DEPTH>0 */ |
| 394 | 426 |
| 395 /* | 427 /* |
| 396 ** This routine is the core allocator for Expr nodes. | 428 ** This routine is the core allocator for Expr nodes. |
| 397 ** | 429 ** |
| 398 ** Construct a new expression node and return a pointer to it. Memory | 430 ** Construct a new expression node and return a pointer to it. Memory |
| 399 ** for this node and for the pToken argument is a single allocation | 431 ** for this node and for the pToken argument is a single allocation |
| 400 ** obtained from sqlite3DbMalloc(). The calling function | 432 ** obtained from sqlite3DbMalloc(). The calling function |
| 401 ** is responsible for making sure the node eventually gets freed. | 433 ** is responsible for making sure the node eventually gets freed. |
| 402 ** | 434 ** |
| 403 ** If dequote is true, then the token (if it exists) is dequoted. | 435 ** If dequote is true, then the token (if it exists) is dequoted. |
| 404 ** If dequote is false, no dequoting is performance. The deQuote | 436 ** If dequote is false, no dequoting is performed. The deQuote |
| 405 ** parameter is ignored if pToken is NULL or if the token does not | 437 ** parameter is ignored if pToken is NULL or if the token does not |
| 406 ** appear to be quoted. If the quotes were of the form "..." (double-quotes) | 438 ** appear to be quoted. If the quotes were of the form "..." (double-quotes) |
| 407 ** then the EP_DblQuoted flag is set on the expression node. | 439 ** then the EP_DblQuoted flag is set on the expression node. |
| 408 ** | 440 ** |
| 409 ** Special case: If op==TK_INTEGER and pToken points to a string that | 441 ** Special case: If op==TK_INTEGER and pToken points to a string that |
| 410 ** can be translated into a 32-bit integer, then the token is not | 442 ** can be translated into a 32-bit integer, then the token is not |
| 411 ** stored in u.zToken. Instead, the integer values is written | 443 ** stored in u.zToken. Instead, the integer values is written |
| 412 ** into u.iValue and the EP_IntValue flag is set. No extra storage | 444 ** into u.iValue and the EP_IntValue flag is set. No extra storage |
| 413 ** is allocated to hold the integer text and the dequote flag is ignored. | 445 ** is allocated to hold the integer text and the dequote flag is ignored. |
| 414 */ | 446 */ |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 Expr *pLeft, | 516 Expr *pLeft, |
| 485 Expr *pRight | 517 Expr *pRight |
| 486 ){ | 518 ){ |
| 487 if( pRoot==0 ){ | 519 if( pRoot==0 ){ |
| 488 assert( db->mallocFailed ); | 520 assert( db->mallocFailed ); |
| 489 sqlite3ExprDelete(db, pLeft); | 521 sqlite3ExprDelete(db, pLeft); |
| 490 sqlite3ExprDelete(db, pRight); | 522 sqlite3ExprDelete(db, pRight); |
| 491 }else{ | 523 }else{ |
| 492 if( pRight ){ | 524 if( pRight ){ |
| 493 pRoot->pRight = pRight; | 525 pRoot->pRight = pRight; |
| 494 pRoot->flags |= EP_Collate & pRight->flags; | 526 pRoot->flags |= EP_Propagate & pRight->flags; |
| 495 } | 527 } |
| 496 if( pLeft ){ | 528 if( pLeft ){ |
| 497 pRoot->pLeft = pLeft; | 529 pRoot->pLeft = pLeft; |
| 498 pRoot->flags |= EP_Collate & pLeft->flags; | 530 pRoot->flags |= EP_Propagate & pLeft->flags; |
| 499 } | 531 } |
| 500 exprSetHeight(pRoot); | 532 exprSetHeight(pRoot); |
| 501 } | 533 } |
| 502 } | 534 } |
| 503 | 535 |
| 504 /* | 536 /* |
| 505 ** Allocate an Expr node which joins as many as two subtrees. | 537 ** Allocate an Expr node which joins as many as two subtrees. |
| 506 ** | 538 ** |
| 507 ** One or both of the subtrees can be NULL. Return a pointer to the new | 539 ** One or both of the subtrees can be NULL. Return a pointer to the new |
| 508 ** Expr node. Or, if an OOM error occurs, set pParse->db->mallocFailed, | 540 ** Expr node. Or, if an OOM error occurs, set pParse->db->mallocFailed, |
| 509 ** free the subtrees and return NULL. | 541 ** free the subtrees and return NULL. |
| 510 */ | 542 */ |
| 511 Expr *sqlite3PExpr( | 543 Expr *sqlite3PExpr( |
| 512 Parse *pParse, /* Parsing context */ | 544 Parse *pParse, /* Parsing context */ |
| 513 int op, /* Expression opcode */ | 545 int op, /* Expression opcode */ |
| 514 Expr *pLeft, /* Left operand */ | 546 Expr *pLeft, /* Left operand */ |
| 515 Expr *pRight, /* Right operand */ | 547 Expr *pRight, /* Right operand */ |
| 516 const Token *pToken /* Argument token */ | 548 const Token *pToken /* Argument token */ |
| 517 ){ | 549 ){ |
| 518 Expr *p; | 550 Expr *p; |
| 519 if( op==TK_AND && pLeft && pRight ){ | 551 if( op==TK_AND && pParse->nErr==0 ){ |
| 520 /* Take advantage of short-circuit false optimization for AND */ | 552 /* Take advantage of short-circuit false optimization for AND */ |
| 521 p = sqlite3ExprAnd(pParse->db, pLeft, pRight); | 553 p = sqlite3ExprAnd(pParse->db, pLeft, pRight); |
| 522 }else{ | 554 }else{ |
| 523 p = sqlite3ExprAlloc(pParse->db, op, pToken, 1); | 555 p = sqlite3ExprAlloc(pParse->db, op & TKFLG_MASK, pToken, 1); |
| 524 sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight); | 556 sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight); |
| 525 } | 557 } |
| 526 if( p ) { | 558 if( p ) { |
| 527 sqlite3ExprCheckHeight(pParse, p->nHeight); | 559 sqlite3ExprCheckHeight(pParse, p->nHeight); |
| 528 } | 560 } |
| 529 return p; | 561 return p; |
| 530 } | 562 } |
| 531 | 563 |
| 532 /* | 564 /* |
| 533 ** If the expression is always either TRUE or FALSE (respectively), | 565 ** If the expression is always either TRUE or FALSE (respectively), |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 588 Expr *pNew; | 620 Expr *pNew; |
| 589 sqlite3 *db = pParse->db; | 621 sqlite3 *db = pParse->db; |
| 590 assert( pToken ); | 622 assert( pToken ); |
| 591 pNew = sqlite3ExprAlloc(db, TK_FUNCTION, pToken, 1); | 623 pNew = sqlite3ExprAlloc(db, TK_FUNCTION, pToken, 1); |
| 592 if( pNew==0 ){ | 624 if( pNew==0 ){ |
| 593 sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */ | 625 sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */ |
| 594 return 0; | 626 return 0; |
| 595 } | 627 } |
| 596 pNew->x.pList = pList; | 628 pNew->x.pList = pList; |
| 597 assert( !ExprHasProperty(pNew, EP_xIsSelect) ); | 629 assert( !ExprHasProperty(pNew, EP_xIsSelect) ); |
| 598 sqlite3ExprSetHeight(pParse, pNew); | 630 sqlite3ExprSetHeightAndFlags(pParse, pNew); |
| 599 return pNew; | 631 return pNew; |
| 600 } | 632 } |
| 601 | 633 |
| 602 /* | 634 /* |
| 603 ** Assign a variable number to an expression that encodes a wildcard | 635 ** Assign a variable number to an expression that encodes a wildcard |
| 604 ** in the original SQL statement. | 636 ** in the original SQL statement. |
| 605 ** | 637 ** |
| 606 ** Wildcards consisting of a single "?" are assigned the next sequential | 638 ** Wildcards consisting of a single "?" are assigned the next sequential |
| 607 ** variable number. | 639 ** variable number. |
| 608 ** | 640 ** |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 /* | 846 /* |
| 815 ** This function is similar to sqlite3ExprDup(), except that if pzBuffer | 847 ** This function is similar to sqlite3ExprDup(), except that if pzBuffer |
| 816 ** is not NULL then *pzBuffer is assumed to point to a buffer large enough | 848 ** is not NULL then *pzBuffer is assumed to point to a buffer large enough |
| 817 ** to store the copy of expression p, the copies of p->u.zToken | 849 ** to store the copy of expression p, the copies of p->u.zToken |
| 818 ** (if applicable), and the copies of the p->pLeft and p->pRight expressions, | 850 ** (if applicable), and the copies of the p->pLeft and p->pRight expressions, |
| 819 ** if any. Before returning, *pzBuffer is set to the first byte past the | 851 ** if any. Before returning, *pzBuffer is set to the first byte past the |
| 820 ** portion of the buffer copied into by this function. | 852 ** portion of the buffer copied into by this function. |
| 821 */ | 853 */ |
| 822 static Expr *exprDup(sqlite3 *db, Expr *p, int flags, u8 **pzBuffer){ | 854 static Expr *exprDup(sqlite3 *db, Expr *p, int flags, u8 **pzBuffer){ |
| 823 Expr *pNew = 0; /* Value to return */ | 855 Expr *pNew = 0; /* Value to return */ |
| 856 assert( flags==0 || flags==EXPRDUP_REDUCE ); |
| 824 if( p ){ | 857 if( p ){ |
| 825 const int isReduced = (flags&EXPRDUP_REDUCE); | 858 const int isReduced = (flags&EXPRDUP_REDUCE); |
| 826 u8 *zAlloc; | 859 u8 *zAlloc; |
| 827 u32 staticFlag = 0; | 860 u32 staticFlag = 0; |
| 828 | 861 |
| 829 assert( pzBuffer==0 || isReduced ); | 862 assert( pzBuffer==0 || isReduced ); |
| 830 | 863 |
| 831 /* Figure out where to write the new Expr structure. */ | 864 /* Figure out where to write the new Expr structure. */ |
| 832 if( pzBuffer ){ | 865 if( pzBuffer ){ |
| 833 zAlloc = *pzBuffer; | 866 zAlloc = *pzBuffer; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 848 int nToken; | 881 int nToken; |
| 849 if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ | 882 if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ |
| 850 nToken = sqlite3Strlen30(p->u.zToken) + 1; | 883 nToken = sqlite3Strlen30(p->u.zToken) + 1; |
| 851 }else{ | 884 }else{ |
| 852 nToken = 0; | 885 nToken = 0; |
| 853 } | 886 } |
| 854 if( isReduced ){ | 887 if( isReduced ){ |
| 855 assert( ExprHasProperty(p, EP_Reduced)==0 ); | 888 assert( ExprHasProperty(p, EP_Reduced)==0 ); |
| 856 memcpy(zAlloc, p, nNewSize); | 889 memcpy(zAlloc, p, nNewSize); |
| 857 }else{ | 890 }else{ |
| 858 int nSize = exprStructSize(p); | 891 u32 nSize = (u32)exprStructSize(p); |
| 859 memcpy(zAlloc, p, nSize); | 892 memcpy(zAlloc, p, nSize); |
| 860 if( EXPR_FULLSIZE>nSize ){ | 893 if( nSize<EXPR_FULLSIZE ){ |
| 861 memset(&zAlloc[nSize], 0, EXPR_FULLSIZE-nSize); | 894 memset(&zAlloc[nSize], 0, EXPR_FULLSIZE-nSize); |
| 862 } | 895 } |
| 863 } | 896 } |
| 864 | 897 |
| 865 /* Set the EP_Reduced, EP_TokenOnly, and EP_Static flags appropriately. */ | 898 /* Set the EP_Reduced, EP_TokenOnly, and EP_Static flags appropriately. */ |
| 866 pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_Static|EP_MemToken); | 899 pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_Static|EP_MemToken); |
| 867 pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly); | 900 pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly); |
| 868 pNew->flags |= staticFlag; | 901 pNew->flags |= staticFlag; |
| 869 | 902 |
| 870 /* Copy the p->u.zToken string, if any. */ | 903 /* Copy the p->u.zToken string, if any. */ |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 942 ** by subsequent calls to sqlite*ListAppend() routines. | 975 ** by subsequent calls to sqlite*ListAppend() routines. |
| 943 ** | 976 ** |
| 944 ** Any tables that the SrcList might point to are not duplicated. | 977 ** Any tables that the SrcList might point to are not duplicated. |
| 945 ** | 978 ** |
| 946 ** The flags parameter contains a combination of the EXPRDUP_XXX flags. | 979 ** The flags parameter contains a combination of the EXPRDUP_XXX flags. |
| 947 ** If the EXPRDUP_REDUCE flag is set, then the structure returned is a | 980 ** If the EXPRDUP_REDUCE flag is set, then the structure returned is a |
| 948 ** truncated version of the usual Expr structure that will be stored as | 981 ** truncated version of the usual Expr structure that will be stored as |
| 949 ** part of the in-memory representation of the database schema. | 982 ** part of the in-memory representation of the database schema. |
| 950 */ | 983 */ |
| 951 Expr *sqlite3ExprDup(sqlite3 *db, Expr *p, int flags){ | 984 Expr *sqlite3ExprDup(sqlite3 *db, Expr *p, int flags){ |
| 985 assert( flags==0 || flags==EXPRDUP_REDUCE ); |
| 952 return exprDup(db, p, flags, 0); | 986 return exprDup(db, p, flags, 0); |
| 953 } | 987 } |
| 954 ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ | 988 ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ |
| 955 ExprList *pNew; | 989 ExprList *pNew; |
| 956 struct ExprList_item *pItem, *pOldItem; | 990 struct ExprList_item *pItem, *pOldItem; |
| 957 int i; | 991 int i; |
| 958 if( p==0 ) return 0; | 992 if( p==0 ) return 0; |
| 959 pNew = sqlite3DbMallocRaw(db, sizeof(*pNew) ); | 993 pNew = sqlite3DbMallocRaw(db, sizeof(*pNew) ); |
| 960 if( pNew==0 ) return 0; | 994 if( pNew==0 ) return 0; |
| 961 pNew->nExpr = i = p->nExpr; | 995 pNew->nExpr = i = p->nExpr; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 997 if( pNew==0 ) return 0; | 1031 if( pNew==0 ) return 0; |
| 998 pNew->nSrc = pNew->nAlloc = p->nSrc; | 1032 pNew->nSrc = pNew->nAlloc = p->nSrc; |
| 999 for(i=0; i<p->nSrc; i++){ | 1033 for(i=0; i<p->nSrc; i++){ |
| 1000 struct SrcList_item *pNewItem = &pNew->a[i]; | 1034 struct SrcList_item *pNewItem = &pNew->a[i]; |
| 1001 struct SrcList_item *pOldItem = &p->a[i]; | 1035 struct SrcList_item *pOldItem = &p->a[i]; |
| 1002 Table *pTab; | 1036 Table *pTab; |
| 1003 pNewItem->pSchema = pOldItem->pSchema; | 1037 pNewItem->pSchema = pOldItem->pSchema; |
| 1004 pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase); | 1038 pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase); |
| 1005 pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); | 1039 pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); |
| 1006 pNewItem->zAlias = sqlite3DbStrDup(db, pOldItem->zAlias); | 1040 pNewItem->zAlias = sqlite3DbStrDup(db, pOldItem->zAlias); |
| 1007 pNewItem->jointype = pOldItem->jointype; | 1041 pNewItem->fg = pOldItem->fg; |
| 1008 pNewItem->iCursor = pOldItem->iCursor; | 1042 pNewItem->iCursor = pOldItem->iCursor; |
| 1009 pNewItem->addrFillSub = pOldItem->addrFillSub; | 1043 pNewItem->addrFillSub = pOldItem->addrFillSub; |
| 1010 pNewItem->regReturn = pOldItem->regReturn; | 1044 pNewItem->regReturn = pOldItem->regReturn; |
| 1011 pNewItem->isCorrelated = pOldItem->isCorrelated; | 1045 if( pNewItem->fg.isIndexedBy ){ |
| 1012 pNewItem->viaCoroutine = pOldItem->viaCoroutine; | 1046 pNewItem->u1.zIndexedBy = sqlite3DbStrDup(db, pOldItem->u1.zIndexedBy); |
| 1013 pNewItem->isRecursive = pOldItem->isRecursive; | 1047 } |
| 1014 pNewItem->zIndex = sqlite3DbStrDup(db, pOldItem->zIndex); | 1048 pNewItem->pIBIndex = pOldItem->pIBIndex; |
| 1015 pNewItem->notIndexed = pOldItem->notIndexed; | 1049 if( pNewItem->fg.isTabFunc ){ |
| 1016 pNewItem->pIndex = pOldItem->pIndex; | 1050 pNewItem->u1.pFuncArg = |
| 1051 sqlite3ExprListDup(db, pOldItem->u1.pFuncArg, flags); |
| 1052 } |
| 1017 pTab = pNewItem->pTab = pOldItem->pTab; | 1053 pTab = pNewItem->pTab = pOldItem->pTab; |
| 1018 if( pTab ){ | 1054 if( pTab ){ |
| 1019 pTab->nRef++; | 1055 pTab->nRef++; |
| 1020 } | 1056 } |
| 1021 pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags); | 1057 pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags); |
| 1022 pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn, flags); | 1058 pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn, flags); |
| 1023 pNewItem->pUsing = sqlite3IdListDup(db, pOldItem->pUsing); | 1059 pNewItem->pUsing = sqlite3IdListDup(db, pOldItem->pUsing); |
| 1024 pNewItem->colUsed = pOldItem->colUsed; | 1060 pNewItem->colUsed = pOldItem->colUsed; |
| 1025 } | 1061 } |
| 1026 return pNew; | 1062 return pNew; |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1122 return pList; | 1158 return pList; |
| 1123 | 1159 |
| 1124 no_mem: | 1160 no_mem: |
| 1125 /* Avoid leaking memory if malloc has failed. */ | 1161 /* Avoid leaking memory if malloc has failed. */ |
| 1126 sqlite3ExprDelete(db, pExpr); | 1162 sqlite3ExprDelete(db, pExpr); |
| 1127 sqlite3ExprListDelete(db, pList); | 1163 sqlite3ExprListDelete(db, pList); |
| 1128 return 0; | 1164 return 0; |
| 1129 } | 1165 } |
| 1130 | 1166 |
| 1131 /* | 1167 /* |
| 1168 ** Set the sort order for the last element on the given ExprList. |
| 1169 */ |
| 1170 void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder){ |
| 1171 if( p==0 ) return; |
| 1172 assert( SQLITE_SO_UNDEFINED<0 && SQLITE_SO_ASC>=0 && SQLITE_SO_DESC>0 ); |
| 1173 assert( p->nExpr>0 ); |
| 1174 if( iSortOrder<0 ){ |
| 1175 assert( p->a[p->nExpr-1].sortOrder==SQLITE_SO_ASC ); |
| 1176 return; |
| 1177 } |
| 1178 p->a[p->nExpr-1].sortOrder = (u8)iSortOrder; |
| 1179 } |
| 1180 |
| 1181 /* |
| 1132 ** Set the ExprList.a[].zName element of the most recently added item | 1182 ** Set the ExprList.a[].zName element of the most recently added item |
| 1133 ** on the expression list. | 1183 ** on the expression list. |
| 1134 ** | 1184 ** |
| 1135 ** pList might be NULL following an OOM error. But pName should never be | 1185 ** pList might be NULL following an OOM error. But pName should never be |
| 1136 ** NULL. If a memory allocation fails, the pParse->db->mallocFailed flag | 1186 ** NULL. If a memory allocation fails, the pParse->db->mallocFailed flag |
| 1137 ** is set. | 1187 ** is set. |
| 1138 */ | 1188 */ |
| 1139 void sqlite3ExprListSetName( | 1189 void sqlite3ExprListSetName( |
| 1140 Parse *pParse, /* Parsing context */ | 1190 Parse *pParse, /* Parsing context */ |
| 1141 ExprList *pList, /* List to which to add the span. */ | 1191 ExprList *pList, /* List to which to add the span. */ |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1206 for(pItem=pList->a, i=0; i<pList->nExpr; i++, pItem++){ | 1256 for(pItem=pList->a, i=0; i<pList->nExpr; i++, pItem++){ |
| 1207 sqlite3ExprDelete(db, pItem->pExpr); | 1257 sqlite3ExprDelete(db, pItem->pExpr); |
| 1208 sqlite3DbFree(db, pItem->zName); | 1258 sqlite3DbFree(db, pItem->zName); |
| 1209 sqlite3DbFree(db, pItem->zSpan); | 1259 sqlite3DbFree(db, pItem->zSpan); |
| 1210 } | 1260 } |
| 1211 sqlite3DbFree(db, pList->a); | 1261 sqlite3DbFree(db, pList->a); |
| 1212 sqlite3DbFree(db, pList); | 1262 sqlite3DbFree(db, pList); |
| 1213 } | 1263 } |
| 1214 | 1264 |
| 1215 /* | 1265 /* |
| 1216 ** These routines are Walker callbacks. Walker.u.pi is a pointer | 1266 ** Return the bitwise-OR of all Expr.flags fields in the given |
| 1217 ** to an integer. These routines are checking an expression to see | 1267 ** ExprList. |
| 1218 ** if it is a constant. Set *Walker.u.i to 0 if the expression is | 1268 */ |
| 1219 ** not constant. | 1269 u32 sqlite3ExprListFlags(const ExprList *pList){ |
| 1270 int i; |
| 1271 u32 m = 0; |
| 1272 if( pList ){ |
| 1273 for(i=0; i<pList->nExpr; i++){ |
| 1274 Expr *pExpr = pList->a[i].pExpr; |
| 1275 if( ALWAYS(pExpr) ) m |= pExpr->flags; |
| 1276 } |
| 1277 } |
| 1278 return m; |
| 1279 } |
| 1280 |
| 1281 /* |
| 1282 ** These routines are Walker callbacks used to check expressions to |
| 1283 ** see if they are "constant" for some definition of constant. The |
| 1284 ** Walker.eCode value determines the type of "constant" we are looking |
| 1285 ** for. |
| 1220 ** | 1286 ** |
| 1221 ** These callback routines are used to implement the following: | 1287 ** These callback routines are used to implement the following: |
| 1222 ** | 1288 ** |
| 1223 ** sqlite3ExprIsConstant() pWalker->u.i==1 | 1289 ** sqlite3ExprIsConstant() pWalker->eCode==1 |
| 1224 ** sqlite3ExprIsConstantNotJoin() pWalker->u.i==2 | 1290 ** sqlite3ExprIsConstantNotJoin() pWalker->eCode==2 |
| 1225 ** sqlite3ExprIsConstantOrFunction() pWalker->u.i==3 or 4 | 1291 ** sqlite3ExprIsTableConstant() pWalker->eCode==3 |
| 1292 ** sqlite3ExprIsConstantOrFunction() pWalker->eCode==4 or 5 |
| 1293 ** |
| 1294 ** In all cases, the callbacks set Walker.eCode=0 and abort if the expression |
| 1295 ** is found to not be a constant. |
| 1226 ** | 1296 ** |
| 1227 ** The sqlite3ExprIsConstantOrFunction() is used for evaluating expressions | 1297 ** The sqlite3ExprIsConstantOrFunction() is used for evaluating expressions |
| 1228 ** in a CREATE TABLE statement. The Walker.u.i value is 4 when parsing | 1298 ** in a CREATE TABLE statement. The Walker.eCode value is 5 when parsing |
| 1229 ** an existing schema and 3 when processing a new statement. A bound | 1299 ** an existing schema and 4 when processing a new statement. A bound |
| 1230 ** parameter raises an error for new statements, but is silently converted | 1300 ** parameter raises an error for new statements, but is silently converted |
| 1231 ** to NULL for existing schemas. This allows sqlite_master tables that | 1301 ** to NULL for existing schemas. This allows sqlite_master tables that |
| 1232 ** contain a bound parameter because they were generated by older versions | 1302 ** contain a bound parameter because they were generated by older versions |
| 1233 ** of SQLite to be parsed by newer versions of SQLite without raising a | 1303 ** of SQLite to be parsed by newer versions of SQLite without raising a |
| 1234 ** malformed schema error. | 1304 ** malformed schema error. |
| 1235 */ | 1305 */ |
| 1236 static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ | 1306 static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ |
| 1237 | 1307 |
| 1238 /* If pWalker->u.i is 2 then any term of the expression that comes from | 1308 /* If pWalker->eCode is 2 then any term of the expression that comes from |
| 1239 ** the ON or USING clauses of a join disqualifies the expression | 1309 ** the ON or USING clauses of a left join disqualifies the expression |
| 1240 ** from being considered constant. */ | 1310 ** from being considered constant. */ |
| 1241 if( pWalker->u.i==2 && ExprHasProperty(pExpr, EP_FromJoin) ){ | 1311 if( pWalker->eCode==2 && ExprHasProperty(pExpr, EP_FromJoin) ){ |
| 1242 pWalker->u.i = 0; | 1312 pWalker->eCode = 0; |
| 1243 return WRC_Abort; | 1313 return WRC_Abort; |
| 1244 } | 1314 } |
| 1245 | 1315 |
| 1246 switch( pExpr->op ){ | 1316 switch( pExpr->op ){ |
| 1247 /* Consider functions to be constant if all their arguments are constant | 1317 /* Consider functions to be constant if all their arguments are constant |
| 1248 ** and either pWalker->u.i==3 or 4 or the function as the SQLITE_FUNC_CONST | 1318 ** and either pWalker->eCode==4 or 5 or the function has the |
| 1249 ** flag. */ | 1319 ** SQLITE_FUNC_CONST flag. */ |
| 1250 case TK_FUNCTION: | 1320 case TK_FUNCTION: |
| 1251 if( pWalker->u.i>=3 || ExprHasProperty(pExpr,EP_Constant) ){ | 1321 if( pWalker->eCode>=4 || ExprHasProperty(pExpr,EP_ConstFunc) ){ |
| 1252 return WRC_Continue; | 1322 return WRC_Continue; |
| 1323 }else{ |
| 1324 pWalker->eCode = 0; |
| 1325 return WRC_Abort; |
| 1253 } | 1326 } |
| 1254 /* Fall through */ | |
| 1255 case TK_ID: | 1327 case TK_ID: |
| 1256 case TK_COLUMN: | 1328 case TK_COLUMN: |
| 1257 case TK_AGG_FUNCTION: | 1329 case TK_AGG_FUNCTION: |
| 1258 case TK_AGG_COLUMN: | 1330 case TK_AGG_COLUMN: |
| 1259 testcase( pExpr->op==TK_ID ); | 1331 testcase( pExpr->op==TK_ID ); |
| 1260 testcase( pExpr->op==TK_COLUMN ); | 1332 testcase( pExpr->op==TK_COLUMN ); |
| 1261 testcase( pExpr->op==TK_AGG_FUNCTION ); | 1333 testcase( pExpr->op==TK_AGG_FUNCTION ); |
| 1262 testcase( pExpr->op==TK_AGG_COLUMN ); | 1334 testcase( pExpr->op==TK_AGG_COLUMN ); |
| 1263 pWalker->u.i = 0; | 1335 if( pWalker->eCode==3 && pExpr->iTable==pWalker->u.iCur ){ |
| 1264 return WRC_Abort; | 1336 return WRC_Continue; |
| 1337 }else{ |
| 1338 pWalker->eCode = 0; |
| 1339 return WRC_Abort; |
| 1340 } |
| 1265 case TK_VARIABLE: | 1341 case TK_VARIABLE: |
| 1266 if( pWalker->u.i==4 ){ | 1342 if( pWalker->eCode==5 ){ |
| 1267 /* Silently convert bound parameters that appear inside of CREATE | 1343 /* Silently convert bound parameters that appear inside of CREATE |
| 1268 ** statements into a NULL when parsing the CREATE statement text out | 1344 ** statements into a NULL when parsing the CREATE statement text out |
| 1269 ** of the sqlite_master table */ | 1345 ** of the sqlite_master table */ |
| 1270 pExpr->op = TK_NULL; | 1346 pExpr->op = TK_NULL; |
| 1271 }else if( pWalker->u.i==3 ){ | 1347 }else if( pWalker->eCode==4 ){ |
| 1272 /* A bound parameter in a CREATE statement that originates from | 1348 /* A bound parameter in a CREATE statement that originates from |
| 1273 ** sqlite3_prepare() causes an error */ | 1349 ** sqlite3_prepare() causes an error */ |
| 1274 pWalker->u.i = 0; | 1350 pWalker->eCode = 0; |
| 1275 return WRC_Abort; | 1351 return WRC_Abort; |
| 1276 } | 1352 } |
| 1277 /* Fall through */ | 1353 /* Fall through */ |
| 1278 default: | 1354 default: |
| 1279 testcase( pExpr->op==TK_SELECT ); /* selectNodeIsConstant will disallow */ | 1355 testcase( pExpr->op==TK_SELECT ); /* selectNodeIsConstant will disallow */ |
| 1280 testcase( pExpr->op==TK_EXISTS ); /* selectNodeIsConstant will disallow */ | 1356 testcase( pExpr->op==TK_EXISTS ); /* selectNodeIsConstant will disallow */ |
| 1281 return WRC_Continue; | 1357 return WRC_Continue; |
| 1282 } | 1358 } |
| 1283 } | 1359 } |
| 1284 static int selectNodeIsConstant(Walker *pWalker, Select *NotUsed){ | 1360 static int selectNodeIsConstant(Walker *pWalker, Select *NotUsed){ |
| 1285 UNUSED_PARAMETER(NotUsed); | 1361 UNUSED_PARAMETER(NotUsed); |
| 1286 pWalker->u.i = 0; | 1362 pWalker->eCode = 0; |
| 1287 return WRC_Abort; | 1363 return WRC_Abort; |
| 1288 } | 1364 } |
| 1289 static int exprIsConst(Expr *p, int initFlag){ | 1365 static int exprIsConst(Expr *p, int initFlag, int iCur){ |
| 1290 Walker w; | 1366 Walker w; |
| 1291 memset(&w, 0, sizeof(w)); | 1367 memset(&w, 0, sizeof(w)); |
| 1292 w.u.i = initFlag; | 1368 w.eCode = initFlag; |
| 1293 w.xExprCallback = exprNodeIsConstant; | 1369 w.xExprCallback = exprNodeIsConstant; |
| 1294 w.xSelectCallback = selectNodeIsConstant; | 1370 w.xSelectCallback = selectNodeIsConstant; |
| 1371 w.u.iCur = iCur; |
| 1295 sqlite3WalkExpr(&w, p); | 1372 sqlite3WalkExpr(&w, p); |
| 1296 return w.u.i; | 1373 return w.eCode; |
| 1297 } | 1374 } |
| 1298 | 1375 |
| 1299 /* | 1376 /* |
| 1300 ** Walk an expression tree. Return 1 if the expression is constant | 1377 ** Walk an expression tree. Return non-zero if the expression is constant |
| 1301 ** and 0 if it involves variables or function calls. | 1378 ** and 0 if it involves variables or function calls. |
| 1302 ** | 1379 ** |
| 1303 ** For the purposes of this function, a double-quoted string (ex: "abc") | 1380 ** For the purposes of this function, a double-quoted string (ex: "abc") |
| 1304 ** is considered a variable but a single-quoted string (ex: 'abc') is | 1381 ** is considered a variable but a single-quoted string (ex: 'abc') is |
| 1305 ** a constant. | 1382 ** a constant. |
| 1306 */ | 1383 */ |
| 1307 int sqlite3ExprIsConstant(Expr *p){ | 1384 int sqlite3ExprIsConstant(Expr *p){ |
| 1308 return exprIsConst(p, 1); | 1385 return exprIsConst(p, 1, 0); |
| 1309 } | 1386 } |
| 1310 | 1387 |
| 1311 /* | 1388 /* |
| 1312 ** Walk an expression tree. Return 1 if the expression is constant | 1389 ** Walk an expression tree. Return non-zero if the expression is constant |
| 1313 ** that does no originate from the ON or USING clauses of a join. | 1390 ** that does no originate from the ON or USING clauses of a join. |
| 1314 ** Return 0 if it involves variables or function calls or terms from | 1391 ** Return 0 if it involves variables or function calls or terms from |
| 1315 ** an ON or USING clause. | 1392 ** an ON or USING clause. |
| 1316 */ | 1393 */ |
| 1317 int sqlite3ExprIsConstantNotJoin(Expr *p){ | 1394 int sqlite3ExprIsConstantNotJoin(Expr *p){ |
| 1318 return exprIsConst(p, 2); | 1395 return exprIsConst(p, 2, 0); |
| 1319 } | 1396 } |
| 1320 | 1397 |
| 1321 /* | 1398 /* |
| 1322 ** Walk an expression tree. Return 1 if the expression is constant | 1399 ** Walk an expression tree. Return non-zero if the expression is constant |
| 1400 ** for any single row of the table with cursor iCur. In other words, the |
| 1401 ** expression must not refer to any non-deterministic function nor any |
| 1402 ** table other than iCur. |
| 1403 */ |
| 1404 int sqlite3ExprIsTableConstant(Expr *p, int iCur){ |
| 1405 return exprIsConst(p, 3, iCur); |
| 1406 } |
| 1407 |
| 1408 /* |
| 1409 ** Walk an expression tree. Return non-zero if the expression is constant |
| 1323 ** or a function call with constant arguments. Return and 0 if there | 1410 ** or a function call with constant arguments. Return and 0 if there |
| 1324 ** are any variables. | 1411 ** are any variables. |
| 1325 ** | 1412 ** |
| 1326 ** For the purposes of this function, a double-quoted string (ex: "abc") | 1413 ** For the purposes of this function, a double-quoted string (ex: "abc") |
| 1327 ** is considered a variable but a single-quoted string (ex: 'abc') is | 1414 ** is considered a variable but a single-quoted string (ex: 'abc') is |
| 1328 ** a constant. | 1415 ** a constant. |
| 1329 */ | 1416 */ |
| 1330 int sqlite3ExprIsConstantOrFunction(Expr *p, u8 isInit){ | 1417 int sqlite3ExprIsConstantOrFunction(Expr *p, u8 isInit){ |
| 1331 assert( isInit==0 || isInit==1 ); | 1418 assert( isInit==0 || isInit==1 ); |
| 1332 return exprIsConst(p, 3+isInit); | 1419 return exprIsConst(p, 4+isInit, 0); |
| 1333 } | 1420 } |
| 1334 | 1421 |
| 1422 #ifdef SQLITE_ENABLE_CURSOR_HINTS |
| 1423 /* |
| 1424 ** Walk an expression tree. Return 1 if the expression contains a |
| 1425 ** subquery of some kind. Return 0 if there are no subqueries. |
| 1426 */ |
| 1427 int sqlite3ExprContainsSubquery(Expr *p){ |
| 1428 Walker w; |
| 1429 memset(&w, 0, sizeof(w)); |
| 1430 w.eCode = 1; |
| 1431 w.xExprCallback = sqlite3ExprWalkNoop; |
| 1432 w.xSelectCallback = selectNodeIsConstant; |
| 1433 sqlite3WalkExpr(&w, p); |
| 1434 return w.eCode==0; |
| 1435 } |
| 1436 #endif |
| 1437 |
| 1335 /* | 1438 /* |
| 1336 ** If the expression p codes a constant integer that is small enough | 1439 ** If the expression p codes a constant integer that is small enough |
| 1337 ** to fit in a 32-bit integer, return 1 and put the value of the integer | 1440 ** to fit in a 32-bit integer, return 1 and put the value of the integer |
| 1338 ** in *pValue. If the expression is not an integer or if it is too big | 1441 ** in *pValue. If the expression is not an integer or if it is too big |
| 1339 ** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged. | 1442 ** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged. |
| 1340 */ | 1443 */ |
| 1341 int sqlite3ExprIsInteger(Expr *p, int *pValue){ | 1444 int sqlite3ExprIsInteger(Expr *p, int *pValue){ |
| 1342 int rc = 0; | 1445 int rc = 0; |
| 1343 | 1446 |
| 1344 /* If an expression is an integer literal that fits in a signed 32-bit | 1447 /* If an expression is an integer literal that fits in a signed 32-bit |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1408 ** unchanged by OP_Affinity with the affinity given in the second | 1511 ** unchanged by OP_Affinity with the affinity given in the second |
| 1409 ** argument. | 1512 ** argument. |
| 1410 ** | 1513 ** |
| 1411 ** This routine is used to determine if the OP_Affinity operation | 1514 ** This routine is used to determine if the OP_Affinity operation |
| 1412 ** can be omitted. When in doubt return FALSE. A false negative | 1515 ** can be omitted. When in doubt return FALSE. A false negative |
| 1413 ** is harmless. A false positive, however, can result in the wrong | 1516 ** is harmless. A false positive, however, can result in the wrong |
| 1414 ** answer. | 1517 ** answer. |
| 1415 */ | 1518 */ |
| 1416 int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ | 1519 int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ |
| 1417 u8 op; | 1520 u8 op; |
| 1418 if( aff==SQLITE_AFF_NONE ) return 1; | 1521 if( aff==SQLITE_AFF_BLOB ) return 1; |
| 1419 while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } | 1522 while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } |
| 1420 op = p->op; | 1523 op = p->op; |
| 1421 if( op==TK_REGISTER ) op = p->op2; | 1524 if( op==TK_REGISTER ) op = p->op2; |
| 1422 switch( op ){ | 1525 switch( op ){ |
| 1423 case TK_INTEGER: { | 1526 case TK_INTEGER: { |
| 1424 return aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC; | 1527 return aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC; |
| 1425 } | 1528 } |
| 1426 case TK_FLOAT: { | 1529 case TK_FLOAT: { |
| 1427 return aff==SQLITE_AFF_REAL || aff==SQLITE_AFF_NUMERIC; | 1530 return aff==SQLITE_AFF_REAL || aff==SQLITE_AFF_NUMERIC; |
| 1428 } | 1531 } |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1505 return sqlite3VdbeAddOp1(v, OP_Once, pParse->nOnce++); | 1608 return sqlite3VdbeAddOp1(v, OP_Once, pParse->nOnce++); |
| 1506 } | 1609 } |
| 1507 | 1610 |
| 1508 /* | 1611 /* |
| 1509 ** Generate code that checks the left-most column of index table iCur to see if | 1612 ** Generate code that checks the left-most column of index table iCur to see if |
| 1510 ** it contains any NULL entries. Cause the register at regHasNull to be set | 1613 ** it contains any NULL entries. Cause the register at regHasNull to be set |
| 1511 ** to a non-NULL value if iCur contains no NULLs. Cause register regHasNull | 1614 ** to a non-NULL value if iCur contains no NULLs. Cause register regHasNull |
| 1512 ** to be set to NULL if iCur contains one or more NULL values. | 1615 ** to be set to NULL if iCur contains one or more NULL values. |
| 1513 */ | 1616 */ |
| 1514 static void sqlite3SetHasNullFlag(Vdbe *v, int iCur, int regHasNull){ | 1617 static void sqlite3SetHasNullFlag(Vdbe *v, int iCur, int regHasNull){ |
| 1515 int j1; | 1618 int addr1; |
| 1516 sqlite3VdbeAddOp2(v, OP_Integer, 0, regHasNull); | 1619 sqlite3VdbeAddOp2(v, OP_Integer, 0, regHasNull); |
| 1517 j1 = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); | 1620 addr1 = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); |
| 1518 sqlite3VdbeAddOp3(v, OP_Column, iCur, 0, regHasNull); | 1621 sqlite3VdbeAddOp3(v, OP_Column, iCur, 0, regHasNull); |
| 1519 sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); | 1622 sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); |
| 1520 VdbeComment((v, "first_entry_in(%d)", iCur)); | 1623 VdbeComment((v, "first_entry_in(%d)", iCur)); |
| 1521 sqlite3VdbeJumpHere(v, j1); | 1624 sqlite3VdbeJumpHere(v, addr1); |
| 1522 } | 1625 } |
| 1523 | 1626 |
| 1524 | 1627 |
| 1525 #ifndef SQLITE_OMIT_SUBQUERY | 1628 #ifndef SQLITE_OMIT_SUBQUERY |
| 1526 /* | 1629 /* |
| 1527 ** The argument is an IN operator with a list (not a subquery) on the | 1630 ** The argument is an IN operator with a list (not a subquery) on the |
| 1528 ** right-hand side. Return TRUE if that list is constant. | 1631 ** right-hand side. Return TRUE if that list is constant. |
| 1529 */ | 1632 */ |
| 1530 static int sqlite3InRhsIsConstant(Expr *pIn){ | 1633 static int sqlite3InRhsIsConstant(Expr *pIn){ |
| 1531 Expr *pLHS; | 1634 Expr *pLHS; |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1618 Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ | 1721 Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ |
| 1619 | 1722 |
| 1620 assert( pX->op==TK_IN ); | 1723 assert( pX->op==TK_IN ); |
| 1621 mustBeUnique = (inFlags & IN_INDEX_LOOP)!=0; | 1724 mustBeUnique = (inFlags & IN_INDEX_LOOP)!=0; |
| 1622 | 1725 |
| 1623 /* Check to see if an existing table or index can be used to | 1726 /* Check to see if an existing table or index can be used to |
| 1624 ** satisfy the query. This is preferable to generating a new | 1727 ** satisfy the query. This is preferable to generating a new |
| 1625 ** ephemeral table. | 1728 ** ephemeral table. |
| 1626 */ | 1729 */ |
| 1627 p = (ExprHasProperty(pX, EP_xIsSelect) ? pX->x.pSelect : 0); | 1730 p = (ExprHasProperty(pX, EP_xIsSelect) ? pX->x.pSelect : 0); |
| 1628 if( ALWAYS(pParse->nErr==0) && isCandidateForInOpt(p) ){ | 1731 if( pParse->nErr==0 && isCandidateForInOpt(p) ){ |
| 1629 sqlite3 *db = pParse->db; /* Database connection */ | 1732 sqlite3 *db = pParse->db; /* Database connection */ |
| 1630 Table *pTab; /* Table <table>. */ | 1733 Table *pTab; /* Table <table>. */ |
| 1631 Expr *pExpr; /* Expression <column> */ | 1734 Expr *pExpr; /* Expression <column> */ |
| 1632 i16 iCol; /* Index of column <column> */ | 1735 i16 iCol; /* Index of column <column> */ |
| 1633 i16 iDb; /* Database idx for pTab */ | 1736 i16 iDb; /* Database idx for pTab */ |
| 1634 | 1737 |
| 1635 assert( p ); /* Because of isCandidateForInOpt(p) */ | 1738 assert( p ); /* Because of isCandidateForInOpt(p) */ |
| 1636 assert( p->pEList!=0 ); /* Because of isCandidateForInOpt(p) */ | 1739 assert( p->pEList!=0 ); /* Because of isCandidateForInOpt(p) */ |
| 1637 assert( p->pEList->a[0].pExpr!=0 ); /* Because of isCandidateForInOpt(p) */ | 1740 assert( p->pEList->a[0].pExpr!=0 ); /* Because of isCandidateForInOpt(p) */ |
| 1638 assert( p->pSrc!=0 ); /* Because of isCandidateForInOpt(p) */ | 1741 assert( p->pSrc!=0 ); /* Because of isCandidateForInOpt(p) */ |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1783 ** | 1886 ** |
| 1784 ** If all of the above are false, then we can run this code just once | 1887 ** If all of the above are false, then we can run this code just once |
| 1785 ** save the results, and reuse the same result on subsequent invocations. | 1888 ** save the results, and reuse the same result on subsequent invocations. |
| 1786 */ | 1889 */ |
| 1787 if( !ExprHasProperty(pExpr, EP_VarSelect) ){ | 1890 if( !ExprHasProperty(pExpr, EP_VarSelect) ){ |
| 1788 jmpIfDynamic = sqlite3CodeOnce(pParse); VdbeCoverage(v); | 1891 jmpIfDynamic = sqlite3CodeOnce(pParse); VdbeCoverage(v); |
| 1789 } | 1892 } |
| 1790 | 1893 |
| 1791 #ifndef SQLITE_OMIT_EXPLAIN | 1894 #ifndef SQLITE_OMIT_EXPLAIN |
| 1792 if( pParse->explain==2 ){ | 1895 if( pParse->explain==2 ){ |
| 1793 char *zMsg = sqlite3MPrintf( | 1896 char *zMsg = sqlite3MPrintf(pParse->db, "EXECUTE %s%s SUBQUERY %d", |
| 1794 pParse->db, "EXECUTE %s%s SUBQUERY %d", jmpIfDynamic>=0?"":"CORRELATED "
, | 1897 jmpIfDynamic>=0?"":"CORRELATED ", |
| 1795 pExpr->op==TK_IN?"LIST":"SCALAR", pParse->iNextSelectId | 1898 pExpr->op==TK_IN?"LIST":"SCALAR", |
| 1899 pParse->iNextSelectId |
| 1796 ); | 1900 ); |
| 1797 sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC); | 1901 sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC); |
| 1798 } | 1902 } |
| 1799 #endif | 1903 #endif |
| 1800 | 1904 |
| 1801 switch( pExpr->op ){ | 1905 switch( pExpr->op ){ |
| 1802 case TK_IN: { | 1906 case TK_IN: { |
| 1803 char affinity; /* Affinity of the LHS of the IN */ | 1907 char affinity; /* Affinity of the LHS of the IN */ |
| 1804 int addr; /* Address of OP_OpenEphemeral instruction */ | 1908 int addr; /* Address of OP_OpenEphemeral instruction */ |
| 1805 Expr *pLeft = pExpr->pLeft; /* the LHS of the IN operator */ | 1909 Expr *pLeft = pExpr->pLeft; /* the LHS of the IN operator */ |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1859 ** store it in the temporary table. If <expr> is a column, then use | 1963 ** store it in the temporary table. If <expr> is a column, then use |
| 1860 ** that columns affinity when building index keys. If <expr> is not | 1964 ** that columns affinity when building index keys. If <expr> is not |
| 1861 ** a column, use numeric affinity. | 1965 ** a column, use numeric affinity. |
| 1862 */ | 1966 */ |
| 1863 int i; | 1967 int i; |
| 1864 ExprList *pList = pExpr->x.pList; | 1968 ExprList *pList = pExpr->x.pList; |
| 1865 struct ExprList_item *pItem; | 1969 struct ExprList_item *pItem; |
| 1866 int r1, r2, r3; | 1970 int r1, r2, r3; |
| 1867 | 1971 |
| 1868 if( !affinity ){ | 1972 if( !affinity ){ |
| 1869 affinity = SQLITE_AFF_NONE; | 1973 affinity = SQLITE_AFF_BLOB; |
| 1870 } | 1974 } |
| 1871 if( pKeyInfo ){ | 1975 if( pKeyInfo ){ |
| 1872 assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); | 1976 assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); |
| 1873 pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); | 1977 pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); |
| 1874 } | 1978 } |
| 1875 | 1979 |
| 1876 /* Loop through each expression in <exprlist>. */ | 1980 /* Loop through each expression in <exprlist>. */ |
| 1877 r1 = sqlite3GetTempReg(pParse); | 1981 r1 = sqlite3GetTempReg(pParse); |
| 1878 r2 = sqlite3GetTempReg(pParse); | 1982 r2 = sqlite3GetTempReg(pParse); |
| 1879 if( isRowid ) sqlite3VdbeAddOp2(v, OP_Null, 0, r2); | 1983 if( isRowid ) sqlite3VdbeAddOp2(v, OP_Null, 0, r2); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1943 VdbeComment((v, "Init subquery result")); | 2047 VdbeComment((v, "Init subquery result")); |
| 1944 }else{ | 2048 }else{ |
| 1945 dest.eDest = SRT_Exists; | 2049 dest.eDest = SRT_Exists; |
| 1946 sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); | 2050 sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); |
| 1947 VdbeComment((v, "Init EXISTS result")); | 2051 VdbeComment((v, "Init EXISTS result")); |
| 1948 } | 2052 } |
| 1949 sqlite3ExprDelete(pParse->db, pSel->pLimit); | 2053 sqlite3ExprDelete(pParse->db, pSel->pLimit); |
| 1950 pSel->pLimit = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, | 2054 pSel->pLimit = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, |
| 1951 &sqlite3IntTokens[1]); | 2055 &sqlite3IntTokens[1]); |
| 1952 pSel->iLimit = 0; | 2056 pSel->iLimit = 0; |
| 2057 pSel->selFlags &= ~SF_MultiValue; |
| 1953 if( sqlite3Select(pParse, pSel, &dest) ){ | 2058 if( sqlite3Select(pParse, pSel, &dest) ){ |
| 1954 return 0; | 2059 return 0; |
| 1955 } | 2060 } |
| 1956 rReg = dest.iSDParm; | 2061 rReg = dest.iSDParm; |
| 1957 ExprSetVVAProperty(pExpr, EP_NoReduce); | 2062 ExprSetVVAProperty(pExpr, EP_NoReduce); |
| 1958 break; | 2063 break; |
| 1959 } | 2064 } |
| 1960 } | 2065 } |
| 1961 | 2066 |
| 1962 if( rHasNullFlag ){ | 2067 if( rHasNullFlag ){ |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2054 }else{ | 2159 }else{ |
| 2055 assert( destIfNull==destIfFalse ); | 2160 assert( destIfNull==destIfFalse ); |
| 2056 sqlite3VdbeAddOp4(v, OP_Ne, r1, destIfFalse, r2, | 2161 sqlite3VdbeAddOp4(v, OP_Ne, r1, destIfFalse, r2, |
| 2057 (void*)pColl, P4_COLLSEQ); VdbeCoverage(v); | 2162 (void*)pColl, P4_COLLSEQ); VdbeCoverage(v); |
| 2058 sqlite3VdbeChangeP5(v, affinity | SQLITE_JUMPIFNULL); | 2163 sqlite3VdbeChangeP5(v, affinity | SQLITE_JUMPIFNULL); |
| 2059 } | 2164 } |
| 2060 sqlite3ReleaseTempReg(pParse, regToFree); | 2165 sqlite3ReleaseTempReg(pParse, regToFree); |
| 2061 } | 2166 } |
| 2062 if( regCkNull ){ | 2167 if( regCkNull ){ |
| 2063 sqlite3VdbeAddOp2(v, OP_IsNull, regCkNull, destIfNull); VdbeCoverage(v); | 2168 sqlite3VdbeAddOp2(v, OP_IsNull, regCkNull, destIfNull); VdbeCoverage(v); |
| 2064 sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfFalse); | 2169 sqlite3VdbeGoto(v, destIfFalse); |
| 2065 } | 2170 } |
| 2066 sqlite3VdbeResolveLabel(v, labelOk); | 2171 sqlite3VdbeResolveLabel(v, labelOk); |
| 2067 sqlite3ReleaseTempReg(pParse, regCkNull); | 2172 sqlite3ReleaseTempReg(pParse, regCkNull); |
| 2068 }else{ | 2173 }else{ |
| 2069 | 2174 |
| 2070 /* If the LHS is NULL, then the result is either false or NULL depending | 2175 /* If the LHS is NULL, then the result is either false or NULL depending |
| 2071 ** on whether the RHS is empty or not, respectively. | 2176 ** on whether the RHS is empty or not, respectively. |
| 2072 */ | 2177 */ |
| 2073 if( sqlite3ExprCanBeNull(pExpr->pLeft) ){ | 2178 if( sqlite3ExprCanBeNull(pExpr->pLeft) ){ |
| 2074 if( destIfNull==destIfFalse ){ | 2179 if( destIfNull==destIfFalse ){ |
| 2075 /* Shortcut for the common case where the false and NULL outcomes are | 2180 /* Shortcut for the common case where the false and NULL outcomes are |
| 2076 ** the same. */ | 2181 ** the same. */ |
| 2077 sqlite3VdbeAddOp2(v, OP_IsNull, r1, destIfNull); VdbeCoverage(v); | 2182 sqlite3VdbeAddOp2(v, OP_IsNull, r1, destIfNull); VdbeCoverage(v); |
| 2078 }else{ | 2183 }else{ |
| 2079 int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, r1); VdbeCoverage(v); | 2184 int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, r1); VdbeCoverage(v); |
| 2080 sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse); | 2185 sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse); |
| 2081 VdbeCoverage(v); | 2186 VdbeCoverage(v); |
| 2082 sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfNull); | 2187 sqlite3VdbeGoto(v, destIfNull); |
| 2083 sqlite3VdbeJumpHere(v, addr1); | 2188 sqlite3VdbeJumpHere(v, addr1); |
| 2084 } | 2189 } |
| 2085 } | 2190 } |
| 2086 | 2191 |
| 2087 if( eType==IN_INDEX_ROWID ){ | 2192 if( eType==IN_INDEX_ROWID ){ |
| 2088 /* In this case, the RHS is the ROWID of table b-tree | 2193 /* In this case, the RHS is the ROWID of table b-tree |
| 2089 */ | 2194 */ |
| 2090 sqlite3VdbeAddOp2(v, OP_MustBeInt, r1, destIfFalse); VdbeCoverage(v); | 2195 sqlite3VdbeAddOp2(v, OP_MustBeInt, r1, destIfFalse); VdbeCoverage(v); |
| 2091 sqlite3VdbeAddOp3(v, OP_NotExists, pExpr->iTable, destIfFalse, r1); | 2196 sqlite3VdbeAddOp3(v, OP_NotExists, pExpr->iTable, destIfFalse, r1); |
| 2092 VdbeCoverage(v); | 2197 VdbeCoverage(v); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2110 ** Also run this branch if NULL is equivalent to FALSE | 2215 ** Also run this branch if NULL is equivalent to FALSE |
| 2111 ** for this particular IN operator. | 2216 ** for this particular IN operator. |
| 2112 */ | 2217 */ |
| 2113 sqlite3VdbeAddOp4Int(v, OP_NotFound, pExpr->iTable, destIfFalse, r1, 1); | 2218 sqlite3VdbeAddOp4Int(v, OP_NotFound, pExpr->iTable, destIfFalse, r1, 1); |
| 2114 VdbeCoverage(v); | 2219 VdbeCoverage(v); |
| 2115 }else{ | 2220 }else{ |
| 2116 /* In this branch, the RHS of the IN might contain a NULL and | 2221 /* In this branch, the RHS of the IN might contain a NULL and |
| 2117 ** the presence of a NULL on the RHS makes a difference in the | 2222 ** the presence of a NULL on the RHS makes a difference in the |
| 2118 ** outcome. | 2223 ** outcome. |
| 2119 */ | 2224 */ |
| 2120 int j1; | 2225 int addr1; |
| 2121 | 2226 |
| 2122 /* First check to see if the LHS is contained in the RHS. If so, | 2227 /* First check to see if the LHS is contained in the RHS. If so, |
| 2123 ** then the answer is TRUE the presence of NULLs in the RHS does | 2228 ** then the answer is TRUE the presence of NULLs in the RHS does |
| 2124 ** not matter. If the LHS is not contained in the RHS, then the | 2229 ** not matter. If the LHS is not contained in the RHS, then the |
| 2125 ** answer is NULL if the RHS contains NULLs and the answer is | 2230 ** answer is NULL if the RHS contains NULLs and the answer is |
| 2126 ** FALSE if the RHS is NULL-free. | 2231 ** FALSE if the RHS is NULL-free. |
| 2127 */ | 2232 */ |
| 2128 j1 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, r1, 1); | 2233 addr1 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, r1, 1); |
| 2129 VdbeCoverage(v); | 2234 VdbeCoverage(v); |
| 2130 sqlite3VdbeAddOp2(v, OP_IsNull, rRhsHasNull, destIfNull); | 2235 sqlite3VdbeAddOp2(v, OP_IsNull, rRhsHasNull, destIfNull); |
| 2131 VdbeCoverage(v); | 2236 VdbeCoverage(v); |
| 2132 sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfFalse); | 2237 sqlite3VdbeGoto(v, destIfFalse); |
| 2133 sqlite3VdbeJumpHere(v, j1); | 2238 sqlite3VdbeJumpHere(v, addr1); |
| 2134 } | 2239 } |
| 2135 } | 2240 } |
| 2136 } | 2241 } |
| 2137 sqlite3ReleaseTempReg(pParse, r1); | 2242 sqlite3ReleaseTempReg(pParse, r1); |
| 2138 sqlite3ExprCachePop(pParse); | 2243 sqlite3ExprCachePop(pParse); |
| 2139 VdbeComment((v, "end IN expr")); | 2244 VdbeComment((v, "end IN expr")); |
| 2140 } | 2245 } |
| 2141 #endif /* SQLITE_OMIT_SUBQUERY */ | 2246 #endif /* SQLITE_OMIT_SUBQUERY */ |
| 2142 | 2247 |
| 2143 /* | |
| 2144 ** Duplicate an 8-byte value | |
| 2145 */ | |
| 2146 static char *dup8bytes(Vdbe *v, const char *in){ | |
| 2147 char *out = sqlite3DbMallocRaw(sqlite3VdbeDb(v), 8); | |
| 2148 if( out ){ | |
| 2149 memcpy(out, in, 8); | |
| 2150 } | |
| 2151 return out; | |
| 2152 } | |
| 2153 | |
| 2154 #ifndef SQLITE_OMIT_FLOATING_POINT | 2248 #ifndef SQLITE_OMIT_FLOATING_POINT |
| 2155 /* | 2249 /* |
| 2156 ** Generate an instruction that will put the floating point | 2250 ** Generate an instruction that will put the floating point |
| 2157 ** value described by z[0..n-1] into register iMem. | 2251 ** value described by z[0..n-1] into register iMem. |
| 2158 ** | 2252 ** |
| 2159 ** The z[] string will probably not be zero-terminated. But the | 2253 ** The z[] string will probably not be zero-terminated. But the |
| 2160 ** z[n] character is guaranteed to be something that does not look | 2254 ** z[n] character is guaranteed to be something that does not look |
| 2161 ** like the continuation of the number. | 2255 ** like the continuation of the number. |
| 2162 */ | 2256 */ |
| 2163 static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){ | 2257 static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){ |
| 2164 if( ALWAYS(z!=0) ){ | 2258 if( ALWAYS(z!=0) ){ |
| 2165 double value; | 2259 double value; |
| 2166 char *zV; | |
| 2167 sqlite3AtoF(z, &value, sqlite3Strlen30(z), SQLITE_UTF8); | 2260 sqlite3AtoF(z, &value, sqlite3Strlen30(z), SQLITE_UTF8); |
| 2168 assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */ | 2261 assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */ |
| 2169 if( negateFlag ) value = -value; | 2262 if( negateFlag ) value = -value; |
| 2170 zV = dup8bytes(v, (char*)&value); | 2263 sqlite3VdbeAddOp4Dup8(v, OP_Real, 0, iMem, 0, (u8*)&value, P4_REAL); |
| 2171 sqlite3VdbeAddOp4(v, OP_Real, 0, iMem, 0, zV, P4_REAL); | |
| 2172 } | 2264 } |
| 2173 } | 2265 } |
| 2174 #endif | 2266 #endif |
| 2175 | 2267 |
| 2176 | 2268 |
| 2177 /* | 2269 /* |
| 2178 ** Generate an instruction that will put the integer describe by | 2270 ** Generate an instruction that will put the integer describe by |
| 2179 ** text z[0..n-1] into register iMem. | 2271 ** text z[0..n-1] into register iMem. |
| 2180 ** | 2272 ** |
| 2181 ** Expr.u.zToken is always UTF8 and zero-terminated. | 2273 ** Expr.u.zToken is always UTF8 and zero-terminated. |
| 2182 */ | 2274 */ |
| 2183 static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){ | 2275 static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){ |
| 2184 Vdbe *v = pParse->pVdbe; | 2276 Vdbe *v = pParse->pVdbe; |
| 2185 if( pExpr->flags & EP_IntValue ){ | 2277 if( pExpr->flags & EP_IntValue ){ |
| 2186 int i = pExpr->u.iValue; | 2278 int i = pExpr->u.iValue; |
| 2187 assert( i>=0 ); | 2279 assert( i>=0 ); |
| 2188 if( negFlag ) i = -i; | 2280 if( negFlag ) i = -i; |
| 2189 sqlite3VdbeAddOp2(v, OP_Integer, i, iMem); | 2281 sqlite3VdbeAddOp2(v, OP_Integer, i, iMem); |
| 2190 }else{ | 2282 }else{ |
| 2191 int c; | 2283 int c; |
| 2192 i64 value; | 2284 i64 value; |
| 2193 const char *z = pExpr->u.zToken; | 2285 const char *z = pExpr->u.zToken; |
| 2194 assert( z!=0 ); | 2286 assert( z!=0 ); |
| 2195 c = sqlite3DecOrHexToI64(z, &value); | 2287 c = sqlite3DecOrHexToI64(z, &value); |
| 2196 if( c==0 || (c==2 && negFlag) ){ | 2288 if( c==0 || (c==2 && negFlag) ){ |
| 2197 char *zV; | |
| 2198 if( negFlag ){ value = c==2 ? SMALLEST_INT64 : -value; } | 2289 if( negFlag ){ value = c==2 ? SMALLEST_INT64 : -value; } |
| 2199 zV = dup8bytes(v, (char*)&value); | 2290 sqlite3VdbeAddOp4Dup8(v, OP_Int64, 0, iMem, 0, (u8*)&value, P4_INT64); |
| 2200 sqlite3VdbeAddOp4(v, OP_Int64, 0, iMem, 0, zV, P4_INT64); | |
| 2201 }else{ | 2291 }else{ |
| 2202 #ifdef SQLITE_OMIT_FLOATING_POINT | 2292 #ifdef SQLITE_OMIT_FLOATING_POINT |
| 2203 sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z); | 2293 sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z); |
| 2204 #else | 2294 #else |
| 2205 #ifndef SQLITE_OMIT_HEX_INTEGER | 2295 #ifndef SQLITE_OMIT_HEX_INTEGER |
| 2206 if( sqlite3_strnicmp(z,"0x",2)==0 ){ | 2296 if( sqlite3_strnicmp(z,"0x",2)==0 ){ |
| 2207 sqlite3ErrorMsg(pParse, "hex literal too big: %s", z); | 2297 sqlite3ErrorMsg(pParse, "hex literal too big: %s", z); |
| 2208 }else | 2298 }else |
| 2209 #endif | 2299 #endif |
| 2210 { | 2300 { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2231 /* | 2321 /* |
| 2232 ** Record in the column cache that a particular column from a | 2322 ** Record in the column cache that a particular column from a |
| 2233 ** particular table is stored in a particular register. | 2323 ** particular table is stored in a particular register. |
| 2234 */ | 2324 */ |
| 2235 void sqlite3ExprCacheStore(Parse *pParse, int iTab, int iCol, int iReg){ | 2325 void sqlite3ExprCacheStore(Parse *pParse, int iTab, int iCol, int iReg){ |
| 2236 int i; | 2326 int i; |
| 2237 int minLru; | 2327 int minLru; |
| 2238 int idxLru; | 2328 int idxLru; |
| 2239 struct yColCache *p; | 2329 struct yColCache *p; |
| 2240 | 2330 |
| 2241 assert( iReg>0 ); /* Register numbers are always positive */ | 2331 /* Unless an error has occurred, register numbers are always positive. */ |
| 2332 assert( iReg>0 || pParse->nErr || pParse->db->mallocFailed ); |
| 2242 assert( iCol>=-1 && iCol<32768 ); /* Finite column numbers */ | 2333 assert( iCol>=-1 && iCol<32768 ); /* Finite column numbers */ |
| 2243 | 2334 |
| 2244 /* The SQLITE_ColumnCache flag disables the column cache. This is used | 2335 /* The SQLITE_ColumnCache flag disables the column cache. This is used |
| 2245 ** for testing only - to verify that SQLite always gets the same answer | 2336 ** for testing only - to verify that SQLite always gets the same answer |
| 2246 ** with and without the column cache. | 2337 ** with and without the column cache. |
| 2247 */ | 2338 */ |
| 2248 if( OptimizationDisabled(pParse->db, SQLITE_ColumnCache) ) return; | 2339 if( OptimizationDisabled(pParse->db, SQLITE_ColumnCache) ) return; |
| 2249 | 2340 |
| 2250 /* First replace any existing entry. | 2341 /* First replace any existing entry. |
| 2251 ** | 2342 ** |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2355 static void sqlite3ExprCachePinRegister(Parse *pParse, int iReg){ | 2446 static void sqlite3ExprCachePinRegister(Parse *pParse, int iReg){ |
| 2356 int i; | 2447 int i; |
| 2357 struct yColCache *p; | 2448 struct yColCache *p; |
| 2358 for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ | 2449 for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ |
| 2359 if( p->iReg==iReg ){ | 2450 if( p->iReg==iReg ){ |
| 2360 p->tempReg = 0; | 2451 p->tempReg = 0; |
| 2361 } | 2452 } |
| 2362 } | 2453 } |
| 2363 } | 2454 } |
| 2364 | 2455 |
| 2456 /* Generate code that will load into register regOut a value that is |
| 2457 ** appropriate for the iIdxCol-th column of index pIdx. |
| 2458 */ |
| 2459 void sqlite3ExprCodeLoadIndexColumn( |
| 2460 Parse *pParse, /* The parsing context */ |
| 2461 Index *pIdx, /* The index whose column is to be loaded */ |
| 2462 int iTabCur, /* Cursor pointing to a table row */ |
| 2463 int iIdxCol, /* The column of the index to be loaded */ |
| 2464 int regOut /* Store the index column value in this register */ |
| 2465 ){ |
| 2466 i16 iTabCol = pIdx->aiColumn[iIdxCol]; |
| 2467 if( iTabCol==XN_EXPR ){ |
| 2468 assert( pIdx->aColExpr ); |
| 2469 assert( pIdx->aColExpr->nExpr>iIdxCol ); |
| 2470 pParse->iSelfTab = iTabCur; |
| 2471 sqlite3ExprCodeCopy(pParse, pIdx->aColExpr->a[iIdxCol].pExpr, regOut); |
| 2472 }else{ |
| 2473 sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pIdx->pTable, iTabCur, |
| 2474 iTabCol, regOut); |
| 2475 } |
| 2476 } |
| 2477 |
| 2365 /* | 2478 /* |
| 2366 ** Generate code to extract the value of the iCol-th column of a table. | 2479 ** Generate code to extract the value of the iCol-th column of a table. |
| 2367 */ | 2480 */ |
| 2368 void sqlite3ExprCodeGetColumnOfTable( | 2481 void sqlite3ExprCodeGetColumnOfTable( |
| 2369 Vdbe *v, /* The VDBE under construction */ | 2482 Vdbe *v, /* The VDBE under construction */ |
| 2370 Table *pTab, /* The table containing the value */ | 2483 Table *pTab, /* The table containing the value */ |
| 2371 int iTabCur, /* The table cursor. Or the PK cursor for WITHOUT ROWID */ | 2484 int iTabCur, /* The table cursor. Or the PK cursor for WITHOUT ROWID */ |
| 2372 int iCol, /* Index of the column to extract */ | 2485 int iCol, /* Index of the column to extract */ |
| 2373 int regOut /* Extract the value into this register */ | 2486 int regOut /* Extract the value into this register */ |
| 2374 ){ | 2487 ){ |
| 2375 if( iCol<0 || iCol==pTab->iPKey ){ | 2488 if( iCol<0 || iCol==pTab->iPKey ){ |
| 2376 sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut); | 2489 sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut); |
| 2377 }else{ | 2490 }else{ |
| 2378 int op = IsVirtual(pTab) ? OP_VColumn : OP_Column; | 2491 int op = IsVirtual(pTab) ? OP_VColumn : OP_Column; |
| 2379 int x = iCol; | 2492 int x = iCol; |
| 2380 if( !HasRowid(pTab) ){ | 2493 if( !HasRowid(pTab) ){ |
| 2381 x = sqlite3ColumnOfIndex(sqlite3PrimaryKeyIndex(pTab), iCol); | 2494 x = sqlite3ColumnOfIndex(sqlite3PrimaryKeyIndex(pTab), iCol); |
| 2382 } | 2495 } |
| 2383 sqlite3VdbeAddOp3(v, op, iTabCur, x, regOut); | 2496 sqlite3VdbeAddOp3(v, op, iTabCur, x, regOut); |
| 2384 } | 2497 } |
| 2385 if( iCol>=0 ){ | 2498 if( iCol>=0 ){ |
| 2386 sqlite3ColumnDefault(v, pTab, iCol, regOut); | 2499 sqlite3ColumnDefault(v, pTab, iCol, regOut); |
| 2387 } | 2500 } |
| 2388 } | 2501 } |
| 2389 | 2502 |
| 2390 /* | 2503 /* |
| 2391 ** Generate code that will extract the iColumn-th column from | 2504 ** Generate code that will extract the iColumn-th column from |
| 2392 ** table pTab and store the column value in a register. An effort | 2505 ** table pTab and store the column value in a register. |
| 2393 ** is made to store the column value in register iReg, but this is | 2506 ** |
| 2394 ** not guaranteed. The location of the column value is returned. | 2507 ** An effort is made to store the column value in register iReg. This |
| 2508 ** is not garanteeed for GetColumn() - the result can be stored in |
| 2509 ** any register. But the result is guaranteed to land in register iReg |
| 2510 ** for GetColumnToReg(). |
| 2395 ** | 2511 ** |
| 2396 ** There must be an open cursor to pTab in iTable when this routine | 2512 ** There must be an open cursor to pTab in iTable when this routine |
| 2397 ** is called. If iColumn<0 then code is generated that extracts the rowid. | 2513 ** is called. If iColumn<0 then code is generated that extracts the rowid. |
| 2398 */ | 2514 */ |
| 2399 int sqlite3ExprCodeGetColumn( | 2515 int sqlite3ExprCodeGetColumn( |
| 2400 Parse *pParse, /* Parsing and code generating context */ | 2516 Parse *pParse, /* Parsing and code generating context */ |
| 2401 Table *pTab, /* Description of the table we are reading from */ | 2517 Table *pTab, /* Description of the table we are reading from */ |
| 2402 int iColumn, /* Index of the table column */ | 2518 int iColumn, /* Index of the table column */ |
| 2403 int iTable, /* The cursor pointing to the table */ | 2519 int iTable, /* The cursor pointing to the table */ |
| 2404 int iReg, /* Store results here */ | 2520 int iReg, /* Store results here */ |
| 2405 u8 p5 /* P5 value for OP_Column */ | 2521 u8 p5 /* P5 value for OP_Column + FLAGS */ |
| 2406 ){ | 2522 ){ |
| 2407 Vdbe *v = pParse->pVdbe; | 2523 Vdbe *v = pParse->pVdbe; |
| 2408 int i; | 2524 int i; |
| 2409 struct yColCache *p; | 2525 struct yColCache *p; |
| 2410 | 2526 |
| 2411 for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ | 2527 for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ |
| 2412 if( p->iReg>0 && p->iTable==iTable && p->iColumn==iColumn ){ | 2528 if( p->iReg>0 && p->iTable==iTable && p->iColumn==iColumn ){ |
| 2413 p->lru = pParse->iCacheCnt++; | 2529 p->lru = pParse->iCacheCnt++; |
| 2414 sqlite3ExprCachePinRegister(pParse, p->iReg); | 2530 sqlite3ExprCachePinRegister(pParse, p->iReg); |
| 2415 return p->iReg; | 2531 return p->iReg; |
| 2416 } | 2532 } |
| 2417 } | 2533 } |
| 2418 assert( v!=0 ); | 2534 assert( v!=0 ); |
| 2419 sqlite3ExprCodeGetColumnOfTable(v, pTab, iTable, iColumn, iReg); | 2535 sqlite3ExprCodeGetColumnOfTable(v, pTab, iTable, iColumn, iReg); |
| 2420 if( p5 ){ | 2536 if( p5 ){ |
| 2421 sqlite3VdbeChangeP5(v, p5); | 2537 sqlite3VdbeChangeP5(v, p5); |
| 2422 }else{ | 2538 }else{ |
| 2423 sqlite3ExprCacheStore(pParse, iTable, iColumn, iReg); | 2539 sqlite3ExprCacheStore(pParse, iTable, iColumn, iReg); |
| 2424 } | 2540 } |
| 2425 return iReg; | 2541 return iReg; |
| 2426 } | 2542 } |
| 2543 void sqlite3ExprCodeGetColumnToReg( |
| 2544 Parse *pParse, /* Parsing and code generating context */ |
| 2545 Table *pTab, /* Description of the table we are reading from */ |
| 2546 int iColumn, /* Index of the table column */ |
| 2547 int iTable, /* The cursor pointing to the table */ |
| 2548 int iReg /* Store results here */ |
| 2549 ){ |
| 2550 int r1 = sqlite3ExprCodeGetColumn(pParse, pTab, iColumn, iTable, iReg, 0); |
| 2551 if( r1!=iReg ) sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, r1, iReg); |
| 2552 } |
| 2553 |
| 2427 | 2554 |
| 2428 /* | 2555 /* |
| 2429 ** Clear all column cache entries. | 2556 ** Clear all column cache entries. |
| 2430 */ | 2557 */ |
| 2431 void sqlite3ExprCacheClear(Parse *pParse){ | 2558 void sqlite3ExprCacheClear(Parse *pParse){ |
| 2432 int i; | 2559 int i; |
| 2433 struct yColCache *p; | 2560 struct yColCache *p; |
| 2434 | 2561 |
| 2435 #if SQLITE_DEBUG | 2562 #if SQLITE_DEBUG |
| 2436 if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ | 2563 if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2540 /* Otherwise, fall thru into the TK_COLUMN case */ | 2667 /* Otherwise, fall thru into the TK_COLUMN case */ |
| 2541 } | 2668 } |
| 2542 case TK_COLUMN: { | 2669 case TK_COLUMN: { |
| 2543 int iTab = pExpr->iTable; | 2670 int iTab = pExpr->iTable; |
| 2544 if( iTab<0 ){ | 2671 if( iTab<0 ){ |
| 2545 if( pParse->ckBase>0 ){ | 2672 if( pParse->ckBase>0 ){ |
| 2546 /* Generating CHECK constraints or inserting into partial index */ | 2673 /* Generating CHECK constraints or inserting into partial index */ |
| 2547 inReg = pExpr->iColumn + pParse->ckBase; | 2674 inReg = pExpr->iColumn + pParse->ckBase; |
| 2548 break; | 2675 break; |
| 2549 }else{ | 2676 }else{ |
| 2550 /* Deleting from a partial index */ | 2677 /* Coding an expression that is part of an index where column names |
| 2551 iTab = pParse->iPartIdxTab; | 2678 ** in the index refer to the table to which the index belongs */ |
| 2679 iTab = pParse->iSelfTab; |
| 2552 } | 2680 } |
| 2553 } | 2681 } |
| 2554 inReg = sqlite3ExprCodeGetColumn(pParse, pExpr->pTab, | 2682 inReg = sqlite3ExprCodeGetColumn(pParse, pExpr->pTab, |
| 2555 pExpr->iColumn, iTab, target, | 2683 pExpr->iColumn, iTab, target, |
| 2556 pExpr->op2); | 2684 pExpr->op2); |
| 2557 break; | 2685 break; |
| 2558 } | 2686 } |
| 2559 case TK_INTEGER: { | 2687 case TK_INTEGER: { |
| 2560 codeInteger(pParse, pExpr, 0, target); | 2688 codeInteger(pParse, pExpr, 0, target); |
| 2561 break; | 2689 break; |
| 2562 } | 2690 } |
| 2563 #ifndef SQLITE_OMIT_FLOATING_POINT | 2691 #ifndef SQLITE_OMIT_FLOATING_POINT |
| 2564 case TK_FLOAT: { | 2692 case TK_FLOAT: { |
| 2565 assert( !ExprHasProperty(pExpr, EP_IntValue) ); | 2693 assert( !ExprHasProperty(pExpr, EP_IntValue) ); |
| 2566 codeReal(v, pExpr->u.zToken, 0, target); | 2694 codeReal(v, pExpr->u.zToken, 0, target); |
| 2567 break; | 2695 break; |
| 2568 } | 2696 } |
| 2569 #endif | 2697 #endif |
| 2570 case TK_STRING: { | 2698 case TK_STRING: { |
| 2571 assert( !ExprHasProperty(pExpr, EP_IntValue) ); | 2699 assert( !ExprHasProperty(pExpr, EP_IntValue) ); |
| 2572 sqlite3VdbeAddOp4(v, OP_String8, 0, target, 0, pExpr->u.zToken, 0); | 2700 sqlite3VdbeLoadString(v, target, pExpr->u.zToken); |
| 2573 break; | 2701 break; |
| 2574 } | 2702 } |
| 2575 case TK_NULL: { | 2703 case TK_NULL: { |
| 2576 sqlite3VdbeAddOp2(v, OP_Null, 0, target); | 2704 sqlite3VdbeAddOp2(v, OP_Null, 0, target); |
| 2577 break; | 2705 break; |
| 2578 } | 2706 } |
| 2579 #ifndef SQLITE_OMIT_BLOB_LITERAL | 2707 #ifndef SQLITE_OMIT_BLOB_LITERAL |
| 2580 case TK_BLOB: { | 2708 case TK_BLOB: { |
| 2581 int n; | 2709 int n; |
| 2582 const char *z; | 2710 const char *z; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2601 assert( pExpr->u.zToken[0]=='?' | 2729 assert( pExpr->u.zToken[0]=='?' |
| 2602 || strcmp(pExpr->u.zToken, pParse->azVar[pExpr->iColumn-1])==0 ); | 2730 || strcmp(pExpr->u.zToken, pParse->azVar[pExpr->iColumn-1])==0 ); |
| 2603 sqlite3VdbeChangeP4(v, -1, pParse->azVar[pExpr->iColumn-1], P4_STATIC); | 2731 sqlite3VdbeChangeP4(v, -1, pParse->azVar[pExpr->iColumn-1], P4_STATIC); |
| 2604 } | 2732 } |
| 2605 break; | 2733 break; |
| 2606 } | 2734 } |
| 2607 case TK_REGISTER: { | 2735 case TK_REGISTER: { |
| 2608 inReg = pExpr->iTable; | 2736 inReg = pExpr->iTable; |
| 2609 break; | 2737 break; |
| 2610 } | 2738 } |
| 2611 case TK_AS: { | |
| 2612 inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); | |
| 2613 break; | |
| 2614 } | |
| 2615 #ifndef SQLITE_OMIT_CAST | 2739 #ifndef SQLITE_OMIT_CAST |
| 2616 case TK_CAST: { | 2740 case TK_CAST: { |
| 2617 /* Expressions of the form: CAST(pLeft AS token) */ | 2741 /* Expressions of the form: CAST(pLeft AS token) */ |
| 2618 inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); | 2742 inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); |
| 2619 if( inReg!=target ){ | 2743 if( inReg!=target ){ |
| 2620 sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target); | 2744 sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target); |
| 2621 inReg = target; | 2745 inReg = target; |
| 2622 } | 2746 } |
| 2623 sqlite3VdbeAddOp2(v, OP_Cast, target, | 2747 sqlite3VdbeAddOp2(v, OP_Cast, target, |
| 2624 sqlite3AffinityType(pExpr->u.zToken, 0)); | 2748 sqlite3AffinityType(pExpr->u.zToken, 0)); |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2794 } | 2918 } |
| 2795 sqlite3VdbeResolveLabel(v, endCoalesce); | 2919 sqlite3VdbeResolveLabel(v, endCoalesce); |
| 2796 break; | 2920 break; |
| 2797 } | 2921 } |
| 2798 | 2922 |
| 2799 /* The UNLIKELY() function is a no-op. The result is the value | 2923 /* The UNLIKELY() function is a no-op. The result is the value |
| 2800 ** of the first argument. | 2924 ** of the first argument. |
| 2801 */ | 2925 */ |
| 2802 if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ | 2926 if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ |
| 2803 assert( nFarg>=1 ); | 2927 assert( nFarg>=1 ); |
| 2804 sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); | 2928 inReg = sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); |
| 2805 break; | 2929 break; |
| 2806 } | 2930 } |
| 2807 | 2931 |
| 2808 for(i=0; i<nFarg; i++){ | 2932 for(i=0; i<nFarg; i++){ |
| 2809 if( i<32 && sqlite3ExprIsConstant(pFarg->a[i].pExpr) ){ | 2933 if( i<32 && sqlite3ExprIsConstant(pFarg->a[i].pExpr) ){ |
| 2810 testcase( i==31 ); | 2934 testcase( i==31 ); |
| 2811 constMask |= MASKBIT32(i); | 2935 constMask |= MASKBIT32(i); |
| 2812 } | 2936 } |
| 2813 if( (pDef->funcFlags & SQLITE_FUNC_NEEDCOLL)!=0 && !pColl ){ | 2937 if( (pDef->funcFlags & SQLITE_FUNC_NEEDCOLL)!=0 && !pColl ){ |
| 2814 pColl = sqlite3ExprCollSeq(pParse, pFarg->a[i].pExpr); | 2938 pColl = sqlite3ExprCollSeq(pParse, pFarg->a[i].pExpr); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2835 if( exprOp==TK_COLUMN || exprOp==TK_AGG_COLUMN ){ | 2959 if( exprOp==TK_COLUMN || exprOp==TK_AGG_COLUMN ){ |
| 2836 assert( SQLITE_FUNC_LENGTH==OPFLAG_LENGTHARG ); | 2960 assert( SQLITE_FUNC_LENGTH==OPFLAG_LENGTHARG ); |
| 2837 assert( SQLITE_FUNC_TYPEOF==OPFLAG_TYPEOFARG ); | 2961 assert( SQLITE_FUNC_TYPEOF==OPFLAG_TYPEOFARG ); |
| 2838 testcase( pDef->funcFlags & OPFLAG_LENGTHARG ); | 2962 testcase( pDef->funcFlags & OPFLAG_LENGTHARG ); |
| 2839 pFarg->a[0].pExpr->op2 = | 2963 pFarg->a[0].pExpr->op2 = |
| 2840 pDef->funcFlags & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG); | 2964 pDef->funcFlags & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG); |
| 2841 } | 2965 } |
| 2842 } | 2966 } |
| 2843 | 2967 |
| 2844 sqlite3ExprCachePush(pParse); /* Ticket 2ea2425d34be */ | 2968 sqlite3ExprCachePush(pParse); /* Ticket 2ea2425d34be */ |
| 2845 sqlite3ExprCodeExprList(pParse, pFarg, r1, | 2969 sqlite3ExprCodeExprList(pParse, pFarg, r1, 0, |
| 2846 SQLITE_ECEL_DUP|SQLITE_ECEL_FACTOR); | 2970 SQLITE_ECEL_DUP|SQLITE_ECEL_FACTOR); |
| 2847 sqlite3ExprCachePop(pParse); /* Ticket 2ea2425d34be */ | 2971 sqlite3ExprCachePop(pParse); /* Ticket 2ea2425d34be */ |
| 2848 }else{ | 2972 }else{ |
| 2849 r1 = 0; | 2973 r1 = 0; |
| 2850 } | 2974 } |
| 2851 #ifndef SQLITE_OMIT_VIRTUALTABLE | 2975 #ifndef SQLITE_OMIT_VIRTUALTABLE |
| 2852 /* Possibly overload the function if the first argument is | 2976 /* Possibly overload the function if the first argument is |
| 2853 ** a virtual table column. | 2977 ** a virtual table column. |
| 2854 ** | 2978 ** |
| 2855 ** For infix functions (LIKE, GLOB, REGEXP, and MATCH) use the | 2979 ** For infix functions (LIKE, GLOB, REGEXP, and MATCH) use the |
| 2856 ** second argument, not the first, as the argument to test to | 2980 ** second argument, not the first, as the argument to test to |
| 2857 ** see if it is a column in a virtual table. This is done because | 2981 ** see if it is a column in a virtual table. This is done because |
| 2858 ** the left operand of infix functions (the operand we want to | 2982 ** the left operand of infix functions (the operand we want to |
| 2859 ** control overloading) ends up as the second argument to the | 2983 ** control overloading) ends up as the second argument to the |
| 2860 ** function. The expression "A glob B" is equivalent to | 2984 ** function. The expression "A glob B" is equivalent to |
| 2861 ** "glob(B,A). We want to use the A in "A glob B" to test | 2985 ** "glob(B,A). We want to use the A in "A glob B" to test |
| 2862 ** for function overloading. But we use the B term in "glob(B,A)". | 2986 ** for function overloading. But we use the B term in "glob(B,A)". |
| 2863 */ | 2987 */ |
| 2864 if( nFarg>=2 && (pExpr->flags & EP_InfixFunc) ){ | 2988 if( nFarg>=2 && (pExpr->flags & EP_InfixFunc) ){ |
| 2865 pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[1].pExpr); | 2989 pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[1].pExpr); |
| 2866 }else if( nFarg>0 ){ | 2990 }else if( nFarg>0 ){ |
| 2867 pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[0].pExpr); | 2991 pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[0].pExpr); |
| 2868 } | 2992 } |
| 2869 #endif | 2993 #endif |
| 2870 if( pDef->funcFlags & SQLITE_FUNC_NEEDCOLL ){ | 2994 if( pDef->funcFlags & SQLITE_FUNC_NEEDCOLL ){ |
| 2871 if( !pColl ) pColl = db->pDfltColl; | 2995 if( !pColl ) pColl = db->pDfltColl; |
| 2872 sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ); | 2996 sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ); |
| 2873 } | 2997 } |
| 2874 sqlite3VdbeAddOp4(v, OP_Function, constMask, r1, target, | 2998 sqlite3VdbeAddOp4(v, OP_Function0, constMask, r1, target, |
| 2875 (char*)pDef, P4_FUNCDEF); | 2999 (char*)pDef, P4_FUNCDEF); |
| 2876 sqlite3VdbeChangeP5(v, (u8)nFarg); | 3000 sqlite3VdbeChangeP5(v, (u8)nFarg); |
| 2877 if( nFarg && constMask==0 ){ | 3001 if( nFarg && constMask==0 ){ |
| 2878 sqlite3ReleaseTempRange(pParse, r1, nFarg); | 3002 sqlite3ReleaseTempRange(pParse, r1, nFarg); |
| 2879 } | 3003 } |
| 2880 break; | 3004 break; |
| 2881 } | 3005 } |
| 2882 #ifndef SQLITE_OMIT_SUBQUERY | 3006 #ifndef SQLITE_OMIT_SUBQUERY |
| 2883 case TK_EXISTS: | 3007 case TK_EXISTS: |
| 2884 case TK_SELECT: { | 3008 case TK_SELECT: { |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2979 | 3103 |
| 2980 sqlite3VdbeAddOp2(v, OP_Param, p1, target); | 3104 sqlite3VdbeAddOp2(v, OP_Param, p1, target); |
| 2981 VdbeComment((v, "%s.%s -> $%d", | 3105 VdbeComment((v, "%s.%s -> $%d", |
| 2982 (pExpr->iTable ? "new" : "old"), | 3106 (pExpr->iTable ? "new" : "old"), |
| 2983 (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName), | 3107 (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName), |
| 2984 target | 3108 target |
| 2985 )); | 3109 )); |
| 2986 | 3110 |
| 2987 #ifndef SQLITE_OMIT_FLOATING_POINT | 3111 #ifndef SQLITE_OMIT_FLOATING_POINT |
| 2988 /* If the column has REAL affinity, it may currently be stored as an | 3112 /* If the column has REAL affinity, it may currently be stored as an |
| 2989 ** integer. Use OP_RealAffinity to make sure it is really real. */ | 3113 ** integer. Use OP_RealAffinity to make sure it is really real. |
| 3114 ** |
| 3115 ** EVIDENCE-OF: R-60985-57662 SQLite will convert the value back to |
| 3116 ** floating point when extracting it from the record. */ |
| 2990 if( pExpr->iColumn>=0 | 3117 if( pExpr->iColumn>=0 |
| 2991 && pTab->aCol[pExpr->iColumn].affinity==SQLITE_AFF_REAL | 3118 && pTab->aCol[pExpr->iColumn].affinity==SQLITE_AFF_REAL |
| 2992 ){ | 3119 ){ |
| 2993 sqlite3VdbeAddOp1(v, OP_RealAffinity, target); | 3120 sqlite3VdbeAddOp1(v, OP_RealAffinity, target); |
| 2994 } | 3121 } |
| 2995 #endif | 3122 #endif |
| 2996 break; | 3123 break; |
| 2997 } | 3124 } |
| 2998 | 3125 |
| 2999 | 3126 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3056 assert( pTest!=0 ); | 3183 assert( pTest!=0 ); |
| 3057 opCompare.pRight = aListelem[i].pExpr; | 3184 opCompare.pRight = aListelem[i].pExpr; |
| 3058 }else{ | 3185 }else{ |
| 3059 pTest = aListelem[i].pExpr; | 3186 pTest = aListelem[i].pExpr; |
| 3060 } | 3187 } |
| 3061 nextCase = sqlite3VdbeMakeLabel(v); | 3188 nextCase = sqlite3VdbeMakeLabel(v); |
| 3062 testcase( pTest->op==TK_COLUMN ); | 3189 testcase( pTest->op==TK_COLUMN ); |
| 3063 sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL); | 3190 sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL); |
| 3064 testcase( aListelem[i+1].pExpr->op==TK_COLUMN ); | 3191 testcase( aListelem[i+1].pExpr->op==TK_COLUMN ); |
| 3065 sqlite3ExprCode(pParse, aListelem[i+1].pExpr, target); | 3192 sqlite3ExprCode(pParse, aListelem[i+1].pExpr, target); |
| 3066 sqlite3VdbeAddOp2(v, OP_Goto, 0, endLabel); | 3193 sqlite3VdbeGoto(v, endLabel); |
| 3067 sqlite3ExprCachePop(pParse); | 3194 sqlite3ExprCachePop(pParse); |
| 3068 sqlite3VdbeResolveLabel(v, nextCase); | 3195 sqlite3VdbeResolveLabel(v, nextCase); |
| 3069 } | 3196 } |
| 3070 if( (nExpr&1)!=0 ){ | 3197 if( (nExpr&1)!=0 ){ |
| 3071 sqlite3ExprCachePush(pParse); | 3198 sqlite3ExprCachePush(pParse); |
| 3072 sqlite3ExprCode(pParse, pEList->a[nExpr-1].pExpr, target); | 3199 sqlite3ExprCode(pParse, pEList->a[nExpr-1].pExpr, target); |
| 3073 sqlite3ExprCachePop(pParse); | 3200 sqlite3ExprCachePop(pParse); |
| 3074 }else{ | 3201 }else{ |
| 3075 sqlite3VdbeAddOp2(v, OP_Null, 0, target); | 3202 sqlite3VdbeAddOp2(v, OP_Null, 0, target); |
| 3076 } | 3203 } |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3187 ** in register target. | 3314 ** in register target. |
| 3188 */ | 3315 */ |
| 3189 void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ | 3316 void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ |
| 3190 int inReg; | 3317 int inReg; |
| 3191 | 3318 |
| 3192 assert( target>0 && target<=pParse->nMem ); | 3319 assert( target>0 && target<=pParse->nMem ); |
| 3193 if( pExpr && pExpr->op==TK_REGISTER ){ | 3320 if( pExpr && pExpr->op==TK_REGISTER ){ |
| 3194 sqlite3VdbeAddOp2(pParse->pVdbe, OP_Copy, pExpr->iTable, target); | 3321 sqlite3VdbeAddOp2(pParse->pVdbe, OP_Copy, pExpr->iTable, target); |
| 3195 }else{ | 3322 }else{ |
| 3196 inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); | 3323 inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); |
| 3197 assert( pParse->pVdbe || pParse->db->mallocFailed ); | 3324 assert( pParse->pVdbe!=0 || pParse->db->mallocFailed ); |
| 3198 if( inReg!=target && pParse->pVdbe ){ | 3325 if( inReg!=target && pParse->pVdbe ){ |
| 3199 sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, inReg, target); | 3326 sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, inReg, target); |
| 3200 } | 3327 } |
| 3201 } | 3328 } |
| 3202 } | 3329 } |
| 3203 | 3330 |
| 3204 /* | 3331 /* |
| 3332 ** Make a transient copy of expression pExpr and then code it using |
| 3333 ** sqlite3ExprCode(). This routine works just like sqlite3ExprCode() |
| 3334 ** except that the input expression is guaranteed to be unchanged. |
| 3335 */ |
| 3336 void sqlite3ExprCodeCopy(Parse *pParse, Expr *pExpr, int target){ |
| 3337 sqlite3 *db = pParse->db; |
| 3338 pExpr = sqlite3ExprDup(db, pExpr, 0); |
| 3339 if( !db->mallocFailed ) sqlite3ExprCode(pParse, pExpr, target); |
| 3340 sqlite3ExprDelete(db, pExpr); |
| 3341 } |
| 3342 |
| 3343 /* |
| 3205 ** Generate code that will evaluate expression pExpr and store the | 3344 ** Generate code that will evaluate expression pExpr and store the |
| 3206 ** results in register target. The results are guaranteed to appear | 3345 ** results in register target. The results are guaranteed to appear |
| 3207 ** in register target. If the expression is constant, then this routine | 3346 ** in register target. If the expression is constant, then this routine |
| 3208 ** might choose to code the expression at initialization time. | 3347 ** might choose to code the expression at initialization time. |
| 3209 */ | 3348 */ |
| 3210 void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int target){ | 3349 void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int target){ |
| 3211 if( pParse->okConstFactor && sqlite3ExprIsConstant(pExpr) ){ | 3350 if( pParse->okConstFactor && sqlite3ExprIsConstant(pExpr) ){ |
| 3212 sqlite3ExprCodeAtInit(pParse, pExpr, target, 0); | 3351 sqlite3ExprCodeAtInit(pParse, pExpr, target, 0); |
| 3213 }else{ | 3352 }else{ |
| 3214 sqlite3ExprCode(pParse, pExpr, target); | 3353 sqlite3ExprCode(pParse, pExpr, target); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 3232 int iMem; | 3371 int iMem; |
| 3233 | 3372 |
| 3234 assert( target>0 ); | 3373 assert( target>0 ); |
| 3235 assert( pExpr->op!=TK_REGISTER ); | 3374 assert( pExpr->op!=TK_REGISTER ); |
| 3236 sqlite3ExprCode(pParse, pExpr, target); | 3375 sqlite3ExprCode(pParse, pExpr, target); |
| 3237 iMem = ++pParse->nMem; | 3376 iMem = ++pParse->nMem; |
| 3238 sqlite3VdbeAddOp2(v, OP_Copy, target, iMem); | 3377 sqlite3VdbeAddOp2(v, OP_Copy, target, iMem); |
| 3239 exprToRegister(pExpr, iMem); | 3378 exprToRegister(pExpr, iMem); |
| 3240 } | 3379 } |
| 3241 | 3380 |
| 3242 #ifdef SQLITE_DEBUG | |
| 3243 /* | |
| 3244 ** Generate a human-readable explanation of an expression tree. | |
| 3245 */ | |
| 3246 void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ | |
| 3247 const char *zBinOp = 0; /* Binary operator */ | |
| 3248 const char *zUniOp = 0; /* Unary operator */ | |
| 3249 pView = sqlite3TreeViewPush(pView, moreToFollow); | |
| 3250 if( pExpr==0 ){ | |
| 3251 sqlite3TreeViewLine(pView, "nil"); | |
| 3252 sqlite3TreeViewPop(pView); | |
| 3253 return; | |
| 3254 } | |
| 3255 switch( pExpr->op ){ | |
| 3256 case TK_AGG_COLUMN: { | |
| 3257 sqlite3TreeViewLine(pView, "AGG{%d:%d}", | |
| 3258 pExpr->iTable, pExpr->iColumn); | |
| 3259 break; | |
| 3260 } | |
| 3261 case TK_COLUMN: { | |
| 3262 if( pExpr->iTable<0 ){ | |
| 3263 /* This only happens when coding check constraints */ | |
| 3264 sqlite3TreeViewLine(pView, "COLUMN(%d)", pExpr->iColumn); | |
| 3265 }else{ | |
| 3266 sqlite3TreeViewLine(pView, "{%d:%d}", | |
| 3267 pExpr->iTable, pExpr->iColumn); | |
| 3268 } | |
| 3269 break; | |
| 3270 } | |
| 3271 case TK_INTEGER: { | |
| 3272 if( pExpr->flags & EP_IntValue ){ | |
| 3273 sqlite3TreeViewLine(pView, "%d", pExpr->u.iValue); | |
| 3274 }else{ | |
| 3275 sqlite3TreeViewLine(pView, "%s", pExpr->u.zToken); | |
| 3276 } | |
| 3277 break; | |
| 3278 } | |
| 3279 #ifndef SQLITE_OMIT_FLOATING_POINT | |
| 3280 case TK_FLOAT: { | |
| 3281 sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); | |
| 3282 break; | |
| 3283 } | |
| 3284 #endif | |
| 3285 case TK_STRING: { | |
| 3286 sqlite3TreeViewLine(pView,"%Q", pExpr->u.zToken); | |
| 3287 break; | |
| 3288 } | |
| 3289 case TK_NULL: { | |
| 3290 sqlite3TreeViewLine(pView,"NULL"); | |
| 3291 break; | |
| 3292 } | |
| 3293 #ifndef SQLITE_OMIT_BLOB_LITERAL | |
| 3294 case TK_BLOB: { | |
| 3295 sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); | |
| 3296 break; | |
| 3297 } | |
| 3298 #endif | |
| 3299 case TK_VARIABLE: { | |
| 3300 sqlite3TreeViewLine(pView,"VARIABLE(%s,%d)", | |
| 3301 pExpr->u.zToken, pExpr->iColumn); | |
| 3302 break; | |
| 3303 } | |
| 3304 case TK_REGISTER: { | |
| 3305 sqlite3TreeViewLine(pView,"REGISTER(%d)", pExpr->iTable); | |
| 3306 break; | |
| 3307 } | |
| 3308 case TK_AS: { | |
| 3309 sqlite3TreeViewLine(pView,"AS %Q", pExpr->u.zToken); | |
| 3310 sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); | |
| 3311 break; | |
| 3312 } | |
| 3313 case TK_ID: { | |
| 3314 sqlite3TreeViewLine(pView,"ID %Q", pExpr->u.zToken); | |
| 3315 break; | |
| 3316 } | |
| 3317 #ifndef SQLITE_OMIT_CAST | |
| 3318 case TK_CAST: { | |
| 3319 /* Expressions of the form: CAST(pLeft AS token) */ | |
| 3320 sqlite3TreeViewLine(pView,"CAST %Q", pExpr->u.zToken); | |
| 3321 sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); | |
| 3322 break; | |
| 3323 } | |
| 3324 #endif /* SQLITE_OMIT_CAST */ | |
| 3325 case TK_LT: zBinOp = "LT"; break; | |
| 3326 case TK_LE: zBinOp = "LE"; break; | |
| 3327 case TK_GT: zBinOp = "GT"; break; | |
| 3328 case TK_GE: zBinOp = "GE"; break; | |
| 3329 case TK_NE: zBinOp = "NE"; break; | |
| 3330 case TK_EQ: zBinOp = "EQ"; break; | |
| 3331 case TK_IS: zBinOp = "IS"; break; | |
| 3332 case TK_ISNOT: zBinOp = "ISNOT"; break; | |
| 3333 case TK_AND: zBinOp = "AND"; break; | |
| 3334 case TK_OR: zBinOp = "OR"; break; | |
| 3335 case TK_PLUS: zBinOp = "ADD"; break; | |
| 3336 case TK_STAR: zBinOp = "MUL"; break; | |
| 3337 case TK_MINUS: zBinOp = "SUB"; break; | |
| 3338 case TK_REM: zBinOp = "REM"; break; | |
| 3339 case TK_BITAND: zBinOp = "BITAND"; break; | |
| 3340 case TK_BITOR: zBinOp = "BITOR"; break; | |
| 3341 case TK_SLASH: zBinOp = "DIV"; break; | |
| 3342 case TK_LSHIFT: zBinOp = "LSHIFT"; break; | |
| 3343 case TK_RSHIFT: zBinOp = "RSHIFT"; break; | |
| 3344 case TK_CONCAT: zBinOp = "CONCAT"; break; | |
| 3345 case TK_DOT: zBinOp = "DOT"; break; | |
| 3346 | |
| 3347 case TK_UMINUS: zUniOp = "UMINUS"; break; | |
| 3348 case TK_UPLUS: zUniOp = "UPLUS"; break; | |
| 3349 case TK_BITNOT: zUniOp = "BITNOT"; break; | |
| 3350 case TK_NOT: zUniOp = "NOT"; break; | |
| 3351 case TK_ISNULL: zUniOp = "ISNULL"; break; | |
| 3352 case TK_NOTNULL: zUniOp = "NOTNULL"; break; | |
| 3353 | |
| 3354 case TK_COLLATE: { | |
| 3355 sqlite3TreeViewLine(pView, "COLLATE %Q", pExpr->u.zToken); | |
| 3356 sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); | |
| 3357 break; | |
| 3358 } | |
| 3359 | |
| 3360 case TK_AGG_FUNCTION: | |
| 3361 case TK_FUNCTION: { | |
| 3362 ExprList *pFarg; /* List of function arguments */ | |
| 3363 if( ExprHasProperty(pExpr, EP_TokenOnly) ){ | |
| 3364 pFarg = 0; | |
| 3365 }else{ | |
| 3366 pFarg = pExpr->x.pList; | |
| 3367 } | |
| 3368 if( pExpr->op==TK_AGG_FUNCTION ){ | |
| 3369 sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q", | |
| 3370 pExpr->op2, pExpr->u.zToken); | |
| 3371 }else{ | |
| 3372 sqlite3TreeViewLine(pView, "FUNCTION %Q", pExpr->u.zToken); | |
| 3373 } | |
| 3374 if( pFarg ){ | |
| 3375 sqlite3TreeViewExprList(pView, pFarg, 0, 0); | |
| 3376 } | |
| 3377 break; | |
| 3378 } | |
| 3379 #ifndef SQLITE_OMIT_SUBQUERY | |
| 3380 case TK_EXISTS: { | |
| 3381 sqlite3TreeViewLine(pView, "EXISTS-expr"); | |
| 3382 sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); | |
| 3383 break; | |
| 3384 } | |
| 3385 case TK_SELECT: { | |
| 3386 sqlite3TreeViewLine(pView, "SELECT-expr"); | |
| 3387 sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); | |
| 3388 break; | |
| 3389 } | |
| 3390 case TK_IN: { | |
| 3391 sqlite3TreeViewLine(pView, "IN"); | |
| 3392 sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); | |
| 3393 if( ExprHasProperty(pExpr, EP_xIsSelect) ){ | |
| 3394 sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); | |
| 3395 }else{ | |
| 3396 sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); | |
| 3397 } | |
| 3398 break; | |
| 3399 } | |
| 3400 #endif /* SQLITE_OMIT_SUBQUERY */ | |
| 3401 | |
| 3402 /* | |
| 3403 ** x BETWEEN y AND z | |
| 3404 ** | |
| 3405 ** This is equivalent to | |
| 3406 ** | |
| 3407 ** x>=y AND x<=z | |
| 3408 ** | |
| 3409 ** X is stored in pExpr->pLeft. | |
| 3410 ** Y is stored in pExpr->pList->a[0].pExpr. | |
| 3411 ** Z is stored in pExpr->pList->a[1].pExpr. | |
| 3412 */ | |
| 3413 case TK_BETWEEN: { | |
| 3414 Expr *pX = pExpr->pLeft; | |
| 3415 Expr *pY = pExpr->x.pList->a[0].pExpr; | |
| 3416 Expr *pZ = pExpr->x.pList->a[1].pExpr; | |
| 3417 sqlite3TreeViewLine(pView, "BETWEEN"); | |
| 3418 sqlite3TreeViewExpr(pView, pX, 1); | |
| 3419 sqlite3TreeViewExpr(pView, pY, 1); | |
| 3420 sqlite3TreeViewExpr(pView, pZ, 0); | |
| 3421 break; | |
| 3422 } | |
| 3423 case TK_TRIGGER: { | |
| 3424 /* If the opcode is TK_TRIGGER, then the expression is a reference | |
| 3425 ** to a column in the new.* or old.* pseudo-tables available to | |
| 3426 ** trigger programs. In this case Expr.iTable is set to 1 for the | |
| 3427 ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn | |
| 3428 ** is set to the column of the pseudo-table to read, or to -1 to | |
| 3429 ** read the rowid field. | |
| 3430 */ | |
| 3431 sqlite3TreeViewLine(pView, "%s(%d)", | |
| 3432 pExpr->iTable ? "NEW" : "OLD", pExpr->iColumn); | |
| 3433 break; | |
| 3434 } | |
| 3435 case TK_CASE: { | |
| 3436 sqlite3TreeViewLine(pView, "CASE"); | |
| 3437 sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); | |
| 3438 sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); | |
| 3439 break; | |
| 3440 } | |
| 3441 #ifndef SQLITE_OMIT_TRIGGER | |
| 3442 case TK_RAISE: { | |
| 3443 const char *zType = "unk"; | |
| 3444 switch( pExpr->affinity ){ | |
| 3445 case OE_Rollback: zType = "rollback"; break; | |
| 3446 case OE_Abort: zType = "abort"; break; | |
| 3447 case OE_Fail: zType = "fail"; break; | |
| 3448 case OE_Ignore: zType = "ignore"; break; | |
| 3449 } | |
| 3450 sqlite3TreeViewLine(pView, "RAISE %s(%Q)", zType, pExpr->u.zToken); | |
| 3451 break; | |
| 3452 } | |
| 3453 #endif | |
| 3454 default: { | |
| 3455 sqlite3TreeViewLine(pView, "op=%d", pExpr->op); | |
| 3456 break; | |
| 3457 } | |
| 3458 } | |
| 3459 if( zBinOp ){ | |
| 3460 sqlite3TreeViewLine(pView, "%s", zBinOp); | |
| 3461 sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); | |
| 3462 sqlite3TreeViewExpr(pView, pExpr->pRight, 0); | |
| 3463 }else if( zUniOp ){ | |
| 3464 sqlite3TreeViewLine(pView, "%s", zUniOp); | |
| 3465 sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); | |
| 3466 } | |
| 3467 sqlite3TreeViewPop(pView); | |
| 3468 } | |
| 3469 #endif /* SQLITE_DEBUG */ | |
| 3470 | |
| 3471 #ifdef SQLITE_DEBUG | |
| 3472 /* | |
| 3473 ** Generate a human-readable explanation of an expression list. | |
| 3474 */ | |
| 3475 void sqlite3TreeViewExprList( | |
| 3476 TreeView *pView, | |
| 3477 const ExprList *pList, | |
| 3478 u8 moreToFollow, | |
| 3479 const char *zLabel | |
| 3480 ){ | |
| 3481 int i; | |
| 3482 pView = sqlite3TreeViewPush(pView, moreToFollow); | |
| 3483 if( zLabel==0 || zLabel[0]==0 ) zLabel = "LIST"; | |
| 3484 if( pList==0 ){ | |
| 3485 sqlite3TreeViewLine(pView, "%s (empty)", zLabel); | |
| 3486 }else{ | |
| 3487 sqlite3TreeViewLine(pView, "%s", zLabel); | |
| 3488 for(i=0; i<pList->nExpr; i++){ | |
| 3489 sqlite3TreeViewExpr(pView, pList->a[i].pExpr, i<pList->nExpr-1); | |
| 3490 #if 0 | |
| 3491 if( pList->a[i].zName ){ | |
| 3492 sqlite3ExplainPrintf(pOut, " AS %s", pList->a[i].zName); | |
| 3493 } | |
| 3494 if( pList->a[i].bSpanIsTab ){ | |
| 3495 sqlite3ExplainPrintf(pOut, " (%s)", pList->a[i].zSpan); | |
| 3496 } | |
| 3497 #endif | |
| 3498 } | |
| 3499 } | |
| 3500 sqlite3TreeViewPop(pView); | |
| 3501 } | |
| 3502 #endif /* SQLITE_DEBUG */ | |
| 3503 | |
| 3504 /* | 3381 /* |
| 3505 ** Generate code that pushes the value of every element of the given | 3382 ** Generate code that pushes the value of every element of the given |
| 3506 ** expression list into a sequence of registers beginning at target. | 3383 ** expression list into a sequence of registers beginning at target. |
| 3507 ** | 3384 ** |
| 3508 ** Return the number of elements evaluated. | 3385 ** Return the number of elements evaluated. |
| 3509 ** | 3386 ** |
| 3510 ** The SQLITE_ECEL_DUP flag prevents the arguments from being | 3387 ** The SQLITE_ECEL_DUP flag prevents the arguments from being |
| 3511 ** filled using OP_SCopy. OP_Copy must be used instead. | 3388 ** filled using OP_SCopy. OP_Copy must be used instead. |
| 3512 ** | 3389 ** |
| 3513 ** The SQLITE_ECEL_FACTOR argument allows constant arguments to be | 3390 ** The SQLITE_ECEL_FACTOR argument allows constant arguments to be |
| 3514 ** factored out into initialization code. | 3391 ** factored out into initialization code. |
| 3392 ** |
| 3393 ** The SQLITE_ECEL_REF flag means that expressions in the list with |
| 3394 ** ExprList.a[].u.x.iOrderByCol>0 have already been evaluated and stored |
| 3395 ** in registers at srcReg, and so the value can be copied from there. |
| 3515 */ | 3396 */ |
| 3516 int sqlite3ExprCodeExprList( | 3397 int sqlite3ExprCodeExprList( |
| 3517 Parse *pParse, /* Parsing context */ | 3398 Parse *pParse, /* Parsing context */ |
| 3518 ExprList *pList, /* The expression list to be coded */ | 3399 ExprList *pList, /* The expression list to be coded */ |
| 3519 int target, /* Where to write results */ | 3400 int target, /* Where to write results */ |
| 3401 int srcReg, /* Source registers if SQLITE_ECEL_REF */ |
| 3520 u8 flags /* SQLITE_ECEL_* flags */ | 3402 u8 flags /* SQLITE_ECEL_* flags */ |
| 3521 ){ | 3403 ){ |
| 3522 struct ExprList_item *pItem; | 3404 struct ExprList_item *pItem; |
| 3523 int i, n; | 3405 int i, j, n; |
| 3524 u8 copyOp = (flags & SQLITE_ECEL_DUP) ? OP_Copy : OP_SCopy; | 3406 u8 copyOp = (flags & SQLITE_ECEL_DUP) ? OP_Copy : OP_SCopy; |
| 3407 Vdbe *v = pParse->pVdbe; |
| 3525 assert( pList!=0 ); | 3408 assert( pList!=0 ); |
| 3526 assert( target>0 ); | 3409 assert( target>0 ); |
| 3527 assert( pParse->pVdbe!=0 ); /* Never gets this far otherwise */ | 3410 assert( pParse->pVdbe!=0 ); /* Never gets this far otherwise */ |
| 3528 n = pList->nExpr; | 3411 n = pList->nExpr; |
| 3529 if( !ConstFactorOk(pParse) ) flags &= ~SQLITE_ECEL_FACTOR; | 3412 if( !ConstFactorOk(pParse) ) flags &= ~SQLITE_ECEL_FACTOR; |
| 3530 for(pItem=pList->a, i=0; i<n; i++, pItem++){ | 3413 for(pItem=pList->a, i=0; i<n; i++, pItem++){ |
| 3531 Expr *pExpr = pItem->pExpr; | 3414 Expr *pExpr = pItem->pExpr; |
| 3532 if( (flags & SQLITE_ECEL_FACTOR)!=0 && sqlite3ExprIsConstant(pExpr) ){ | 3415 if( (flags & SQLITE_ECEL_REF)!=0 && (j = pList->a[i].u.x.iOrderByCol)>0 ){ |
| 3416 sqlite3VdbeAddOp2(v, copyOp, j+srcReg-1, target+i); |
| 3417 }else if( (flags & SQLITE_ECEL_FACTOR)!=0 && sqlite3ExprIsConstant(pExpr) ){ |
| 3533 sqlite3ExprCodeAtInit(pParse, pExpr, target+i, 0); | 3418 sqlite3ExprCodeAtInit(pParse, pExpr, target+i, 0); |
| 3534 }else{ | 3419 }else{ |
| 3535 int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i); | 3420 int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i); |
| 3536 if( inReg!=target+i ){ | 3421 if( inReg!=target+i ){ |
| 3537 VdbeOp *pOp; | 3422 VdbeOp *pOp; |
| 3538 Vdbe *v = pParse->pVdbe; | |
| 3539 if( copyOp==OP_Copy | 3423 if( copyOp==OP_Copy |
| 3540 && (pOp=sqlite3VdbeGetOp(v, -1))->opcode==OP_Copy | 3424 && (pOp=sqlite3VdbeGetOp(v, -1))->opcode==OP_Copy |
| 3541 && pOp->p1+pOp->p3+1==inReg | 3425 && pOp->p1+pOp->p3+1==inReg |
| 3542 && pOp->p2+pOp->p3+1==target+i | 3426 && pOp->p2+pOp->p3+1==target+i |
| 3543 ){ | 3427 ){ |
| 3544 pOp->p3++; | 3428 pOp->p3++; |
| 3545 }else{ | 3429 }else{ |
| 3546 sqlite3VdbeAddOp2(v, copyOp, inReg, target+i); | 3430 sqlite3VdbeAddOp2(v, copyOp, inReg, target+i); |
| 3547 } | 3431 } |
| 3548 } | 3432 } |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3705 case TK_BETWEEN: { | 3589 case TK_BETWEEN: { |
| 3706 testcase( jumpIfNull==0 ); | 3590 testcase( jumpIfNull==0 ); |
| 3707 exprCodeBetween(pParse, pExpr, dest, 1, jumpIfNull); | 3591 exprCodeBetween(pParse, pExpr, dest, 1, jumpIfNull); |
| 3708 break; | 3592 break; |
| 3709 } | 3593 } |
| 3710 #ifndef SQLITE_OMIT_SUBQUERY | 3594 #ifndef SQLITE_OMIT_SUBQUERY |
| 3711 case TK_IN: { | 3595 case TK_IN: { |
| 3712 int destIfFalse = sqlite3VdbeMakeLabel(v); | 3596 int destIfFalse = sqlite3VdbeMakeLabel(v); |
| 3713 int destIfNull = jumpIfNull ? dest : destIfFalse; | 3597 int destIfNull = jumpIfNull ? dest : destIfFalse; |
| 3714 sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); | 3598 sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); |
| 3715 sqlite3VdbeAddOp2(v, OP_Goto, 0, dest); | 3599 sqlite3VdbeGoto(v, dest); |
| 3716 sqlite3VdbeResolveLabel(v, destIfFalse); | 3600 sqlite3VdbeResolveLabel(v, destIfFalse); |
| 3717 break; | 3601 break; |
| 3718 } | 3602 } |
| 3719 #endif | 3603 #endif |
| 3720 default: { | 3604 default: { |
| 3721 if( exprAlwaysTrue(pExpr) ){ | 3605 if( exprAlwaysTrue(pExpr) ){ |
| 3722 sqlite3VdbeAddOp2(v, OP_Goto, 0, dest); | 3606 sqlite3VdbeGoto(v, dest); |
| 3723 }else if( exprAlwaysFalse(pExpr) ){ | 3607 }else if( exprAlwaysFalse(pExpr) ){ |
| 3724 /* No-op */ | 3608 /* No-op */ |
| 3725 }else{ | 3609 }else{ |
| 3726 r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); | 3610 r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); |
| 3727 sqlite3VdbeAddOp3(v, OP_If, r1, dest, jumpIfNull!=0); | 3611 sqlite3VdbeAddOp3(v, OP_If, r1, dest, jumpIfNull!=0); |
| 3728 VdbeCoverage(v); | 3612 VdbeCoverage(v); |
| 3729 testcase( regFree1==0 ); | 3613 testcase( regFree1==0 ); |
| 3730 testcase( jumpIfNull==0 ); | 3614 testcase( jumpIfNull==0 ); |
| 3731 } | 3615 } |
| 3732 break; | 3616 break; |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3868 }else{ | 3752 }else{ |
| 3869 int destIfNull = sqlite3VdbeMakeLabel(v); | 3753 int destIfNull = sqlite3VdbeMakeLabel(v); |
| 3870 sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull); | 3754 sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull); |
| 3871 sqlite3VdbeResolveLabel(v, destIfNull); | 3755 sqlite3VdbeResolveLabel(v, destIfNull); |
| 3872 } | 3756 } |
| 3873 break; | 3757 break; |
| 3874 } | 3758 } |
| 3875 #endif | 3759 #endif |
| 3876 default: { | 3760 default: { |
| 3877 if( exprAlwaysFalse(pExpr) ){ | 3761 if( exprAlwaysFalse(pExpr) ){ |
| 3878 sqlite3VdbeAddOp2(v, OP_Goto, 0, dest); | 3762 sqlite3VdbeGoto(v, dest); |
| 3879 }else if( exprAlwaysTrue(pExpr) ){ | 3763 }else if( exprAlwaysTrue(pExpr) ){ |
| 3880 /* no-op */ | 3764 /* no-op */ |
| 3881 }else{ | 3765 }else{ |
| 3882 r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); | 3766 r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); |
| 3883 sqlite3VdbeAddOp3(v, OP_IfNot, r1, dest, jumpIfNull!=0); | 3767 sqlite3VdbeAddOp3(v, OP_IfNot, r1, dest, jumpIfNull!=0); |
| 3884 VdbeCoverage(v); | 3768 VdbeCoverage(v); |
| 3885 testcase( regFree1==0 ); | 3769 testcase( regFree1==0 ); |
| 3886 testcase( jumpIfNull==0 ); | 3770 testcase( jumpIfNull==0 ); |
| 3887 } | 3771 } |
| 3888 break; | 3772 break; |
| 3889 } | 3773 } |
| 3890 } | 3774 } |
| 3891 sqlite3ReleaseTempReg(pParse, regFree1); | 3775 sqlite3ReleaseTempReg(pParse, regFree1); |
| 3892 sqlite3ReleaseTempReg(pParse, regFree2); | 3776 sqlite3ReleaseTempReg(pParse, regFree2); |
| 3893 } | 3777 } |
| 3894 | 3778 |
| 3895 /* | 3779 /* |
| 3780 ** Like sqlite3ExprIfFalse() except that a copy is made of pExpr before |
| 3781 ** code generation, and that copy is deleted after code generation. This |
| 3782 ** ensures that the original pExpr is unchanged. |
| 3783 */ |
| 3784 void sqlite3ExprIfFalseDup(Parse *pParse, Expr *pExpr, int dest,int jumpIfNull){ |
| 3785 sqlite3 *db = pParse->db; |
| 3786 Expr *pCopy = sqlite3ExprDup(db, pExpr, 0); |
| 3787 if( db->mallocFailed==0 ){ |
| 3788 sqlite3ExprIfFalse(pParse, pCopy, dest, jumpIfNull); |
| 3789 } |
| 3790 sqlite3ExprDelete(db, pCopy); |
| 3791 } |
| 3792 |
| 3793 |
| 3794 /* |
| 3896 ** Do a deep comparison of two expression trees. Return 0 if the two | 3795 ** Do a deep comparison of two expression trees. Return 0 if the two |
| 3897 ** expressions are completely identical. Return 1 if they differ only | 3796 ** expressions are completely identical. Return 1 if they differ only |
| 3898 ** by a COLLATE operator at the top level. Return 2 if there are differences | 3797 ** by a COLLATE operator at the top level. Return 2 if there are differences |
| 3899 ** other than the top-level COLLATE operator. | 3798 ** other than the top-level COLLATE operator. |
| 3900 ** | 3799 ** |
| 3901 ** If any subelement of pB has Expr.iTable==(-1) then it is allowed | 3800 ** If any subelement of pB has Expr.iTable==(-1) then it is allowed |
| 3902 ** to compare equal to an equivalent element in pA with Expr.iTable==iTab. | 3801 ** to compare equal to an equivalent element in pA with Expr.iTable==iTab. |
| 3903 ** | 3802 ** |
| 3904 ** The pA side might be using TK_REGISTER. If that is the case and pB is | 3803 ** The pA side might be using TK_REGISTER. If that is the case and pB is |
| 3905 ** not using TK_REGISTER but is otherwise equivalent, then still return 0. | 3804 ** not using TK_REGISTER but is otherwise equivalent, then still return 0. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 3928 } | 3827 } |
| 3929 if( pA->op!=pB->op ){ | 3828 if( pA->op!=pB->op ){ |
| 3930 if( pA->op==TK_COLLATE && sqlite3ExprCompare(pA->pLeft, pB, iTab)<2 ){ | 3829 if( pA->op==TK_COLLATE && sqlite3ExprCompare(pA->pLeft, pB, iTab)<2 ){ |
| 3931 return 1; | 3830 return 1; |
| 3932 } | 3831 } |
| 3933 if( pB->op==TK_COLLATE && sqlite3ExprCompare(pA, pB->pLeft, iTab)<2 ){ | 3832 if( pB->op==TK_COLLATE && sqlite3ExprCompare(pA, pB->pLeft, iTab)<2 ){ |
| 3934 return 1; | 3833 return 1; |
| 3935 } | 3834 } |
| 3936 return 2; | 3835 return 2; |
| 3937 } | 3836 } |
| 3938 if( pA->op!=TK_COLUMN && ALWAYS(pA->op!=TK_AGG_COLUMN) && pA->u.zToken ){ | 3837 if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){ |
| 3939 if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ | 3838 if( pA->op==TK_FUNCTION ){ |
| 3839 if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; |
| 3840 }else if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ |
| 3940 return pA->op==TK_COLLATE ? 1 : 2; | 3841 return pA->op==TK_COLLATE ? 1 : 2; |
| 3941 } | 3842 } |
| 3942 } | 3843 } |
| 3943 if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2; | 3844 if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2; |
| 3944 if( ALWAYS((combinedFlags & EP_TokenOnly)==0) ){ | 3845 if( ALWAYS((combinedFlags & EP_TokenOnly)==0) ){ |
| 3945 if( combinedFlags & EP_xIsSelect ) return 2; | 3846 if( combinedFlags & EP_xIsSelect ) return 2; |
| 3946 if( sqlite3ExprCompare(pA->pLeft, pB->pLeft, iTab) ) return 2; | 3847 if( sqlite3ExprCompare(pA->pLeft, pB->pLeft, iTab) ) return 2; |
| 3947 if( sqlite3ExprCompare(pA->pRight, pB->pRight, iTab) ) return 2; | 3848 if( sqlite3ExprCompare(pA->pRight, pB->pRight, iTab) ) return 2; |
| 3948 if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList, iTab) ) return 2; | 3849 if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList, iTab) ) return 2; |
| 3949 if( ALWAYS((combinedFlags & EP_Reduced)==0) ){ | 3850 if( ALWAYS((combinedFlags & EP_Reduced)==0) && pA->op!=TK_STRING ){ |
| 3950 if( pA->iColumn!=pB->iColumn ) return 2; | 3851 if( pA->iColumn!=pB->iColumn ) return 2; |
| 3951 if( pA->iTable!=pB->iTable | 3852 if( pA->iTable!=pB->iTable |
| 3952 && (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2; | 3853 && (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2; |
| 3953 } | 3854 } |
| 3954 } | 3855 } |
| 3955 return 0; | 3856 return 0; |
| 3956 } | 3857 } |
| 3957 | 3858 |
| 3958 /* | 3859 /* |
| 3959 ** Compare two ExprList objects. Return 0 if they are identical and | 3860 ** Compare two ExprList objects. Return 0 if they are identical and |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4041 static int exprSrcCount(Walker *pWalker, Expr *pExpr){ | 3942 static int exprSrcCount(Walker *pWalker, Expr *pExpr){ |
| 4042 /* The NEVER() on the second term is because sqlite3FunctionUsesThisSrc() | 3943 /* The NEVER() on the second term is because sqlite3FunctionUsesThisSrc() |
| 4043 ** is always called before sqlite3ExprAnalyzeAggregates() and so the | 3944 ** is always called before sqlite3ExprAnalyzeAggregates() and so the |
| 4044 ** TK_COLUMNs have not yet been converted into TK_AGG_COLUMN. If | 3945 ** TK_COLUMNs have not yet been converted into TK_AGG_COLUMN. If |
| 4045 ** sqlite3FunctionUsesThisSrc() is used differently in the future, the | 3946 ** sqlite3FunctionUsesThisSrc() is used differently in the future, the |
| 4046 ** NEVER() will need to be removed. */ | 3947 ** NEVER() will need to be removed. */ |
| 4047 if( pExpr->op==TK_COLUMN || NEVER(pExpr->op==TK_AGG_COLUMN) ){ | 3948 if( pExpr->op==TK_COLUMN || NEVER(pExpr->op==TK_AGG_COLUMN) ){ |
| 4048 int i; | 3949 int i; |
| 4049 struct SrcCount *p = pWalker->u.pSrcCount; | 3950 struct SrcCount *p = pWalker->u.pSrcCount; |
| 4050 SrcList *pSrc = p->pSrc; | 3951 SrcList *pSrc = p->pSrc; |
| 4051 for(i=0; i<pSrc->nSrc; i++){ | 3952 int nSrc = pSrc ? pSrc->nSrc : 0; |
| 3953 for(i=0; i<nSrc; i++){ |
| 4052 if( pExpr->iTable==pSrc->a[i].iCursor ) break; | 3954 if( pExpr->iTable==pSrc->a[i].iCursor ) break; |
| 4053 } | 3955 } |
| 4054 if( i<pSrc->nSrc ){ | 3956 if( i<nSrc ){ |
| 4055 p->nThis++; | 3957 p->nThis++; |
| 4056 }else{ | 3958 }else{ |
| 4057 p->nOther++; | 3959 p->nOther++; |
| 4058 } | 3960 } |
| 4059 } | 3961 } |
| 4060 return WRC_Continue; | 3962 return WRC_Continue; |
| 4061 } | 3963 } |
| 4062 | 3964 |
| 4063 /* | 3965 /* |
| 4064 ** Determine if any of the arguments to the pExpr Function reference | 3966 ** Determine if any of the arguments to the pExpr Function reference |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4340 } | 4242 } |
| 4341 } | 4243 } |
| 4342 | 4244 |
| 4343 /* | 4245 /* |
| 4344 ** Mark all temporary registers as being unavailable for reuse. | 4246 ** Mark all temporary registers as being unavailable for reuse. |
| 4345 */ | 4247 */ |
| 4346 void sqlite3ClearTempRegCache(Parse *pParse){ | 4248 void sqlite3ClearTempRegCache(Parse *pParse){ |
| 4347 pParse->nTempReg = 0; | 4249 pParse->nTempReg = 0; |
| 4348 pParse->nRangeReg = 0; | 4250 pParse->nRangeReg = 0; |
| 4349 } | 4251 } |
| OLD | NEW |