15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2001 September 15
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code.  In place of
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you do good and not evil.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you find forgiveness for yourself and forgive others.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you share freely, never taking more than you give.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*************************************************************************
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains routines used for analyzing expressions and
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for generating VDBE code that evaluates expressions in SQLite.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the 'affinity' of the expression pExpr if any.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If pExpr is a column, a reference to a column via an 'AS' alias,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or a sub-select with a column as the return value, then the
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** affinity of that column is returned. Otherwise, 0x00 is returned,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** indicating no affinity for the expression.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** i.e. the WHERE clause expresssions in the following statements all
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** have an affinity:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** CREATE TABLE t1(a);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT * FROM t1 WHERE a;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT a AS b FROM t1 WHERE b;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT * FROM t1 WHERE (select a from t1);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char sqlite3ExprAffinity(Expr *pExpr){
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int op = pExpr->op;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( op==TK_SELECT ){
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pExpr->flags&EP_xIsSelect );
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_CAST
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( op==TK_CAST ){
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( !ExprHasProperty(pExpr, EP_IntValue) );
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return sqlite3AffinityType(pExpr->u.zToken);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_REGISTER)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   && pExpr->pTab!=0
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ){
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* op==TK_REGISTER && pExpr->pTab!=0 happens when pExpr was originally
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** a TK_COLUMN but was previously evaluated and cached in a register */
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int j = pExpr->iColumn;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( j<0 ) return SQLITE_AFF_INTEGER;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pExpr->pTab && j<pExpr->pTab->nCol );
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pExpr->pTab->aCol[j].affinity;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pExpr->affinity;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the explicit collating sequence for an expression to the
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** collating sequence supplied in the second argument.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3ExprSetColl(Expr *pExpr, CollSeq *pColl){
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pExpr && pColl ){
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pExpr->pColl = pColl;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pExpr->flags |= EP_ExpCollate;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pExpr;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the collating sequence for expression pExpr to be the collating
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sequence named by pToken.   Return a pointer to the revised expression.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The collating sequence is marked as "explicit" using the EP_ExpCollate
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** flag.  An explicit collating sequence will override implicit
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** collating sequences.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3ExprSetCollByToken(Parse *pParse, Expr *pExpr, Token *pCollName){
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zColl = 0;            /* Dequoted name of collation sequence */
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CollSeq *pColl;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zColl = sqlite3NameFromToken(db, pCollName);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pColl = sqlite3LocateCollSeq(pParse, zColl);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprSetColl(pExpr, pColl);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, zColl);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pExpr;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the default collation sequence for the expression pExpr. If
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** there is no default collation type, return 0.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CollSeq *pColl = 0;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *p = pExpr;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( p ){
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int op;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pColl = p->pColl;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pColl ) break;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    op = p->op;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->pTab!=0 && (
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_REGISTER || op==TK_TRIGGER
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    )){
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* op==TK_REGISTER && p->pTab!=0 happens when pExpr was originally
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** a TK_COLUMN but was previously evaluated and cached in a register */
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char *zColl;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int j = p->iColumn;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( j>=0 ){
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3 *db = pParse->db;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zColl = p->pTab->aCol[j].zColl;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pExpr->pColl = pColl;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( op!=TK_CAST && op!=TK_UPLUS ){
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p = p->pLeft;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3CheckCollSeq(pParse, pColl) ){
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pColl = 0;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pColl;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pExpr is an operand of a comparison operator.  aff2 is the
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** type affinity of the other operand.  This routine returns the
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** type affinity that should be used for the comparison operator.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char sqlite3CompareAffinity(Expr *pExpr, char aff2){
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char aff1 = sqlite3ExprAffinity(pExpr);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( aff1 && aff2 ){
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Both sides of the comparison are columns. If one has numeric
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** affinity, use that. Otherwise use no affinity.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2) ){
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return SQLITE_AFF_NUMERIC;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return SQLITE_AFF_NONE;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( !aff1 && !aff2 ){
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Neither side of the comparison is a column.  Compare the
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** results directly.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_AFF_NONE;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* One side is a column, the other is not. Use the columns affinity. */
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( aff1==0 || aff2==0 );
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (aff1 + aff2);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pExpr is a comparison operator.  Return the type affinity that should
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be applied to both operands prior to doing the comparison.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char comparisonAffinity(Expr *pExpr){
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char aff;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pExpr->op==TK_EQ || pExpr->op==TK_IN || pExpr->op==TK_LT ||
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE ||
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pExpr->op==TK_NE || pExpr->op==TK_IS || pExpr->op==TK_ISNOT );
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pExpr->pLeft );
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aff = sqlite3ExprAffinity(pExpr->pLeft);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pExpr->pRight ){
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aff = sqlite3CompareAffinity(pExpr->pRight, aff);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aff = sqlite3CompareAffinity(pExpr->x.pSelect->pEList->a[0].pExpr, aff);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( !aff ){
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aff = SQLITE_AFF_NONE;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return aff;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pExpr is a comparison expression, eg. '=', '<', IN(...) etc.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** idx_affinity is the affinity of an indexed column. Return true
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if the index with affinity idx_affinity may be used to implement
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the comparison in pExpr.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char aff = comparisonAffinity(pExpr);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( aff ){
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_AFF_NONE:
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SQLITE_AFF_TEXT:
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return idx_affinity==SQLITE_AFF_TEXT;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return sqlite3IsNumericAffinity(idx_affinity);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the P5 value that should be used for a binary comparison
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** opcode (OP_Eq, OP_Ge etc.) used to compare pExpr1 and pExpr2.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static u8 binaryCompareP5(Expr *pExpr1, Expr *pExpr2, int jumpIfNull){
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 aff = (char)sqlite3ExprAffinity(pExpr2);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aff = (u8)sqlite3CompareAffinity(pExpr1, aff) | (u8)jumpIfNull;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return aff;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a pointer to the collation sequence that should be used by
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a binary comparison operator comparing pLeft and pRight.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the left hand expression has a collating sequence type, then it is
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** used. Otherwise the collation sequence for the right hand expression
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is used, or the default (BINARY) if neither expression has a collating
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** type.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Argument pRight (but not pLeft) may be a null pointer. In this case,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it is not considered.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CollSeq *sqlite3BinaryCompareCollSeq(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pLeft,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pRight
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CollSeq *pColl;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pLeft );
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pLeft->flags & EP_ExpCollate ){
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pLeft->pColl );
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pColl = pLeft->pColl;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( pRight && pRight->flags & EP_ExpCollate ){
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pRight->pColl );
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pColl = pRight->pColl;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pColl = sqlite3ExprCollSeq(pParse, pLeft);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !pColl ){
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pColl = sqlite3ExprCollSeq(pParse, pRight);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pColl;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code for a comparison operator.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int codeCompare(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,    /* The parsing (and code generating) context */
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pLeft,      /* The left operand */
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pRight,     /* The right operand */
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int opcode,       /* The comparison opcode */
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int in1, int in2, /* Register holding operands */
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int dest,         /* Jump here if true.  */
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int jumpIfNull    /* If true, jump if either operand is NULL */
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int p5;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int addr;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CollSeq *p4;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p4 = sqlite3BinaryCompareCollSeq(pParse, pLeft, pRight);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p5 = binaryCompareP5(pLeft, pRight, jumpIfNull);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  addr = sqlite3VdbeAddOp4(pParse->pVdbe, opcode, in2, dest, in1,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           (void*)p4, P4_COLLSEQ);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeChangeP5(pParse->pVdbe, (u8)p5);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return addr;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_MAX_EXPR_DEPTH>0
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Check that argument nHeight is less than or equal to the maximum
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression depth allowed. If it is not, leave an error message in
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pParse.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCheckHeight(Parse *pParse, int nHeight){
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc = SQLITE_OK;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int mxHeight = pParse->db->aLimit[SQLITE_LIMIT_EXPR_DEPTH];
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( nHeight>mxHeight ){
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "Expression tree is too large (maximum depth %d)", mxHeight
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    );
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_ERROR;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The following three functions, heightOfExpr(), heightOfExprList()
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and heightOfSelect(), are used to determine the maximum height
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of any expression tree referenced by the structure passed as the
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** first argument.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If this maximum height is greater than the current value pointed
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to by pnHeight, the second parameter, then set *pnHeight to that
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void heightOfExpr(Expr *p, int *pnHeight){
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p ){
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->nHeight>*pnHeight ){
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *pnHeight = p->nHeight;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void heightOfExprList(ExprList *p, int *pnHeight){
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p ){
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<p->nExpr; i++){
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      heightOfExpr(p->a[i].pExpr, pnHeight);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void heightOfSelect(Select *p, int *pnHeight){
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p ){
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    heightOfExpr(p->pWhere, pnHeight);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    heightOfExpr(p->pHaving, pnHeight);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    heightOfExpr(p->pLimit, pnHeight);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    heightOfExpr(p->pOffset, pnHeight);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    heightOfExprList(p->pEList, pnHeight);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    heightOfExprList(p->pGroupBy, pnHeight);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    heightOfExprList(p->pOrderBy, pnHeight);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    heightOfSelect(p->pPrior, pnHeight);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the Expr.nHeight variable in the structure passed as an
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** argument. An expression with no children, Expr.pList or
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Expr.pSelect member has a height of 1. Any other expression
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** has a height equal to the maximum height of any other
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** referenced Expr plus one.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void exprSetHeight(Expr *p){
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nHeight = 0;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  heightOfExpr(p->pLeft, &nHeight);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  heightOfExpr(p->pRight, &nHeight);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ExprHasProperty(p, EP_xIsSelect) ){
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    heightOfSelect(p->x.pSelect, &nHeight);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    heightOfExprList(p->x.pList, &nHeight);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->nHeight = nHeight + 1;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the Expr.nHeight variable using the exprSetHeight() function. If
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the height is greater than the maximum allowed expression depth,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** leave an error in pParse.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprSetHeight(Parse *pParse, Expr *p){
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exprSetHeight(p);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprCheckHeight(pParse, p->nHeight);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the maximum height of any expression tree referenced
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by the select statement passed as an argument.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3SelectExprHeight(Select *p){
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nHeight = 0;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  heightOfSelect(p, &nHeight);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return nHeight;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define exprSetHeight(y)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_MAX_EXPR_DEPTH>0 */
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is the core allocator for Expr nodes.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Construct a new expression node and return a pointer to it.  Memory
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for this node and for the pToken argument is a single allocation
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** obtained from sqlite3DbMalloc().  The calling function
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is responsible for making sure the node eventually gets freed.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If dequote is true, then the token (if it exists) is dequoted.
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If dequote is false, no dequoting is performance.  The deQuote
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parameter is ignored if pToken is NULL or if the token does not
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** appear to be quoted.  If the quotes were of the form "..." (double-quotes)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then the EP_DblQuoted flag is set on the expression node.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Special case:  If op==TK_INTEGER and pToken points to a string that
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** can be translated into a 32-bit integer, then the token is not
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** stored in u.zToken.  Instead, the integer values is written
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** into u.iValue and the EP_IntValue flag is set.  No extra storage
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is allocated to hold the integer text and the dequote flag is ignored.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3ExprAlloc(
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db,            /* Handle for sqlite3DbMallocZero() (may be null) */
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int op,                 /* Expression opcode */
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Token *pToken,    /* Token argument.  Might be NULL */
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int dequote             /* True to dequote */
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pNew;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nExtra = 0;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iValue = 0;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pToken ){
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( op!=TK_INTEGER || pToken->z==0
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          || sqlite3GetInt32(pToken->z, &iValue)==0 ){
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nExtra = pToken->n+1;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( iValue>=0 );
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew = sqlite3DbMallocZero(db, sizeof(Expr)+nExtra);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pNew ){
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNew->op = (u8)op;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNew->iAgg = -1;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pToken ){
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( nExtra==0 ){
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pNew->flags |= EP_IntValue;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pNew->u.iValue = iValue;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int c;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pNew->u.zToken = (char*)&pNew[1];
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        memcpy(pNew->u.zToken, pToken->z, pToken->n);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pNew->u.zToken[pToken->n] = 0;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( dequote && nExtra>=3
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             && ((c = pToken->z[0])=='\'' || c=='"' || c=='[' || c=='`') ){
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3Dequote(pNew->u.zToken);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( c=='"' ) pNew->flags |= EP_DblQuoted;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_MAX_EXPR_DEPTH>0
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNew->nHeight = 1;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pNew;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate a new expression node from a zero-terminated token that has
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** already been dequoted.
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3Expr(
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db,            /* Handle for sqlite3DbMallocZero() (may be null) */
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int op,                 /* Expression opcode */
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zToken      /* Token argument.  Might be NULL */
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token x;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  x.z = zToken;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  x.n = zToken ? sqlite3Strlen30(zToken) : 0;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sqlite3ExprAlloc(db, op, &x, 0);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Attach subtrees pLeft and pRight to the Expr node pRoot.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If pRoot==NULL that means that a memory allocation error has occurred.
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** In that case, delete the subtrees pLeft and pRight.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprAttachSubtrees(
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db,
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pRoot,
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pLeft,
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pRight
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pRoot==0 ){
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( db->mallocFailed );
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExprDelete(db, pLeft);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExprDelete(db, pRight);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pRight ){
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pRoot->pRight = pRight;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pRight->flags & EP_ExpCollate ){
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pRoot->flags |= EP_ExpCollate;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pRoot->pColl = pRight->pColl;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pLeft ){
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pRoot->pLeft = pLeft;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pLeft->flags & EP_ExpCollate ){
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pRoot->flags |= EP_ExpCollate;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pRoot->pColl = pLeft->pColl;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exprSetHeight(pRoot);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate a Expr node which joins as many as two subtrees.
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** One or both of the subtrees can be NULL.  Return a pointer to the new
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Expr node.  Or, if an OOM error occurs, set pParse->db->mallocFailed,
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** free the subtrees and return NULL.
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3PExpr(
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,          /* Parsing context */
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int op,                 /* Expression opcode */
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pLeft,            /* Left operand */
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pRight,           /* Right operand */
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Token *pToken     /* Argument token */
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *p = sqlite3ExprAlloc(pParse->db, op, pToken, 1);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p ) {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExprCheckHeight(pParse, p->nHeight);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return p;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Join two expressions using an AND operator.  If either expression is
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL, then just return the other expression.
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3ExprAnd(sqlite3 *db, Expr *pLeft, Expr *pRight){
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pLeft==0 ){
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pRight;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( pRight==0 ){
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pLeft;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Expr *pNew = sqlite3ExprAlloc(db, TK_AND, 0, 0);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExprAttachSubtrees(db, pNew, pLeft, pRight);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pNew;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Construct a new expression node for a function with multiple
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** arguments.
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token *pToken){
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pNew;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pToken );
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew = sqlite3ExprAlloc(db, TK_FUNCTION, pToken, 1);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pNew==0 ){
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->x.pList = pList;
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( !ExprHasProperty(pNew, EP_xIsSelect) );
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprSetHeight(pParse, pNew);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pNew;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Assign a variable number to an expression that encodes a wildcard
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the original SQL statement.
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Wildcards consisting of a single "?" are assigned the next sequential
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** variable number.
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Wildcards of the form "?nnn" are assigned the number "nnn".  We make
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sure "nnn" is not too be to avoid a denial of service attack when
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the SQL statement comes from an external source.
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Wildcards of the form ":aaa", "@aaa", or "$aaa" are assigned the same number
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** as the previous instance of the same wildcard.  Or if this is the first
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** instance of the wildcard, the next sequenial variable number is
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** assigned.
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *z;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pExpr==0 ) return;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( !ExprHasAnyProperty(pExpr, EP_IntValue|EP_Reduced|EP_TokenOnly) );
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z = pExpr->u.zToken;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( z!=0 );
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( z[0]!=0 );
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( z[1]==0 ){
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Wildcard of the form "?".  Assign the next variable number */
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( z[0]=='?' );
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pExpr->iColumn = (ynVar)(++pParse->nVar);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( z[0]=='?' ){
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Wildcard of the form "?nnn".  Convert "nnn" to an integer and
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** use it as the variable number */
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i64 i;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int bOk = 0==sqlite3Atoi64(&z[1], &i, sqlite3Strlen30(&z[1]), SQLITE_UTF8);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pExpr->iColumn = (ynVar)i;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase( i==0 );
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase( i==1 );
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]-1 );
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] );
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( bOk==0 || i<1 || i>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d",
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( i>pParse->nVar ){
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pParse->nVar = (int)i;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Wildcards like ":aaa", "$aaa" or "@aaa".  Reuse the same variable
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** number as the prior appearance of the same name, or if the name
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** has never appeared before, reuse the same variable number
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<pParse->nVarExpr; i++){
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Expr *pE = pParse->apVarExpr[i];
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pE!=0 );
584b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      if( strcmp(pE->u.zToken, z)==0 ){
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pExpr->iColumn = pE->iColumn;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( i>=pParse->nVarExpr ){
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pExpr->iColumn = (ynVar)(++pParse->nVar);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pParse->nVarExpr>=pParse->nVarExprAlloc-1 ){
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pParse->nVarExprAlloc += pParse->nVarExprAlloc + 10;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pParse->apVarExpr =
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sqlite3DbReallocOrFree(
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              db,
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pParse->apVarExpr,
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pParse->nVarExprAlloc*sizeof(pParse->apVarExpr[0])
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            );
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( !db->mallocFailed ){
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( pParse->apVarExpr!=0 );
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pParse->apVarExpr[pParse->nVarExpr++] = pExpr;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !pParse->nErr && pParse->nVar>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "too many SQL variables");
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Recursively delete an expression tree.
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprDelete(sqlite3 *db, Expr *p){
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 ) return;
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Sanity check: Assert that the IntValue is non-negative if it exists */
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( !ExprHasProperty(p, EP_IntValue) || p->u.iValue>=0 );
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !ExprHasAnyProperty(p, EP_TokenOnly) ){
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExprDelete(db, p->pLeft);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExprDelete(db, p->pRight);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !ExprHasProperty(p, EP_Reduced) && (p->flags2 & EP2_MallocedToken)!=0 ){
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(db, p->u.zToken);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( ExprHasProperty(p, EP_xIsSelect) ){
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3SelectDelete(db, p->x.pSelect);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprListDelete(db, p->x.pList);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !ExprHasProperty(p, EP_Static) ){
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, p);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of bytes allocated for the expression structure
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** passed as the first argument. This is always one of EXPR_FULLSIZE,
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EXPR_REDUCEDSIZE or EXPR_TOKENONLYSIZE.
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int exprStructSize(Expr *p){
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ExprHasProperty(p, EP_TokenOnly) ) return EXPR_TOKENONLYSIZE;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ExprHasProperty(p, EP_Reduced) ) return EXPR_REDUCEDSIZE;
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return EXPR_FULLSIZE;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The dupedExpr*Size() routines each return the number of bytes required
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to store a copy of an expression or expression tree.  They differ in
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** how much of the tree is measured.
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     dupedExprStructSize()     Size of only the Expr structure
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     dupedExprNodeSize()       Size of Expr + space for token
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     dupedExprSize()           Expr + token + subtree components
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)***************************************************************************
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The dupedExprStructSize() function returns two values OR-ed together:
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (1) the space required for a copy of the Expr structure only and
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (2) the EP_xxx flags that indicate what the structure size should be.
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The return values is always one of:
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**      EXPR_FULLSIZE
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**      EXPR_REDUCEDSIZE   | EP_Reduced
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**      EXPR_TOKENONLYSIZE | EP_TokenOnly
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The size of the structure can be found by masking the return value
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of this routine with 0xfff.  The flags can be found by masking the
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** return value with EP_Reduced|EP_TokenOnly.
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Note that with flags==EXPRDUP_REDUCE, this routines works on full-size
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (unreduced) Expr objects as they or originally constructed by the parser.
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** During expression analysis, extra information is computed and moved into
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** later parts of teh Expr object and that extra information might get chopped
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** off if the expression is reduced.  Note also that it does not work to
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** make a EXPRDUP_REDUCE copy of a reduced expression.  It is only legal
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to reduce a pristine expression tree from the parser.  The implementation
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of dupedExprStructSize() contain multiple assert() statements that attempt
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to enforce this constraint.
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int dupedExprStructSize(Expr *p, int flags){
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nSize;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( 0==(flags&EXPRDUP_REDUCE) ){
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nSize = EXPR_FULLSIZE;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( !ExprHasAnyProperty(p, EP_TokenOnly|EP_Reduced) );
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( !ExprHasProperty(p, EP_FromJoin) );
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( (p->flags2 & EP2_MallocedToken)==0 );
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( (p->flags2 & EP2_Irreducible)==0 );
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->pLeft || p->pRight || p->pColl || p->x.pList ){
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nSize = EXPR_REDUCEDSIZE | EP_Reduced;
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nSize = EXPR_TOKENONLYSIZE | EP_TokenOnly;
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return nSize;
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function returns the space in bytes required to store the copy
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the Expr structure and a copy of the Expr.u.zToken string (if that
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** string is defined.)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int dupedExprNodeSize(Expr *p, int flags){
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nByte = dupedExprStructSize(p, flags) & 0xfff;
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nByte += sqlite3Strlen30(p->u.zToken)+1;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ROUND8(nByte);
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of bytes required to create a duplicate of the
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression passed as the first argument. The second argument is a
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** mask containing EXPRDUP_XXX flags.
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The value returned includes space to create a copy of the Expr struct
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** itself and the buffer referred to by Expr.u.zToken, if any.
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the EXPRDUP_REDUCE flag is set, then the return value includes
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** space to duplicate all Expr nodes in the tree formed by Expr.pLeft
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and Expr.pRight variables (but not for any structures pointed to or
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** descended from the Expr.x.pList or Expr.x.pSelect variables).
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int dupedExprSize(Expr *p, int flags){
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nByte = 0;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p ){
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nByte = dupedExprNodeSize(p, flags);
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( flags&EXPRDUP_REDUCE ){
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nByte += dupedExprSize(p->pLeft, flags) + dupedExprSize(p->pRight, flags);
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return nByte;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is similar to sqlite3ExprDup(), except that if pzBuffer
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is not NULL then *pzBuffer is assumed to point to a buffer large enough
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to store the copy of expression p, the copies of p->u.zToken
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (if applicable), and the copies of the p->pLeft and p->pRight expressions,
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if any. Before returning, *pzBuffer is set to the first byte passed the
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** portion of the buffer copied into by this function.
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Expr *exprDup(sqlite3 *db, Expr *p, int flags, u8 **pzBuffer){
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pNew = 0;                      /* Value to return */
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p ){
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int isReduced = (flags&EXPRDUP_REDUCE);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    u8 *zAlloc;
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    u32 staticFlag = 0;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pzBuffer==0 || isReduced );
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Figure out where to write the new Expr structure. */
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pzBuffer ){
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zAlloc = *pzBuffer;
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      staticFlag = EP_Static;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zAlloc = sqlite3DbMallocRaw(db, dupedExprSize(p, flags));
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNew = (Expr *)zAlloc;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pNew ){
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Set nNewSize to the size allocated for the structure pointed to
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** by pNew. This is either EXPR_FULLSIZE, EXPR_REDUCEDSIZE or
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** EXPR_TOKENONLYSIZE. nToken is set to the number of bytes consumed
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** by the copy of the p->u.zToken string (if any).
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const unsigned nStructSize = dupedExprStructSize(p, flags);
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const int nNewSize = nStructSize & 0xfff;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int nToken;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nToken = sqlite3Strlen30(p->u.zToken) + 1;
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nToken = 0;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( isReduced ){
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( ExprHasProperty(p, EP_Reduced)==0 );
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        memcpy(zAlloc, p, nNewSize);
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int nSize = exprStructSize(p);
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        memcpy(zAlloc, p, nSize);
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( EXPR_FULLSIZE>nSize ){
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          memset(&zAlloc[nSize], 0, EXPR_FULLSIZE-nSize);
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Set the EP_Reduced, EP_TokenOnly, and EP_Static flags appropriately. */
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_Static);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pNew->flags |= staticFlag;
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Copy the p->u.zToken string, if any. */
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( nToken ){
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        char *zToken = pNew->u.zToken = (char*)&zAlloc[nNewSize];
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        memcpy(zToken, p->u.zToken, nToken);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( 0==((p->flags|pNew->flags) & EP_TokenOnly) ){
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Fill in the pNew->x.pSelect or pNew->x.pList member. */
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( ExprHasProperty(p, EP_xIsSelect) ){
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, isReduced);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, isReduced);
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Fill in pNew->pLeft and pNew->pRight. */
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( ExprHasAnyProperty(pNew, EP_Reduced|EP_TokenOnly) ){
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zAlloc += dupedExprNodeSize(p, flags);
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( ExprHasProperty(pNew, EP_Reduced) ){
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pNew->pLeft = exprDup(db, p->pLeft, EXPRDUP_REDUCE, &zAlloc);
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pNew->pRight = exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc);
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( pzBuffer ){
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *pzBuffer = zAlloc;
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pNew->flags2 = 0;
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( !ExprHasAnyProperty(p, EP_TokenOnly) ){
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pNew->pRight = sqlite3ExprDup(db, p->pRight, 0);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pNew;
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following group of routines make deep copies of expressions,
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression lists, ID lists, and select statements.  The copies can
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be deleted (by being passed to their respective ...Delete() routines)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** without effecting the originals.
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The expression list, ID, and source lists return by sqlite3ExprListDup(),
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3IdListDup(), and sqlite3SrcListDup() can not be further expanded
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by subsequent calls to sqlite*ListAppend() routines.
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Any tables that the SrcList might point to are not duplicated.
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The flags parameter contains a combination of the EXPRDUP_XXX flags.
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the EXPRDUP_REDUCE flag is set, then the structure returned is a
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** truncated version of the usual Expr structure that will be stored as
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** part of the in-memory representation of the database schema.
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3ExprDup(sqlite3 *db, Expr *p, int flags){
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return exprDup(db, p, flags, 0);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExprList *pNew;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ExprList_item *pItem, *pOldItem;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 ) return 0;
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew = sqlite3DbMallocRaw(db, sizeof(*pNew) );
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pNew==0 ) return 0;
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->iECursor = 0;
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->nExpr = pNew->nAlloc = p->nExpr;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->a = pItem = sqlite3DbMallocRaw(db,  p->nExpr*sizeof(p->a[0]) );
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pItem==0 ){
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, pNew);
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOldItem = p->a;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<p->nExpr; i++, pItem++, pOldItem++){
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Expr *pOldExpr = pOldItem->pExpr;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pItem->pExpr = sqlite3ExprDup(db, pOldExpr, flags);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pItem->zName = sqlite3DbStrDup(db, pOldItem->zName);
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan);
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pItem->sortOrder = pOldItem->sortOrder;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pItem->done = 0;
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pItem->iCol = pOldItem->iCol;
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pItem->iAlias = pOldItem->iAlias;
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pNew;
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If cursors, triggers, views and subqueries are all omitted from
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the build, then none of the following routines, except for
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3SelectDup(), can be called. sqlite3SelectDup() is sometimes
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** called with a NULL argument.
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) \
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || !defined(SQLITE_OMIT_SUBQUERY)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SrcList *pNew;
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nByte;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 ) return 0;
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew = sqlite3DbMallocRaw(db, nByte );
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pNew==0 ) return 0;
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->nSrc = pNew->nAlloc = p->nSrc;
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<p->nSrc; i++){
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct SrcList_item *pNewItem = &pNew->a[i];
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct SrcList_item *pOldItem = &p->a[i];
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Table *pTab;
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase);
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName);
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->zAlias = sqlite3DbStrDup(db, pOldItem->zAlias);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->jointype = pOldItem->jointype;
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->iCursor = pOldItem->iCursor;
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->isPopulated = pOldItem->isPopulated;
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->zIndex = sqlite3DbStrDup(db, pOldItem->zIndex);
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->notIndexed = pOldItem->notIndexed;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->pIndex = pOldItem->pIndex;
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTab = pNewItem->pTab = pOldItem->pTab;
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pTab ){
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pTab->nRef++;
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags);
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn, flags);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->pUsing = sqlite3IdListDup(db, pOldItem->pUsing);
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->colUsed = pOldItem->colUsed;
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pNew;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IdList *pNew;
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 ) return 0;
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew = sqlite3DbMallocRaw(db, sizeof(*pNew) );
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pNew==0 ) return 0;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->nId = pNew->nAlloc = p->nId;
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->a = sqlite3DbMallocRaw(db, p->nId*sizeof(p->a[0]) );
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pNew->a==0 ){
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, pNew);
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<p->nId; i++){
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct IdList_item *pNewItem = &pNew->a[i];
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct IdList_item *pOldItem = &p->a[i];
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName);
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNewItem->idx = pOldItem->idx;
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pNew;
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Select *pNew;
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 ) return 0;
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew = sqlite3DbMallocRaw(db, sizeof(*p) );
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pNew==0 ) return 0;
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->pEList = sqlite3ExprListDup(db, p->pEList, flags);
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->pSrc = sqlite3SrcListDup(db, p->pSrc, flags);
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->pWhere = sqlite3ExprDup(db, p->pWhere, flags);
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->pGroupBy = sqlite3ExprListDup(db, p->pGroupBy, flags);
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->pHaving = sqlite3ExprDup(db, p->pHaving, flags);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, flags);
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->op = p->op;
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->pPrior = sqlite3SelectDup(db, p->pPrior, flags);
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->pLimit = sqlite3ExprDup(db, p->pLimit, flags);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->pOffset = sqlite3ExprDup(db, p->pOffset, flags);
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->iLimit = 0;
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->iOffset = 0;
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->selFlags = p->selFlags & ~SF_UsesEphemeral;
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->pRightmost = 0;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->addrOpenEphm[0] = -1;
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->addrOpenEphm[1] = -1;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNew->addrOpenEphm[2] = -1;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pNew;
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p==0 );
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add a new element to the end of an expression list.  If pList is
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** initially NULL, then create a new expression list.
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If a memory allocation error occurs, the entire list is freed and
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL is returned.  If non-NULL is returned, then it is guaranteed
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that the new entry was successfully appended.
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExprList *sqlite3ExprListAppend(
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,          /* Parsing context */
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExprList *pList,        /* List to which to append. Might be NULL */
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pExpr             /* Expression to be appended. Might be NULL */
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pList==0 ){
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pList = sqlite3DbMallocZero(db, sizeof(ExprList) );
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pList==0 ){
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto no_mem;
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pList->nAlloc==0 );
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pList->nAlloc<=pList->nExpr ){
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct ExprList_item *a;
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int n = pList->nAlloc*2 + 4;
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a = sqlite3DbRealloc(db, pList->a, n*sizeof(pList->a[0]));
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( a==0 ){
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto no_mem;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pList->a = a;
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pList->nAlloc = sqlite3DbMallocSize(db, a)/sizeof(a[0]);
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pList->a!=0 );
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( 1 ){
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct ExprList_item *pItem = &pList->a[pList->nExpr++];
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(pItem, 0, sizeof(*pItem));
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pItem->pExpr = pExpr;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pList;
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)no_mem:
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Avoid leaking memory if malloc has failed. */
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprDelete(db, pExpr);
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprListDelete(db, pList);
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the ExprList.a[].zName element of the most recently added item
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** on the expression list.
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pList might be NULL following an OOM error.  But pName should never be
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL.  If a memory allocation fails, the pParse->db->mallocFailed flag
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is set.
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprListSetName(
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,          /* Parsing context */
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExprList *pList,        /* List to which to add the span. */
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pName,           /* Name to be added */
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int dequote             /* True to cause the name to be dequoted */
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pList!=0 || pParse->db->mallocFailed!=0 );
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pList ){
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct ExprList_item *pItem;
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pList->nExpr>0 );
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pItem = &pList->a[pList->nExpr-1];
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pItem->zName==0 );
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pItem->zName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n);
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( dequote && pItem->zName ) sqlite3Dequote(pItem->zName);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the ExprList.a[].zSpan element of the most recently added item
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** on the expression list.
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pList might be NULL following an OOM error.  But pSpan should never be
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL.  If a memory allocation fails, the pParse->db->mallocFailed flag
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is set.
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprListSetSpan(
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,          /* Parsing context */
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExprList *pList,        /* List to which to add the span. */
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExprSpan *pSpan         /* The span to be added */
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pList!=0 || db->mallocFailed!=0 );
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pList ){
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct ExprList_item *pItem = &pList->a[pList->nExpr-1];
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pList->nExpr>0 );
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( db->mallocFailed || pItem->pExpr==pSpan->pExpr );
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, pItem->zSpan);
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pItem->zSpan = sqlite3DbStrNDup(db, (char*)pSpan->zStart,
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    (int)(pSpan->zEnd - pSpan->zStart));
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the expression list pEList contains more than iLimit elements,
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** leave an error message in pParse.
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprListCheckLength(
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExprList *pEList,
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zObject
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int mx = pParse->db->aLimit[SQLITE_LIMIT_COLUMN];
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( pEList && pEList->nExpr==mx );
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( pEList && pEList->nExpr==mx+1 );
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pEList && pEList->nExpr>mx ){
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "too many columns in %s", zObject);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete an entire expression list.
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ExprList_item *pItem;
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pList==0 ) return;
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pList->a!=0 || (pList->nExpr==0 && pList->nAlloc==0) );
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pList->nExpr<=pList->nAlloc );
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pItem=pList->a, i=0; i<pList->nExpr; i++, pItem++){
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExprDelete(db, pItem->pExpr);
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, pItem->zName);
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, pItem->zSpan);
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, pList->a);
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, pList);
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** These routines are Walker callbacks.  Walker.u.pi is a pointer
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to an integer.  These routines are checking an expression to see
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if it is a constant.  Set *Walker.u.pi to 0 if the expression is
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not constant.
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** These callback routines are used to implement the following:
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     sqlite3ExprIsConstant()
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     sqlite3ExprIsConstantNotJoin()
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     sqlite3ExprIsConstantOrFunction()
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If pWalker->u.i is 3 then any term of the expression that comes from
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the ON or USING clauses of a join disqualifies the expression
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** from being considered constant. */
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pWalker->u.i==3 && ExprHasAnyProperty(pExpr, EP_FromJoin) ){
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pWalker->u.i = 0;
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WRC_Abort;
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( pExpr->op ){
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Consider functions to be constant if all their arguments are constant
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** and pWalker->u.i==2 */
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_FUNCTION:
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pWalker->u.i==2 ) return 0;
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Fall through */
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_ID:
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_COLUMN:
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_AGG_FUNCTION:
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_AGG_COLUMN:
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( pExpr->op==TK_ID );
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( pExpr->op==TK_COLUMN );
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( pExpr->op==TK_AGG_FUNCTION );
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( pExpr->op==TK_AGG_COLUMN );
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pWalker->u.i = 0;
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return WRC_Abort;
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( pExpr->op==TK_SELECT ); /* selectNodeIsConstant will disallow */
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( pExpr->op==TK_EXISTS ); /* selectNodeIsConstant will disallow */
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return WRC_Continue;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int selectNodeIsConstant(Walker *pWalker, Select *NotUsed){
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNUSED_PARAMETER(NotUsed);
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pWalker->u.i = 0;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WRC_Abort;
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int exprIsConst(Expr *p, int initFlag){
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Walker w;
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w.u.i = initFlag;
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w.xExprCallback = exprNodeIsConstant;
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w.xSelectCallback = selectNodeIsConstant;
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3WalkExpr(&w, p);
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return w.u.i;
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Walk an expression tree.  Return 1 if the expression is constant
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and 0 if it involves variables or function calls.
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** For the purposes of this function, a double-quoted string (ex: "abc")
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is considered a variable but a single-quoted string (ex: 'abc') is
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a constant.
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprIsConstant(Expr *p){
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return exprIsConst(p, 1);
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Walk an expression tree.  Return 1 if the expression is constant
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that does no originate from the ON or USING clauses of a join.
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return 0 if it involves variables or function calls or terms from
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an ON or USING clause.
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprIsConstantNotJoin(Expr *p){
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return exprIsConst(p, 3);
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Walk an expression tree.  Return 1 if the expression is constant
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or a function call with constant arguments.  Return and 0 if there
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are any variables.
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** For the purposes of this function, a double-quoted string (ex: "abc")
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is considered a variable but a single-quoted string (ex: 'abc') is
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a constant.
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprIsConstantOrFunction(Expr *p){
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return exprIsConst(p, 2);
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the expression p codes a constant integer that is small enough
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to fit in a 32-bit integer, return 1 and put the value of the integer
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in *pValue.  If the expression is not an integer or if it is too big
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged.
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprIsInteger(Expr *p, int *pValue){
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc = 0;
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If an expression is an integer literal that fits in a signed 32-bit
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** integer, then the EP_IntValue flag will have already been set */
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p->op!=TK_INTEGER || (p->flags & EP_IntValue)!=0
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           || sqlite3GetInt32(p->u.zToken, &rc)==0 );
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->flags & EP_IntValue ){
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *pValue = p->u.iValue;
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( p->op ){
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_UPLUS: {
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3ExprIsInteger(p->pLeft, pValue);
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_UMINUS: {
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int v;
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( sqlite3ExprIsInteger(p->pLeft, &v) ){
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *pValue = -v;
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = 1;
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: break;
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return FALSE if there is no chance that the expression can be NULL.
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the expression might be NULL or if the expression is too complex
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to tell return TRUE.
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is used as an optimization, to skip OP_IsNull opcodes
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** when we know that a value cannot be NULL.  Hence, a false positive
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (returning TRUE when in fact the expression can never be NULL) might
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be a small performance hit but is otherwise harmless.  On the other
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** hand, a false negative (returning FALSE when the result could be NULL)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** will likely result in an incorrect answer.  So when in doubt, return
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** TRUE.
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCanBeNull(const Expr *p){
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 op;
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; }
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  op = p->op;
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( op==TK_REGISTER ) op = p->op2;
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( op ){
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_INTEGER:
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_STRING:
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_FLOAT:
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_BLOB:
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate an OP_IsNull instruction that tests register iReg and jumps
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to location iDest if the value in iReg is NULL.  The value in iReg
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** was computed by pExpr.  If we can look at pExpr at compile-time and
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** determine that it can never generate a NULL, then the OP_IsNull operation
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** can be omitted.
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCodeIsNullJump(
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v,            /* The VDBE under construction */
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Expr *pExpr,  /* Only generate OP_IsNull if this expr can be NULL */
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iReg,           /* Test the value in this register for NULL */
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDest           /* Jump here if the value is null */
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3ExprCanBeNull(pExpr) ){
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iDest);
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return TRUE if the given expression is a constant which would be
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** unchanged by OP_Affinity with the affinity given in the second
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** argument.
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is used to determine if the OP_Affinity operation
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** can be omitted.  When in doubt return FALSE.  A false negative
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is harmless.  A false positive, however, can result in the wrong
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** answer.
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 op;
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( aff==SQLITE_AFF_NONE ) return 1;
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; }
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  op = p->op;
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( op==TK_REGISTER ) op = p->op2;
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( op ){
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_INTEGER: {
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC;
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_FLOAT: {
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return aff==SQLITE_AFF_REAL || aff==SQLITE_AFF_NUMERIC;
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_STRING: {
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return aff==SQLITE_AFF_TEXT;
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_BLOB: {
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_COLUMN: {
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( p->iTable>=0 );  /* p cannot be part of a CHECK constraint */
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return p->iColumn<0
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          && (aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC);
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: {
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return TRUE if the given string is a row-id column name.
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3IsRowid(const char *z){
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3StrICmp(z, "_ROWID_")==0 ) return 1;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3StrICmp(z, "ROWID")==0 ) return 1;
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3StrICmp(z, "OID")==0 ) return 1;
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return true if we are able to the IN operator optimization on a
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** query of the form
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**       x IN (SELECT ...)
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Where the SELECT... clause is as specified by the parameter to this
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** routine.
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The Select object passed in has already been preprocessed and no
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** errors have been found.
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int isCandidateForInOpt(Select *p){
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SrcList *pSrc;
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExprList *pEList;
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *pTab;
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 ) return 0;                   /* right-hand side of IN is SELECT */
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->pPrior ) return 0;              /* Not a compound SELECT */
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->selFlags & (SF_Distinct|SF_Aggregate) ){
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct );
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate );
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0; /* No DISTINCT keyword and no aggregate functions */
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p->pGroupBy==0 );              /* Has no GROUP BY clause */
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->pLimit ) return 0;              /* Has no LIMIT clause */
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p->pOffset==0 );               /* No LIMIT means no OFFSET */
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->pWhere ) return 0;              /* Has no WHERE clause */
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pSrc = p->pSrc;
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pSrc!=0 );
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pSrc->nSrc!=1 ) return 0;          /* Single term in FROM clause */
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pSrc->a[0].pSelect ) return 0;     /* FROM is not a subquery or view */
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pTab = pSrc->a[0].pTab;
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( NEVER(pTab==0) ) return 0;
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pTab->pSelect==0 );            /* FROM clause is not a view */
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( IsVirtual(pTab) ) return 0;        /* FROM clause not a virtual table */
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pEList = p->pEList;
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pEList->nExpr!=1 ) return 0;       /* One column in the result set */
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pEList->a[0].pExpr->op!=TK_COLUMN ) return 0; /* Result is a column */
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1;
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_SUBQUERY */
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is used by the implementation of the IN (...) operator.
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** It's job is to find or create a b-tree structure that may be used
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** either to test for membership of the (...) set or to iterate through
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** its members, skipping duplicates.
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The index of the cursor opened on the b-tree (database table, database index
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or ephermal table) is stored in pX->iTable before this function returns.
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The returned value of this function indicates the b-tree type, as follows:
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   IN_INDEX_ROWID - The cursor was opened on a database table.
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   IN_INDEX_INDEX - The cursor was opened on a database index.
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   IN_INDEX_EPH -   The cursor was opened on a specially created and
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                    populated epheremal table.
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An existing b-tree may only be used if the SELECT is of the simple
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** form:
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     SELECT <column> FROM <table>
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the prNotFound parameter is 0, then the b-tree will be used to iterate
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** through the set members, skipping any duplicates. In this case an
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** epheremal table must be used unless the selected <column> is guaranteed
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to be unique - either because it is an INTEGER PRIMARY KEY or it
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** has a UNIQUE constraint or UNIQUE index.
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the prNotFound parameter is not 0, then the b-tree will be used
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for fast set membership tests. In this case an epheremal table must
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be used unless <column> is an INTEGER PRIMARY KEY or an index can
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be found with <column> as its left-most column.
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** When the b-tree is being used for membership tests, the calling function
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** needs to know whether or not the structure contains an SQL NULL
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value in order to correctly evaluate expressions like "X IN (Y, Z)".
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If there is any chance that the (...) might contain a NULL value at
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** runtime, then a register is allocated and the register number written
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to *prNotFound. If there is no chance that the (...) contains a
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL value, then *prNotFound is left unchanged.
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If a register is allocated and its location stored in *prNotFound, then
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** its initial value is NULL.  If the (...) does not remain constant
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for the duration of the query (i.e. the SELECT within the (...)
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is a correlated subquery) then the value of the allocated register is
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** reset to NULL each time the subquery is rerun. This allows the
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** caller to use vdbe code equivalent to the following:
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   if( register==NULL ){
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     has_null = <test if data structure contains null>
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     register = 1
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   }
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in order to avoid running the <test if data structure contains null>
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** test more often than is necessary.
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Select *p;                            /* SELECT to the right of IN operator */
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int eType = 0;                        /* Type of RHS table. IN_INDEX_* */
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iTab = pParse->nTab++;            /* Cursor of the RHS table */
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int mustBeUnique = (prNotFound==0);   /* True if RHS must be unique */
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pX->op==TK_IN );
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Check to see if an existing table or index can be used to
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** satisfy the query.  This is preferable to generating a new
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** ephemeral table.
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = (ExprHasProperty(pX, EP_xIsSelect) ? pX->x.pSelect : 0);
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(pParse->nErr==0) && isCandidateForInOpt(p) ){
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3 *db = pParse->db;              /* Database connection */
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Expr *pExpr = p->pEList->a[0].pExpr;   /* Expression <column> */
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int iCol = pExpr->iColumn;             /* Index of column <column> */
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Vdbe *v = sqlite3GetVdbe(pParse);      /* Virtual machine being coded */
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Table *pTab = p->pSrc->a[0].pTab;      /* Table <table>. */
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int iDb;                               /* Database idx for pTab */
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Code an OP_VerifyCookie and OP_TableLock for <table>. */
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3CodeVerifySchema(pParse, iDb);
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* This function is only called from two places. In both cases the vdbe
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** has already been allocated. So assume sqlite3GetVdbe() is always
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** successful here.
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(v);
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( iCol<0 ){
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int iMem = ++pParse->nMem;
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int iAddr;
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      iAddr = sqlite3VdbeAddOp1(v, OP_If, iMem);
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_Integer, 1, iMem);
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead);
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      eType = IN_INDEX_ROWID;
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeJumpHere(v, iAddr);
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Index *pIdx;                         /* Iterator variable */
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* The collation sequence used by the comparison. If an index is to
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** be used in place of a temp-table, it must be ordered according
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** to this collation sequence.  */
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pExpr);
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Check that the affinity that will be used to perform the
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** comparison is the same as the affinity of the column. If
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** it is not, it is not possible to use any index.
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char aff = comparisonAffinity(pX);
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int affinity_ok = (pTab->aCol[iCol].affinity==aff||aff==SQLITE_AFF_NONE);
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for(pIdx=pTab->pIndex; pIdx && eType==0 && affinity_ok; pIdx=pIdx->pNext){
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( (pIdx->aiColumn[0]==iCol)
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         && sqlite3FindCollSeq(db, ENC(db), pIdx->azColl[0], 0)==pReq
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         && (!mustBeUnique || (pIdx->nColumn==1 && pIdx->onError!=OE_None))
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ){
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          int iMem = ++pParse->nMem;
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          int iAddr;
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          char *pKey;
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pKey = (char *)sqlite3IndexKeyinfo(pParse, pIdx);
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          iAddr = sqlite3VdbeAddOp1(v, OP_If, iMem);
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3VdbeAddOp2(v, OP_Integer, 1, iMem);
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3VdbeAddOp4(v, OP_OpenRead, iTab, pIdx->tnum, iDb,
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               pKey,P4_KEYINFO_HANDOFF);
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VdbeComment((v, "%s", pIdx->zName));
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          eType = IN_INDEX_INDEX;
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3VdbeJumpHere(v, iAddr);
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( prNotFound && !pTab->aCol[iCol].notNull ){
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *prNotFound = ++pParse->nMem;
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( eType==0 ){
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Could not found an existing table or index to use as the RHS b-tree.
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** We will have to generate an ephemeral table to do the job.
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double savedNQueryLoop = pParse->nQueryLoop;
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rMayHaveNull = 0;
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    eType = IN_INDEX_EPH;
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( prNotFound ){
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *prNotFound = rMayHaveNull = ++pParse->nMem;
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( pParse->nQueryLoop>(double)1 );
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pParse->nQueryLoop = (double)1;
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pX->pLeft->iColumn<0 && !ExprHasAnyProperty(pX, EP_xIsSelect) ){
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        eType = IN_INDEX_ROWID;
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3CodeSubselect(pParse, pX, rMayHaveNull, eType==IN_INDEX_ROWID);
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->nQueryLoop = savedNQueryLoop;
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pX->iTable = iTab;
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return eType;
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code for scalar subqueries used as a subquery expression, EXISTS,
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or IN operators.  Examples:
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     (SELECT a FROM b)          -- subquery
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     EXISTS (SELECT a FROM b)   -- EXISTS subquery
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     x IN (4,5,11)              -- IN operator with list on right-hand side
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     x IN (SELECT a FROM b)     -- IN operator with subquery on the right
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The pExpr parameter describes the expression that contains the IN
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** operator or subquery.
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If parameter isRowid is non-zero, then expression pExpr is guaranteed
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to be of the form "<rowid> IN (?, ?, ?)", where <rowid> is a reference
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to some integer key column of a table B-Tree. In this case, use an
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** intkey B-Tree to store the set of IN(...) values instead of the usual
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (slower) variable length keys B-Tree.
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If rMayHaveNull is non-zero, that means that the operation is an IN
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (not a SELECT or EXISTS) and that the RHS might contains NULLs.
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Furthermore, the IN is in a WHERE clause and that we really want
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to iterate over the RHS of the IN operator in order to quickly locate
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** all corresponding LHS elements.  All this routine does is initialize
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the register given by rMayHaveNull to NULL.  Calling routines will take
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** care of changing this register value to non-NULL if the RHS is NULL-free.
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If rMayHaveNull is zero, that means that the subquery is being used
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for membership testing only.  There is no need to initialize any
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** registers to indicate the presense or absence of NULLs on the RHS.
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** For a SELECT or EXISTS operator, return the register that holds the
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** result.  For IN operators or if an error occurs, the return value is 0.
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3CodeSubselect(
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,          /* Parsing context */
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pExpr,            /* The IN, SELECT, or EXISTS operator */
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rMayHaveNull,       /* Register that records whether NULLs exist in RHS */
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int isRowid             /* If true, LHS of IN operator is a rowid */
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int testAddr = 0;                       /* One-time test address */
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rReg = 0;                           /* Register storing resulting */
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v = sqlite3GetVdbe(pParse);
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( NEVER(v==0) ) return 0;
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprCachePush(pParse);
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* This code must be run in its entirety every time it is encountered
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** if any of the following is true:
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **    *  The right-hand side is a correlated subquery
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **    *  The right-hand side is an expression list containing variables
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **    *  We are inside a trigger
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** If all of the above are false, then we can run this code just once
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** save the results, and reuse the same result on subsequent invocations.
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !ExprHasAnyProperty(pExpr, EP_VarSelect) && !pParse->pTriggerTab ){
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int mem = ++pParse->nMem;
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp1(v, OP_If, mem);
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testAddr = sqlite3VdbeAddOp2(v, OP_Integer, 1, mem);
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( testAddr>0 || pParse->db->mallocFailed );
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_EXPLAIN
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pParse->explain==2 ){
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *zMsg = sqlite3MPrintf(
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pParse->db, "EXECUTE %s%s SUBQUERY %d", testAddr?"":"CORRELATED ",
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pExpr->op==TK_IN?"LIST":"SCALAR", pParse->iNextSelectId
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    );
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC);
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( pExpr->op ){
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_IN: {
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char affinity;              /* Affinity of the LHS of the IN */
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      KeyInfo keyInfo;            /* Keyinfo for the generated table */
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int addr;                   /* Address of OP_OpenEphemeral instruction */
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Expr *pLeft = pExpr->pLeft; /* the LHS of the IN operator */
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rMayHaveNull ){
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeAddOp2(v, OP_Null, 0, rMayHaveNull);
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      affinity = sqlite3ExprAffinity(pLeft);
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Whether this is an 'x IN(SELECT...)' or an 'x IN(<exprlist>)'
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** expression it is handled the same way.  An ephemeral table is
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** filled with single-field index keys representing the results
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** from the SELECT or the <exprlist>.
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** If the 'x' expression is a column value, or the SELECT...
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** statement returns a column value, then the affinity of that
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** column is used to build the index keys. If both 'x' and the
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** SELECT... statement are columns, then numeric affinity is used
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** if either column has NUMERIC or INTEGER affinity. If neither
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** 'x' nor the SELECT... statement are columns, then numeric affinity
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** is used.
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pExpr->iTable = pParse->nTab++;
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, !isRowid);
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rMayHaveNull==0 ) sqlite3VdbeChangeP5(v, BTREE_UNORDERED);
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memset(&keyInfo, 0, sizeof(keyInfo));
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keyInfo.nField = 1;
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( ExprHasProperty(pExpr, EP_xIsSelect) ){
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Case 1:     expr IN (SELECT ...)
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        **
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** Generate code to write the results of the select into the temporary
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** table allocated and opened above.
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        */
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SelectDest dest;
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ExprList *pEList;
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( !isRowid );
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3SelectDestInit(&dest, SRT_Set, pExpr->iTable);
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dest.affinity = (u8)affinity;
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( (pExpr->iTable&0x0000FFFF)==pExpr->iTable );
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pExpr->x.pSelect->iLimit = 0;
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( sqlite3Select(pParse, pExpr->x.pSelect, &dest) ){
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return 0;
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pEList = pExpr->x.pSelect->pEList;
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( ALWAYS(pEList!=0 && pEList->nExpr>0) ){
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          keyInfo.aColl[0] = sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft,
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pEList->a[0].pExpr);
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else if( ALWAYS(pExpr->x.pList!=0) ){
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Case 2:     expr IN (exprlist)
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        **
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** For each expression, build an index key from the evaluation and
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** store it in the temporary table. If <expr> is a column, then use
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** that columns affinity when building index keys. If <expr> is not
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** a column, use numeric affinity.
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        */
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int i;
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ExprList *pList = pExpr->x.pList;
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        struct ExprList_item *pItem;
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int r1, r2, r3;
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( !affinity ){
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          affinity = SQLITE_AFF_NONE;
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keyInfo.aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft);
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Loop through each expression in <exprlist>. */
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        r1 = sqlite3GetTempReg(pParse);
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        r2 = sqlite3GetTempReg(pParse);
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeAddOp2(v, OP_Null, 0, r2);
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Expr *pE2 = pItem->pExpr;
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          int iValToIns;
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* If the expression is not constant then we will need to
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ** disable the test that was generated above that makes sure
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ** this code only executes once.  Because for a non-constant
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ** expression we need to rerun this code each time.
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          */
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( testAddr && !sqlite3ExprIsConstant(pE2) ){
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sqlite3VdbeChangeToNoop(v, testAddr-1, 2);
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            testAddr = 0;
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* Evaluate the expression and insert it into the temp table */
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sqlite3VdbeAddOp3(v, OP_InsertInt, pExpr->iTable, r2, iValToIns);
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }else{
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            r3 = sqlite3ExprCodeTarget(pParse, pE2, r1);
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if( isRowid ){
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              sqlite3VdbeAddOp2(v, OP_MustBeInt, r3,
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                sqlite3VdbeCurrentAddr(v)+2);
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3);
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }else{
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1);
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              sqlite3ExprCacheAffinityChange(pParse, r3, 1);
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              sqlite3VdbeAddOp2(v, OP_IdxInsert, pExpr->iTable, r2);
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ReleaseTempReg(pParse, r1);
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ReleaseTempReg(pParse, r2);
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( !isRowid ){
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeChangeP4(v, addr, (void *)&keyInfo, P4_KEYINFO);
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_EXISTS:
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_SELECT:
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: {
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* If this has to be a scalar SELECT.  Generate code to put the
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** value of this select in a memory cell and record the number
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** of the memory cell in iColumn.  If this is an EXISTS, write
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** an integer 0 (not exists) or 1 (exists) into a memory cell
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** and record that memory cell in iColumn.
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Select *pSel;                         /* SELECT statement to encode */
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SelectDest dest;                      /* How to deal with SELECt result */
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( pExpr->op==TK_EXISTS );
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( pExpr->op==TK_SELECT );
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT );
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( ExprHasProperty(pExpr, EP_xIsSelect) );
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pSel = pExpr->x.pSelect;
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3SelectDestInit(&dest, 0, ++pParse->nMem);
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pExpr->op==TK_SELECT ){
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dest.eDest = SRT_Mem;
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeAddOp2(v, OP_Null, 0, dest.iParm);
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        VdbeComment((v, "Init subquery result"));
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dest.eDest = SRT_Exists;
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iParm);
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        VdbeComment((v, "Init EXISTS result"));
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprDelete(pParse->db, pSel->pLimit);
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pSel->pLimit = sqlite3PExpr(pParse, TK_INTEGER, 0, 0,
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  &sqlite3IntTokens[1]);
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pSel->iLimit = 0;
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( sqlite3Select(pParse, pSel, &dest) ){
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rReg = dest.iParm;
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExprSetIrreducible(pExpr);
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( testAddr ){
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeJumpHere(v, testAddr-1);
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprCachePop(pParse, 1);
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rReg;
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_SUBQUERY */
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code for an IN expression.
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**      x IN (SELECT ...)
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**      x IN (value, value, ...)
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The left-hand side (LHS) is a scalar expression.  The right-hand side (RHS)
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is an array of zero or more values.  The expression is true if the LHS is
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** contained within the RHS.  The value of the expression is unknown (NULL)
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if the LHS is NULL or if the LHS is not contained within the RHS and the
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** RHS contains one or more NULL values.
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine generates code will jump to destIfFalse if the LHS is not
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** contained within the RHS.  If due to NULLs we cannot determine if the LHS
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is contained in the RHS then jump to destIfNull.  If the LHS is contained
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** within the RHS then fall through.
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void sqlite3ExprCodeIN(
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,        /* Parsing and code generating context */
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pExpr,          /* The IN expression */
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int destIfFalse,      /* Jump here if LHS is not contained in the RHS */
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int destIfNull        /* Jump here if the results are unknown due to NULLs */
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rRhsHasNull = 0;  /* Register that is true if RHS contains NULL values */
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char affinity;        /* Comparison affinity to use */
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int eType;            /* Type of the RHS */
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int r1;               /* Temporary use register */
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v;              /* Statement under construction */
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Compute the RHS.   After this step, the table with cursor
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** pExpr->iTable will contains the values that make up the RHS.
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  v = pParse->pVdbe;
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( v!=0 );       /* OOM detected prior to this routine */
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeNoopComment((v, "begin IN expr"));
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  eType = sqlite3FindInIndex(pParse, pExpr, &rRhsHasNull);
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Figure out the affinity to use to create a key from the results
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** of the expression. affinityStr stores a static string suitable for
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** P4 of OP_MakeRecord.
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  affinity = comparisonAffinity(pExpr);
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Code the LHS, the <expr> from "<expr> IN (...)".
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprCachePush(pParse);
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r1 = sqlite3GetTempReg(pParse);
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprCode(pParse, pExpr->pLeft, r1);
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If the LHS is NULL, then the result is either false or NULL depending
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** on whether the RHS is empty or not, respectively.
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( destIfNull==destIfFalse ){
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Shortcut for the common case where the false and NULL outcomes are
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** the same. */
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_IsNull, r1, destIfNull);
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, r1);
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse);
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfNull);
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeJumpHere(v, addr1);
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( eType==IN_INDEX_ROWID ){
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* In this case, the RHS is the ROWID of table b-tree
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_MustBeInt, r1, destIfFalse);
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp3(v, OP_NotExists, pExpr->iTable, destIfFalse, r1);
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* In this case, the RHS is an index b-tree.
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp4(v, OP_Affinity, r1, 1, 0, &affinity, 1);
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If the set membership test fails, then the result of the
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** "x IN (...)" expression must be either 0 or NULL. If the set
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** contains no NULL values, then the result is 0. If the set
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** contains one or more NULL values, then the result of the
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** expression is also NULL.
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rRhsHasNull==0 || destIfFalse==destIfNull ){
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* This branch runs if it is known at compile time that the RHS
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** cannot contain NULL values. This happens as the result
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** of a "NOT NULL" constraint in the database schema.
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** Also run this branch if NULL is equivalent to FALSE
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** for this particular IN operator.
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp4Int(v, OP_NotFound, pExpr->iTable, destIfFalse, r1, 1);
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* In this branch, the RHS of the IN might contain a NULL and
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** the presence of a NULL on the RHS makes a difference in the
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** outcome.
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int j1, j2, j3;
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* First check to see if the LHS is contained in the RHS.  If so,
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** then the presence of NULLs in the RHS does not matter, so jump
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** over all of the code that follows.
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      j1 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, r1, 1);
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Here we begin generating code that runs if the LHS is not
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** contained within the RHS.  Generate additional code that
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** tests the RHS for NULLs.  If the RHS contains a NULL then
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** jump to destIfNull.  If there are no NULLs in the RHS then
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** jump to destIfFalse.
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      j2 = sqlite3VdbeAddOp1(v, OP_NotNull, rRhsHasNull);
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      j3 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, rRhsHasNull, 1);
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_Integer, -1, rRhsHasNull);
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeJumpHere(v, j3);
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_AddImm, rRhsHasNull, 1);
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeJumpHere(v, j2);
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Jump to the appropriate target depending on whether or not
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** the RHS contains a NULL
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_If, rRhsHasNull, destIfNull);
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfFalse);
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* The OP_Found at the top of this branch jumps here when true,
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** causing the overall IN expression evaluation to fall through.
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeJumpHere(v, j1);
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ReleaseTempReg(pParse, r1);
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprCachePop(pParse, 1);
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeComment((v, "end IN expr"));
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_SUBQUERY */
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Duplicate an 8-byte value
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *dup8bytes(Vdbe *v, const char *in){
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *out = sqlite3DbMallocRaw(sqlite3VdbeDb(v), 8);
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( out ){
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(out, in, 8);
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return out;
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate an instruction that will put the floating point
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value described by z[0..n-1] into register iMem.
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The z[] string will probably not be zero-terminated.  But the
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** z[n] character is guaranteed to be something that does not look
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** like the continuation of the number.
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(z!=0) ){
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double value;
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *zV;
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3AtoF(z, &value, sqlite3Strlen30(z), SQLITE_UTF8);
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( negateFlag ) value = -value;
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zV = dup8bytes(v, (char*)&value);
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp4(v, OP_Real, 0, iMem, 0, zV, P4_REAL);
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate an instruction that will put the integer describe by
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** text z[0..n-1] into register iMem.
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Expr.u.zToken is always UTF8 and zero-terminated.
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v = pParse->pVdbe;
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pExpr->flags & EP_IntValue ){
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i = pExpr->u.iValue;
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( i>=0 );
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( negFlag ) i = -i;
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_Integer, i, iMem);
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int c;
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i64 value;
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *z = pExpr->u.zToken;
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( z!=0 );
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c = sqlite3Atoi64(z, &value, sqlite3Strlen30(z), SQLITE_UTF8);
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( c==0 || (c==2 && negFlag) ){
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char *zV;
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( negFlag ){ value = c==2 ? SMALLEST_INT64 : -value; }
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zV = dup8bytes(v, (char*)&value);
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp4(v, OP_Int64, 0, iMem, 0, zV, P4_INT64);
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_FLOATING_POINT
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z);
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      codeReal(v, z, negFlag, iMem);
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Clear a cache entry.
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void cacheEntryClear(Parse *pParse, struct yColCache *p){
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->tempReg ){
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pParse->nTempReg<ArraySize(pParse->aTempReg) ){
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pParse->aTempReg[pParse->nTempReg++] = p->iReg;
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->tempReg = 0;
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Record in the column cache that a particular column from a
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** particular table is stored in a particular register.
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCacheStore(Parse *pParse, int iTab, int iCol, int iReg){
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int minLru;
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int idxLru;
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct yColCache *p;
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( iReg>0 );  /* Register numbers are always positive */
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( iCol>=-1 && iCol<32768 );  /* Finite column numbers */
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The SQLITE_ColumnCache flag disables the column cache.  This is used
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** for testing only - to verify that SQLite always gets the same answer
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** with and without the column cache.
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pParse->db->flags & SQLITE_ColumnCache ) return;
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* First replace any existing entry.
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Actually, the way the column cache is currently used, we are guaranteed
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** that the object will never already be in cache.  Verify this guarantee.
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 /* This code wold remove the entry from the cache if it existed */
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->iReg && p->iTable==iTab && p->iColumn==iCol ){
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cacheEntryClear(pParse, p);
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->iLevel = pParse->iCacheLevel;
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->iReg = iReg;
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->lru = pParse->iCacheCnt++;
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( p->iReg==0 || p->iTable!=iTab || p->iColumn!=iCol );
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Find an empty slot and replace it */
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->iReg==0 ){
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->iLevel = pParse->iCacheLevel;
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->iTable = iTab;
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->iColumn = iCol;
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->iReg = iReg;
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->tempReg = 0;
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->lru = pParse->iCacheCnt++;
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Replace the last recently used */
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  minLru = 0x7fffffff;
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  idxLru = -1;
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->lru<minLru ){
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      idxLru = i;
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      minLru = p->lru;
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(idxLru>=0) ){
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p = &pParse->aColCache[idxLru];
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->iLevel = pParse->iCacheLevel;
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->iTable = iTab;
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->iColumn = iCol;
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->iReg = iReg;
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->tempReg = 0;
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->lru = pParse->iCacheCnt++;
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Indicate that registers between iReg..iReg+nReg-1 are being overwritten.
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Purge the range of registers from the column cache.
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCacheRemove(Parse *pParse, int iReg, int nReg){
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iLast = iReg + nReg - 1;
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct yColCache *p;
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int r = p->iReg;
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( r>=iReg && r<=iLast ){
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cacheEntryClear(pParse, p);
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->iReg = 0;
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Remember the current column cache context.  Any new entries added
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** added to the column cache after this call are removed when the
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** corresponding pop occurs.
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCachePush(Parse *pParse){
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pParse->iCacheLevel++;
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Remove from the column cache any entries that were added since the
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the previous N Push operations.  In other words, restore the cache
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the state it was in N Pushes ago.
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCachePop(Parse *pParse, int N){
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct yColCache *p;
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( N>0 );
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pParse->iCacheLevel>=N );
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pParse->iCacheLevel -= N;
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->iReg && p->iLevel>pParse->iCacheLevel ){
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cacheEntryClear(pParse, p);
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->iReg = 0;
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** When a cached column is reused, make sure that its register is
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** no longer available as a temp register.  ticket #3879:  that same
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register might be in the cache in multiple places, so be sure to
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** get them all.
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void sqlite3ExprCachePinRegister(Parse *pParse, int iReg){
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct yColCache *p;
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->iReg==iReg ){
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->tempReg = 0;
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code to extract the value of the iCol-th column of a table.
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCodeGetColumnOfTable(
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v,        /* The VDBE under construction */
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *pTab,    /* The table containing the value */
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iTabCur,    /* The cursor for this table */
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iCol,       /* Index of the column to extract */
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int regOut      /* Extract the valud into this register */
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( iCol<0 || iCol==pTab->iPKey ){
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut);
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int op = IsVirtual(pTab) ? OP_VColumn : OP_Column;
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp3(v, op, iTabCur, iCol, regOut);
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( iCol>=0 ){
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ColumnDefault(v, pTab, iCol, regOut);
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code that will extract the iColumn-th column from
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table pTab and store the column value in a register.  An effort
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is made to store the column value in register iReg, but this is
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not guaranteed.  The location of the column value is returned.
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** There must be an open cursor to pTab in iTable when this routine
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is called.  If iColumn<0 then code is generated that extracts the rowid.
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCodeGetColumn(
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,   /* Parsing and code generating context */
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *pTab,     /* Description of the table we are reading from */
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iColumn,     /* Index of the table column */
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iTable,      /* The cursor pointing to the table */
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iReg         /* Store results here */
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v = pParse->pVdbe;
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct yColCache *p;
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->iReg>0 && p->iTable==iTable && p->iColumn==iColumn ){
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->lru = pParse->iCacheCnt++;
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprCachePinRegister(pParse, p->iReg);
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return p->iReg;
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( v!=0 );
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprCodeGetColumnOfTable(v, pTab, iTable, iColumn, iReg);
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprCacheStore(pParse, iTable, iColumn, iReg);
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return iReg;
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Clear all column cache entries.
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCacheClear(Parse *pParse){
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct yColCache *p;
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->iReg ){
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cacheEntryClear(pParse, p);
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->iReg = 0;
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Record the fact that an affinity change has occurred on iCount
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** registers starting with iStart.
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCacheAffinityChange(Parse *pParse, int iStart, int iCount){
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprCacheRemove(pParse, iStart, iCount);
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code to move content from registers iFrom...iFrom+nReg-1
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** over to iTo..iTo+nReg-1. Keep the column cache up-to-date.
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int nReg){
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct yColCache *p;
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( NEVER(iFrom==iTo) ) return;
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeAddOp3(pParse->pVdbe, OP_Move, iFrom, iTo, nReg);
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int x = p->iReg;
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( x>=iFrom && x<iFrom+nReg ){
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->iReg += iTo-iFrom;
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code to copy content from registers iFrom...iFrom+nReg-1
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** over to iTo..iTo+nReg-1.
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCodeCopy(Parse *pParse, int iFrom, int iTo, int nReg){
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( NEVER(iFrom==iTo) ) return;
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<nReg; i++){
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(pParse->pVdbe, OP_Copy, iFrom+i, iTo+i);
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST)
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return true if any register in the range iFrom..iTo (inclusive)
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is used as part of the column cache.
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is used within assert() and testcase() macros only
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and does not appear in a normal build.
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int usedAsColumnCache(Parse *pParse, int iFrom, int iTo){
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct yColCache *p;
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int r = p->iReg;
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( r>=iFrom && r<=iTo ) return 1;    /*NO_TEST*/
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_DEBUG || SQLITE_COVERAGE_TEST */
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code into the current Vdbe to evaluate the given
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression.  Attempt to store the results in register "target".
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the register where results are stored.
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** With this routine, there is no guarantee that results will
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be stored in target.  The result might be stored in some other
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register if it is convenient to do so.  The calling function
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** must check the return code and move the results to the desired
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register.
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v = pParse->pVdbe;  /* The VM under construction */
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int op;                   /* The opcode being coded */
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int inReg = target;       /* Results stored in register inReg */
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int regFree1 = 0;         /* If non-zero free this temporary register */
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int regFree2 = 0;         /* If non-zero free this temporary register */
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int r1, r2, r3, r4;       /* Various register numbers */
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db; /* The database connection */
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( target>0 && target<=pParse->nMem );
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( v==0 ){
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pParse->db->mallocFailed );
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pExpr==0 ){
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    op = TK_NULL;
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    op = pExpr->op;
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( op ){
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_AGG_COLUMN: {
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AggInfo *pAggInfo = pExpr->pAggInfo;
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct AggInfo_col *pCol = &pAggInfo->aCol[pExpr->iAgg];
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( !pAggInfo->directMode ){
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( pCol->iMem>0 );
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inReg = pCol->iMem;
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else if( pAggInfo->useSortingIdx ){
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdx,
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              pCol->iSorterColumn, target);
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Otherwise, fall thru into the TK_COLUMN case */
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_COLUMN: {
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pExpr->iTable<0 ){
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* This only happens when coding check constraints */
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( pParse->ckBase>0 );
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inReg = pExpr->iColumn + pParse->ckBase;
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inReg = sqlite3ExprCodeGetColumn(pParse, pExpr->pTab,
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 pExpr->iColumn, pExpr->iTable, target);
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_INTEGER: {
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      codeInteger(pParse, pExpr, 0, target);
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_FLOAT: {
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( !ExprHasProperty(pExpr, EP_IntValue) );
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      codeReal(v, pExpr->u.zToken, 0, target);
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_STRING: {
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( !ExprHasProperty(pExpr, EP_IntValue) );
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp4(v, OP_String8, 0, target, 0, pExpr->u.zToken, 0);
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_NULL: {
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_Null, 0, target);
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_BLOB_LITERAL
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_BLOB: {
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int n;
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char *z;
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char *zBlob;
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( !ExprHasProperty(pExpr, EP_IntValue) );
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' );
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pExpr->u.zToken[1]=='\'' );
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      z = &pExpr->u.zToken[2];
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      n = sqlite3Strlen30(z) - 1;
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( z[n]=='\'' );
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zBlob = sqlite3HexToBlob(sqlite3VdbeDb(v), z, n);
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp4(v, OP_Blob, n/2, target, 0, zBlob, P4_DYNAMIC);
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_VARIABLE: {
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( !ExprHasProperty(pExpr, EP_IntValue) );
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pExpr->u.zToken!=0 );
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pExpr->u.zToken[0]!=0 );
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iColumn, target);
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pExpr->u.zToken[1]!=0 ){
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeChangeP4(v, -1, pExpr->u.zToken, P4_TRANSIENT);
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_REGISTER: {
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      inReg = pExpr->iTable;
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_AS: {
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_CAST
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_CAST: {
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Expressions of the form:   CAST(pLeft AS token) */
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int aff, to_op;
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( !ExprHasProperty(pExpr, EP_IntValue) );
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aff = sqlite3AffinityType(pExpr->u.zToken);
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      to_op = aff - SQLITE_AFF_TEXT + OP_ToText;
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( to_op==OP_ToText    || aff!=SQLITE_AFF_TEXT    );
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( to_op==OP_ToBlob    || aff!=SQLITE_AFF_NONE    );
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( to_op==OP_ToNumeric || aff!=SQLITE_AFF_NUMERIC );
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( to_op==OP_ToInt     || aff!=SQLITE_AFF_INTEGER );
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( to_op==OP_ToReal    || aff!=SQLITE_AFF_REAL    );
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( to_op==OP_ToText );
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( to_op==OP_ToBlob );
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( to_op==OP_ToNumeric );
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( to_op==OP_ToInt );
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( to_op==OP_ToReal );
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( inReg!=target ){
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target);
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inReg = target;
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp1(v, to_op, inReg);
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( usedAsColumnCache(pParse, inReg, inReg) );
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprCacheAffinityChange(pParse, inReg, 1);
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_CAST */
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_LT:
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_LE:
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_GT:
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_GE:
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_NE:
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_EQ: {
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_LT==OP_Lt );
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_LE==OP_Le );
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_GT==OP_Gt );
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_GE==OP_Ge );
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_EQ==OP_Eq );
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_NE==OP_Ne );
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_LT );
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_LE );
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_GT );
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_GE );
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_EQ );
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_NE );
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, &regFree2);
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  r1, r2, inReg, SQLITE_STOREP2);
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree1==0 );
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree2==0 );
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_IS:
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_ISNOT: {
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_IS );
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_ISNOT );
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, &regFree2);
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      op = (op==TK_IS) ? TK_EQ : TK_NE;
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  r1, r2, inReg, SQLITE_STOREP2 | SQLITE_NULLEQ);
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree1==0 );
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree2==0 );
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_AND:
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_OR:
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_PLUS:
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_STAR:
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_MINUS:
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_REM:
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_BITAND:
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_BITOR:
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_SLASH:
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_LSHIFT:
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_RSHIFT:
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_CONCAT: {
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_AND==OP_And );
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_OR==OP_Or );
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_PLUS==OP_Add );
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_MINUS==OP_Subtract );
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_REM==OP_Remainder );
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_BITAND==OP_BitAnd );
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_BITOR==OP_BitOr );
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_SLASH==OP_Divide );
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_LSHIFT==OP_ShiftLeft );
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_RSHIFT==OP_ShiftRight );
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_CONCAT==OP_Concat );
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_AND );
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_OR );
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_PLUS );
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_MINUS );
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_REM );
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_BITAND );
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_BITOR );
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_SLASH );
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_LSHIFT );
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_RSHIFT );
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_CONCAT );
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, &regFree2);
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp3(v, op, r2, r1, target);
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree1==0 );
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree2==0 );
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_UMINUS: {
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Expr *pLeft = pExpr->pLeft;
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pLeft );
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pLeft->op==TK_INTEGER ){
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        codeInteger(pParse, pLeft, 1, target);
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else if( pLeft->op==TK_FLOAT ){
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( !ExprHasProperty(pExpr, EP_IntValue) );
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        codeReal(v, pLeft->u.zToken, 1, target);
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        regFree1 = r1 = sqlite3GetTempReg(pParse);
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeAddOp2(v, OP_Integer, 0, r1);
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        r2 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree2);
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeAddOp3(v, OP_Subtract, r2, r1, target);
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        testcase( regFree2==0 );
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      inReg = target;
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_BITNOT:
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_NOT: {
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_BITNOT==OP_BitNot );
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_NOT==OP_Not );
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_BITNOT );
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_NOT );
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree1==0 );
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      inReg = target;
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, op, r1, inReg);
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_ISNULL:
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_NOTNULL: {
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int addr;
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_ISNULL==OP_IsNull );
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_NOTNULL==OP_NotNull );
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_ISNULL );
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_NOTNULL );
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_Integer, 1, target);
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree1==0 );
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      addr = sqlite3VdbeAddOp1(v, op, r1);
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_AddImm, target, -1);
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeJumpHere(v, addr);
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_AGG_FUNCTION: {
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AggInfo *pInfo = pExpr->pAggInfo;
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pInfo==0 ){
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( !ExprHasProperty(pExpr, EP_IntValue) );
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ErrorMsg(pParse, "misuse of aggregate: %s()", pExpr->u.zToken);
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        inReg = pInfo->aFunc[pExpr->iAgg].iMem;
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_CONST_FUNC:
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_FUNCTION: {
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExprList *pFarg;       /* List of function arguments */
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int nFarg;             /* Number of function arguments */
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FuncDef *pDef;         /* The function definition object */
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int nId;               /* Length of the function name in bytes */
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char *zId;       /* The function name */
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int constMask = 0;     /* Mask of function arguments that are constant */
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int i;                 /* Loop counter */
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      u8 enc = ENC(db);      /* The text encoding used by this database */
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CollSeq *pColl = 0;    /* A collating sequence */
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_CONST_FUNC );
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_FUNCTION );
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( ExprHasAnyProperty(pExpr, EP_TokenOnly) ){
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pFarg = 0;
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pFarg = pExpr->x.pList;
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nFarg = pFarg ? pFarg->nExpr : 0;
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( !ExprHasProperty(pExpr, EP_IntValue) );
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zId = pExpr->u.zToken;
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nId = sqlite3Strlen30(zId);
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pDef = sqlite3FindFunction(db, zId, nId, nFarg, enc, 0);
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pDef==0 ){
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ErrorMsg(pParse, "unknown function: %.*s()", nId, zId);
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Attempt a direct implementation of the built-in COALESCE() and
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** IFNULL() functions.  This avoids unnecessary evalation of
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** arguments past the first non-NULL argument.
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pDef->flags & SQLITE_FUNC_COALESCE ){
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int endCoalesce = sqlite3VdbeMakeLabel(v);
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( nFarg>=2 );
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target);
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(i=1; i<nFarg; i++){
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3VdbeAddOp2(v, OP_NotNull, target, endCoalesce);
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3ExprCacheRemove(pParse, target, 1);
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3ExprCachePush(pParse);
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3ExprCode(pParse, pFarg->a[i].pExpr, target);
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3ExprCachePop(pParse, 1);
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeResolveLabel(v, endCoalesce);
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pFarg ){
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        r1 = sqlite3GetTempRange(pParse, nFarg);
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ExprCachePush(pParse);     /* Ticket 2ea2425d34be */
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ExprCodeExprList(pParse, pFarg, r1, 1);
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ExprCachePop(pParse, 1);   /* Ticket 2ea2425d34be */
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        r1 = 0;
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Possibly overload the function if the first argument is
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** a virtual table column.
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** For infix functions (LIKE, GLOB, REGEXP, and MATCH) use the
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** second argument, not the first, as the argument to test to
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** see if it is a column in a virtual table.  This is done because
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** the left operand of infix functions (the operand we want to
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** control overloading) ends up as the second argument to the
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** function.  The expression "A glob B" is equivalent to
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** "glob(B,A).  We want to use the A in "A glob B" to test
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** for function overloading.  But we use the B term in "glob(B,A)".
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( nFarg>=2 && (pExpr->flags & EP_InfixFunc) ){
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[1].pExpr);
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else if( nFarg>0 ){
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[0].pExpr);
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for(i=0; i<nFarg; i++){
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( i<32 && sqlite3ExprIsConstant(pFarg->a[i].pExpr) ){
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          constMask |= (1<<i);
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( (pDef->flags & SQLITE_FUNC_NEEDCOLL)!=0 && !pColl ){
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pColl = sqlite3ExprCollSeq(pParse, pFarg->a[i].pExpr);
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pDef->flags & SQLITE_FUNC_NEEDCOLL ){
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( !pColl ) pColl = db->pDfltColl;
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ);
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp4(v, OP_Function, constMask, r1, target,
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        (char*)pDef, P4_FUNCDEF);
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeChangeP5(v, (u8)nFarg);
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( nFarg ){
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ReleaseTempRange(pParse, r1, nFarg);
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_EXISTS:
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_SELECT: {
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_EXISTS );
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_SELECT );
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      inReg = sqlite3CodeSubselect(pParse, pExpr, 0, 0);
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_IN: {
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int destIfFalse = sqlite3VdbeMakeLabel(v);
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int destIfNull = sqlite3VdbeMakeLabel(v);
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_Null, 0, target);
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull);
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_Integer, 1, target);
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeResolveLabel(v, destIfFalse);
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_AddImm, target, 0);
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeResolveLabel(v, destIfNull);
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_SUBQUERY */
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **    x BETWEEN y AND z
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** This is equivalent to
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **    x>=y AND x<=z
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** X is stored in pExpr->pLeft.
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Y is stored in pExpr->pList->a[0].pExpr.
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Z is stored in pExpr->pList->a[1].pExpr.
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_BETWEEN: {
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Expr *pLeft = pExpr->pLeft;
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct ExprList_item *pLItem = pExpr->x.pList->a;
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Expr *pRight = pLItem->pExpr;
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r1 = sqlite3ExprCodeTemp(pParse, pLeft, &regFree1);
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r2 = sqlite3ExprCodeTemp(pParse, pRight, &regFree2);
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree1==0 );
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree2==0 );
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r3 = sqlite3GetTempReg(pParse);
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r4 = sqlite3GetTempReg(pParse);
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      codeCompare(pParse, pLeft, pRight, OP_Ge,
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  r1, r2, r3, SQLITE_STOREP2);
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pLItem++;
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pRight = pLItem->pExpr;
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ReleaseTempReg(pParse, regFree2);
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r2 = sqlite3ExprCodeTemp(pParse, pRight, &regFree2);
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree2==0 );
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      codeCompare(pParse, pLeft, pRight, OP_Le, r1, r2, r4, SQLITE_STOREP2);
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp3(v, OP_And, r3, r4, target);
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ReleaseTempReg(pParse, r3);
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ReleaseTempReg(pParse, r4);
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_UPLUS: {
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_TRIGGER: {
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* If the opcode is TK_TRIGGER, then the expression is a reference
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** to a column in the new.* or old.* pseudo-tables available to
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** trigger programs. In this case Expr.iTable is set to 1 for the
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** is set to the column of the pseudo-table to read, or to -1 to
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** read the rowid field.
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** The expression is implemented using an OP_Param opcode. The p1
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** parameter is set to 0 for an old.rowid reference, or to (i+1)
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** to reference another column of the old.* pseudo-table, where
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** i is the index of the column. For a new.rowid reference, p1 is
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** set to (n+1), where n is the number of columns in each pseudo-table.
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** For a reference to any other column in the new.* pseudo-table, p1
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** is set to (n+2+i), where n and i are as defined previously. For
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** example, if the table on which triggers are being fired is
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** declared as:
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **   CREATE TABLE t1(a, b);
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** Then p1 is interpreted as follows:
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **   p1==0   ->    old.rowid     p1==3   ->    new.rowid
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **   p1==1   ->    old.a         p1==4   ->    new.a
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **   p1==2   ->    old.b         p1==5   ->    new.b
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Table *pTab = pExpr->pTab;
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + pExpr->iColumn;
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pExpr->iTable==0 || pExpr->iTable==1 );
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pExpr->iColumn>=-1 && pExpr->iColumn<pTab->nCol );
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pTab->iPKey<0 || pExpr->iColumn!=pTab->iPKey );
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( p1>=0 && p1<(pTab->nCol*2+2) );
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_Param, p1, target);
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VdbeComment((v, "%s.%s -> $%d",
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (pExpr->iTable ? "new" : "old"),
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName),
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ));
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* If the column has REAL affinity, it may currently be stored as an
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** integer. Use OP_RealAffinity to make sure it is really real.  */
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pExpr->iColumn>=0
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       && pTab->aCol[pExpr->iColumn].affinity==SQLITE_AFF_REAL
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ){
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeAddOp1(v, OP_RealAffinity, target);
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Form A:
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   CASE x WHEN e1 THEN r1 WHEN e2 THEN r2 ... WHEN eN THEN rN ELSE y END
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Form B:
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   CASE WHEN e1 THEN r1 WHEN e2 THEN r2 ... WHEN eN THEN rN ELSE y END
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Form A is can be transformed into the equivalent form B as follows:
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   CASE WHEN x=e1 THEN r1 WHEN x=e2 THEN r2 ...
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **        WHEN x=eN THEN rN ELSE y END
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** X (if it exists) is in pExpr->pLeft.
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Y is in pExpr->pRight.  The Y is also optional.  If there is no
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** ELSE clause and no other term matches, then the result of the
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** exprssion is NULL.
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Ei is in pExpr->pList->a[i*2] and Ri is pExpr->pList->a[i*2+1].
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** The result of the expression is the Ri for the first matching Ei,
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** or if there is no matching Ei, the ELSE term Y, or if there is
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** no ELSE term, NULL.
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: assert( op==TK_CASE ); {
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int endLabel;                     /* GOTO label for end of CASE stmt */
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int nextCase;                     /* GOTO label for next WHEN clause */
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int nExpr;                        /* 2x number of WHEN terms */
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int i;                            /* Loop counter */
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExprList *pEList;                 /* List of WHEN terms */
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct ExprList_item *aListelem;  /* Array of WHEN terms */
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Expr opCompare;                   /* The X==Ei expression */
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Expr cacheX;                      /* Cached expression X */
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Expr *pX;                         /* The X expression */
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Expr *pTest = 0;                  /* X==Ei (form A) or just Ei (form B) */
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VVA_ONLY( int iCacheLevel = pParse->iCacheLevel; )
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( !ExprHasProperty(pExpr, EP_xIsSelect) && pExpr->x.pList );
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert((pExpr->x.pList->nExpr % 2) == 0);
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert(pExpr->x.pList->nExpr > 0);
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pEList = pExpr->x.pList;
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aListelem = pEList->a;
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nExpr = pEList->nExpr;
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      endLabel = sqlite3VdbeMakeLabel(v);
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( (pX = pExpr->pLeft)!=0 ){
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cacheX = *pX;
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        testcase( pX->op==TK_COLUMN );
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        testcase( pX->op==TK_REGISTER );
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cacheX.iTable = sqlite3ExprCodeTemp(pParse, pX, &regFree1);
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        testcase( regFree1==0 );
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cacheX.op = TK_REGISTER;
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        opCompare.op = TK_EQ;
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        opCompare.pLeft = &cacheX;
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pTest = &opCompare;
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Ticket b351d95f9cd5ef17e9d9dbae18f5ca8611190001:
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** The value in regFree1 might get SCopy-ed into the file result.
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** So make sure that the regFree1 register is not reused for other
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** purposes and possibly overwritten.  */
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        regFree1 = 0;
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for(i=0; i<nExpr; i=i+2){
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ExprCachePush(pParse);
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( pX ){
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          assert( pTest!=0 );
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          opCompare.pRight = aListelem[i].pExpr;
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pTest = aListelem[i].pExpr;
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nextCase = sqlite3VdbeMakeLabel(v);
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        testcase( pTest->op==TK_COLUMN );
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL);
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        testcase( aListelem[i+1].pExpr->op==TK_COLUMN );
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        testcase( aListelem[i+1].pExpr->op==TK_REGISTER );
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ExprCode(pParse, aListelem[i+1].pExpr, target);
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeAddOp2(v, OP_Goto, 0, endLabel);
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ExprCachePop(pParse, 1);
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeResolveLabel(v, nextCase);
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pExpr->pRight ){
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ExprCachePush(pParse);
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ExprCode(pParse, pExpr->pRight, target);
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ExprCachePop(pParse, 1);
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeAddOp2(v, OP_Null, 0, target);
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( db->mallocFailed || pParse->nErr>0
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           || pParse->iCacheLevel==iCacheLevel );
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeResolveLabel(v, endLabel);
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TRIGGER
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_RAISE: {
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pExpr->affinity==OE_Rollback
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           || pExpr->affinity==OE_Abort
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           || pExpr->affinity==OE_Fail
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           || pExpr->affinity==OE_Ignore
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( !pParse->pTriggerTab ){
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ErrorMsg(pParse,
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       "RAISE() may only be used within a trigger-program");
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pExpr->affinity==OE_Abort ){
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3MayAbort(pParse);
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( !ExprHasProperty(pExpr, EP_IntValue) );
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pExpr->affinity==OE_Ignore ){
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeAddOp4(
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            v, OP_Halt, SQLITE_OK, OE_Ignore, 0, pExpr->u.zToken,0);
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3HaltConstraint(pParse, pExpr->affinity, pExpr->u.zToken, 0);
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ReleaseTempReg(pParse, regFree1);
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ReleaseTempReg(pParse, regFree2);
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return inReg;
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code to evaluate an expression and store the results
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** into a register.  Return the register number where the results
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are stored.
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the register is a temporary register that can be deallocated,
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then write its number into *pReg.  If the result register is not
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a temporary, then set *pReg to zero.
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int r1 = sqlite3GetTempReg(pParse);
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1);
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( r2==r1 ){
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *pReg = r1;
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ReleaseTempReg(pParse, r1);
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *pReg = 0;
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return r2;
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code that will evaluate expression pExpr and store the
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** results in register target.  The results are guaranteed to appear
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in register target.
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int inReg;
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( target>0 && target<=pParse->nMem );
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pExpr && pExpr->op==TK_REGISTER ){
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(pParse->pVdbe, OP_Copy, pExpr->iTable, target);
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inReg = sqlite3ExprCodeTarget(pParse, pExpr, target);
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pParse->pVdbe || pParse->db->mallocFailed );
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( inReg!=target && pParse->pVdbe ){
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, inReg, target);
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return target;
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code that evalutes the given expression and puts the result
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in register target.
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Also make a copy of the expression results into another "cache" register
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and modify the expression so that the next time it is evaluated,
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the result is a copy of the cache register.
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is used for expressions that are used multiple
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** times.  They are evaluated once and the results of the expression
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are reused.
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr, int target){
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v = pParse->pVdbe;
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int inReg;
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inReg = sqlite3ExprCode(pParse, pExpr, target);
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( target>0 );
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* This routine is called for terms to INSERT or UPDATE.  And the only
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** other place where expressions can be converted into TK_REGISTER is
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** in WHERE clause processing.  So as currently implemented, there is
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** no way for a TK_REGISTER to exist here.  But it seems prudent to
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** keep the ALWAYS() in case the conditions above change with future
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** modifications or enhancements. */
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(pExpr->op!=TK_REGISTER) ){
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int iMem;
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iMem = ++pParse->nMem;
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_Copy, inReg, iMem);
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pExpr->iTable = iMem;
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pExpr->op2 = pExpr->op;
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pExpr->op = TK_REGISTER;
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return inReg;
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return TRUE if pExpr is an constant expression that is appropriate
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for factoring out of a loop.  Appropriate expressions are:
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    *  Any expression that evaluates to two or more opcodes.
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    *  Any OP_Integer, OP_Real, OP_String, OP_Blob, OP_Null,
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**       or OP_Variable that does not need to be placed in a
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**       specific register.
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** There is no point in factoring out single-instruction constant
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expressions that need to be placed in a particular register.
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** We could factor them out, but then we would end up adding an
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** OP_SCopy instruction to move the value into the correct register
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** later.  We might as well just use the original instruction and
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** avoid the OP_SCopy.
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int isAppropriateForFactoring(Expr *p){
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !sqlite3ExprIsConstantNotJoin(p) ){
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;  /* Only constant expressions are appropriate for factoring */
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (p->flags & EP_FixedDest)==0 ){
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;  /* Any constant without a fixed destination is appropriate */
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( p->op==TK_UPLUS ) p = p->pLeft;
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( p->op ){
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_BLOB_LITERAL
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_BLOB:
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_VARIABLE:
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_INTEGER:
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_FLOAT:
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_NULL:
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_STRING: {
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( p->op==TK_BLOB );
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( p->op==TK_VARIABLE );
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( p->op==TK_INTEGER );
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( p->op==TK_FLOAT );
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( p->op==TK_NULL );
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( p->op==TK_STRING );
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Single-instruction constants with a fixed destination are
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** better done in-line.  If we factor them, they will just end
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** up generating an OP_SCopy to move the value to the destination
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** register. */
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_UMINUS: {
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( p->pLeft->op==TK_FLOAT || p->pLeft->op==TK_INTEGER ){
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: {
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1;
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If pExpr is a constant expression that is appropriate for
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** factoring out of a loop, then evaluate the expression
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** into a register and convert the expression into a TK_REGISTER
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression.
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int evalConstExpr(Walker *pWalker, Expr *pExpr){
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse = pWalker->pParse;
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( pExpr->op ){
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_IN:
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_REGISTER: {
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return WRC_Prune;
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_FUNCTION:
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_AGG_FUNCTION:
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_CONST_FUNC: {
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* The arguments to a function have a fixed destination.
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** Mark them this way to avoid generated unneeded OP_SCopy
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** instructions.
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExprList *pList = pExpr->x.pList;
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pList ){
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int i = pList->nExpr;
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        struct ExprList_item *pItem = pList->a;
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(; i>0; i--, pItem++){
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( ALWAYS(pItem->pExpr) ) pItem->pExpr->flags |= EP_FixedDest;
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( isAppropriateForFactoring(pExpr) ){
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int r1 = ++pParse->nMem;
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int r2;
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1);
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( NEVER(r1!=r2) ) sqlite3ReleaseTempReg(pParse, r1);
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pExpr->op2 = pExpr->op;
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pExpr->op = TK_REGISTER;
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pExpr->iTable = r2;
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WRC_Prune;
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WRC_Continue;
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Preevaluate constant subexpressions within pExpr and store the
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** results in registers.  Modify pExpr so that the constant subexpresions
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are TK_REGISTER opcodes that refer to the precomputed values.
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is a no-op if the jump to the cookie-check code has
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** already occur.  Since the cookie-check jump is generated prior to
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** any other serious processing, this check ensures that there is no
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** way to accidently bypass the constant initializations.
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is also a no-op if the SQLITE_FactorOutConst optimization
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is disabled via the sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS)
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** interface.  This allows test logic to verify that the same answer is
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** obtained for queries regardless of whether or not constants are
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** precomputed into registers or if they are inserted in-line.
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCodeConstants(Parse *pParse, Expr *pExpr){
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Walker w;
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pParse->cookieGoto ) return;
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pParse->db->flags & SQLITE_FactorOutConst)!=0 ) return;
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w.xExprCallback = evalConstExpr;
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w.xSelectCallback = 0;
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w.pParse = pParse;
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3WalkExpr(&w, pExpr);
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code that pushes the value of every element of the given
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression list into a sequence of registers beginning at target.
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of elements evaluated.
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCodeExprList(
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,     /* Parsing context */
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExprList *pList,   /* The expression list to be coded */
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int target,        /* Where to write results */
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int doHardCopy     /* Make a hard copy of every element */
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ExprList_item *pItem;
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i, n;
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pList!=0 );
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( target>0 );
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pParse->pVdbe!=0 );  /* Never gets this far otherwise */
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = pList->nExpr;
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pItem=pList->a, i=0; i<n; i++, pItem++){
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Expr *pExpr = pItem->pExpr;
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i);
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( inReg!=target+i ){
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(pParse->pVdbe, doHardCopy ? OP_Copy : OP_SCopy,
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        inReg, target+i);
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return n;
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code for a BETWEEN operator.
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    x BETWEEN y AND z
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The above is equivalent to
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    x>=y AND x<=z
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Code it as such, taking care to do the common subexpression
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** elementation of x.
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void exprCodeBetween(
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,    /* Parsing and code generating context */
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pExpr,      /* The BETWEEN expression */
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int dest,         /* Jump here if the jump is taken */
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int jumpIfTrue,   /* Take the jump if the BETWEEN is true */
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int jumpIfNull    /* Take the jump if the BETWEEN is NULL */
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr exprAnd;     /* The AND operator in  x>=y AND x<=z  */
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr compLeft;    /* The  x>=y  term */
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr compRight;   /* The  x<=z  term */
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr exprX;       /* The  x  subexpression */
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int regFree1 = 0; /* Temporary use register */
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exprX = *pExpr->pLeft;
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exprAnd.op = TK_AND;
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exprAnd.pLeft = &compLeft;
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exprAnd.pRight = &compRight;
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  compLeft.op = TK_GE;
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  compLeft.pLeft = &exprX;
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  compLeft.pRight = pExpr->x.pList->a[0].pExpr;
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  compRight.op = TK_LE;
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  compRight.pLeft = &exprX;
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  compRight.pRight = pExpr->x.pList->a[1].pExpr;
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exprX.iTable = sqlite3ExprCodeTemp(pParse, &exprX, &regFree1);
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exprX.op = TK_REGISTER;
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( jumpIfTrue ){
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExprIfTrue(pParse, &exprAnd, dest, jumpIfNull);
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExprIfFalse(pParse, &exprAnd, dest, jumpIfNull);
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ReleaseTempReg(pParse, regFree1);
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Ensure adequate test coverage */
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( jumpIfTrue==0 && jumpIfNull==0 && regFree1==0 );
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( jumpIfTrue==0 && jumpIfNull==0 && regFree1!=0 );
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( jumpIfTrue==0 && jumpIfNull!=0 && regFree1==0 );
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( jumpIfTrue==0 && jumpIfNull!=0 && regFree1!=0 );
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( jumpIfTrue!=0 && jumpIfNull==0 && regFree1==0 );
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( jumpIfTrue!=0 && jumpIfNull==0 && regFree1!=0 );
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( jumpIfTrue!=0 && jumpIfNull!=0 && regFree1==0 );
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( jumpIfTrue!=0 && jumpIfNull!=0 && regFree1!=0 );
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code for a boolean expression such that a jump is made
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the label "dest" if the expression is true but execution
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** continues straight thru if the expression is false.
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the expression evaluates to NULL (neither true nor false), then
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** take the jump if the jumpIfNull flag is SQLITE_JUMPIFNULL.
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This code depends on the fact that certain token values (ex: TK_EQ)
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are the same as opcode values (ex: OP_Eq) that implement the corresponding
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** operation.  Special comments in vdbe.c and the mkopcodeh.awk script in
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the make process cause these values to align.  Assert()s in the code
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** below verify that the numbers are aligned correctly.
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v = pParse->pVdbe;
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int op = 0;
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int regFree1 = 0;
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int regFree2 = 0;
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int r1, r2;
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 );
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( NEVER(v==0) )     return;  /* Existance of VDBE checked by caller */
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( NEVER(pExpr==0) ) return;  /* No way this can happen */
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  op = pExpr->op;
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( op ){
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_AND: {
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int d2 = sqlite3VdbeMakeLabel(v);
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( jumpIfNull==0 );
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprCachePush(pParse);
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2,jumpIfNull^SQLITE_JUMPIFNULL);
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeResolveLabel(v, d2);
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprCachePop(pParse, 1);
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_OR: {
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( jumpIfNull==0 );
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_NOT: {
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( jumpIfNull==0 );
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_LT:
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_LE:
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_GT:
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_GE:
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_NE:
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_EQ: {
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_LT==OP_Lt );
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_LE==OP_Le );
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_GT==OP_Gt );
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_GE==OP_Ge );
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_EQ==OP_Eq );
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_NE==OP_Ne );
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_LT );
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_LE );
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_GT );
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_GE );
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_EQ );
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_NE );
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( jumpIfNull==0 );
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, &regFree2);
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  r1, r2, dest, jumpIfNull);
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree1==0 );
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree2==0 );
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_IS:
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_ISNOT: {
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_IS );
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_ISNOT );
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, &regFree2);
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      op = (op==TK_IS) ? TK_EQ : TK_NE;
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  r1, r2, dest, SQLITE_NULLEQ);
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree1==0 );
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree2==0 );
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_ISNULL:
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_NOTNULL: {
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_ISNULL==OP_IsNull );
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( TK_NOTNULL==OP_NotNull );
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_ISNULL );
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_NOTNULL );
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, op, r1, dest);
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree1==0 );
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_BETWEEN: {
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( jumpIfNull==0 );
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      exprCodeBetween(pParse, pExpr, dest, 1, jumpIfNull);
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_IN: {
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int destIfFalse = sqlite3VdbeMakeLabel(v);
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int destIfNull = jumpIfNull ? dest : destIfFalse;
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull);
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_Goto, 0, dest);
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeResolveLabel(v, destIfFalse);
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: {
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r1 = sqlite3ExprCodeTemp(pParse, pExpr, &regFree1);
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp3(v, OP_If, r1, dest, jumpIfNull!=0);
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree1==0 );
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( jumpIfNull==0 );
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ReleaseTempReg(pParse, regFree1);
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ReleaseTempReg(pParse, regFree2);
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code for a boolean expression such that a jump is made
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the label "dest" if the expression is false but execution
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** continues straight thru if the expression is true.
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the expression evaluates to NULL (neither true nor false) then
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** jump if jumpIfNull is SQLITE_JUMPIFNULL or fall through if jumpIfNull
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is 0.
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v = pParse->pVdbe;
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int op = 0;
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int regFree1 = 0;
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int regFree2 = 0;
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int r1, r2;
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 );
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( NEVER(v==0) ) return; /* Existance of VDBE checked by caller */
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pExpr==0 )    return;
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The value of pExpr->op and op are related as follows:
32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **       pExpr->op            op
32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **       ---------          ----------
32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **       TK_ISNULL          OP_NotNull
32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **       TK_NOTNULL         OP_IsNull
33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **       TK_NE              OP_Eq
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **       TK_EQ              OP_Ne
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **       TK_GT              OP_Le
33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **       TK_LE              OP_Gt
33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **       TK_GE              OP_Lt
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **       TK_LT              OP_Ge
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** For other values of pExpr->op, op is undefined and unused.
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** The value of TK_ and OP_ constants are arranged such that we
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** can compute the mapping above using the following expression.
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Assert()s verify that the computation is correct.
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  op = ((pExpr->op+(TK_ISNULL&1))^1)-(TK_ISNULL&1);
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Verify correct alignment of TK_ and OP_ constants
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pExpr->op!=TK_ISNULL || op==OP_NotNull );
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pExpr->op!=TK_NOTNULL || op==OP_IsNull );
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pExpr->op!=TK_NE || op==OP_Eq );
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pExpr->op!=TK_EQ || op==OP_Ne );
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pExpr->op!=TK_LT || op==OP_Ge );
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pExpr->op!=TK_LE || op==OP_Gt );
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pExpr->op!=TK_GT || op==OP_Le );
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pExpr->op!=TK_GE || op==OP_Lt );
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( pExpr->op ){
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_AND: {
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( jumpIfNull==0 );
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_OR: {
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int d2 = sqlite3VdbeMakeLabel(v);
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( jumpIfNull==0 );
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprCachePush(pParse);
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL);
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeResolveLabel(v, d2);
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprCachePop(pParse, 1);
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_NOT: {
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( jumpIfNull==0 );
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_LT:
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_LE:
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_GT:
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_GE:
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_NE:
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_EQ: {
33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_LT );
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_LE );
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_GT );
33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_GE );
33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_EQ );
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_NE );
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( jumpIfNull==0 );
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, &regFree2);
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  r1, r2, dest, jumpIfNull);
33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree1==0 );
33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree2==0 );
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_IS:
33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_ISNOT: {
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( pExpr->op==TK_IS );
33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( pExpr->op==TK_ISNOT );
33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, &regFree2);
33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      op = (pExpr->op==TK_IS) ? TK_NE : TK_EQ;
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  r1, r2, dest, SQLITE_NULLEQ);
33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree1==0 );
33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree2==0 );
33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_ISNULL:
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_NOTNULL: {
33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_ISNULL );
33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( op==TK_NOTNULL );
33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, &regFree1);
33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, op, r1, dest);
33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree1==0 );
33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_BETWEEN: {
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( jumpIfNull==0 );
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      exprCodeBetween(pParse, pExpr, dest, 0, jumpIfNull);
33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY
33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_IN: {
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( jumpIfNull ){
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ExprCodeIN(pParse, pExpr, dest, dest);
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int destIfNull = sqlite3VdbeMakeLabel(v);
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull);
34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeResolveLabel(v, destIfNull);
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: {
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r1 = sqlite3ExprCodeTemp(pParse, pExpr, &regFree1);
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp3(v, OP_IfNot, r1, dest, jumpIfNull!=0);
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( regFree1==0 );
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( jumpIfNull==0 );
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ReleaseTempReg(pParse, regFree1);
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ReleaseTempReg(pParse, regFree2);
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Do a deep comparison of two expression trees.  Return 0 if the two
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expressions are completely identical.  Return 1 if they differ only
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by a COLLATE operator at the top level.  Return 2 if there are differences
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** other than the top-level COLLATE operator.
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Sometimes this routine will return 2 even if the two expressions
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** really are equivalent.  If we cannot prove that the expressions are
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** identical, we return 2 just to be safe.  So if this routine
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** returns 2, then you do not really know for certain if the two
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expressions are the same.  But if you get a 0 or 1 return, then you
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** can be sure the expressions are the same.  In the places where
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** this routine is used, it does not hurt to get an extra 2 - that
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** just might result in some slightly slower code.  But returning
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an incorrect 0 or 1 could lead to a malfunction.
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCompare(Expr *pA, Expr *pB){
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pA==0||pB==0 ){
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pB==pA ? 0 : 2;
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( !ExprHasAnyProperty(pA, EP_TokenOnly|EP_Reduced) );
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( !ExprHasAnyProperty(pB, EP_TokenOnly|EP_Reduced) );
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ExprHasProperty(pA, EP_xIsSelect) || ExprHasProperty(pB, EP_xIsSelect) ){
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 2;
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2;
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pA->op!=pB->op ) return 2;
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3ExprCompare(pA->pLeft, pB->pLeft) ) return 2;
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3ExprCompare(pA->pRight, pB->pRight) ) return 2;
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList) ) return 2;
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 2;
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ExprHasProperty(pA, EP_IntValue) ){
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !ExprHasProperty(pB, EP_IntValue) || pA->u.iValue!=pB->u.iValue ){
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 2;
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( pA->op!=TK_COLUMN && pA->u.zToken ){
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( ExprHasProperty(pB, EP_IntValue) || NEVER(pB->u.zToken==0) ) return 2;
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ){
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 2;
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pA->flags & EP_ExpCollate)!=(pB->flags & EP_ExpCollate) ) return 1;
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pA->flags & EP_ExpCollate)!=0 && pA->pColl!=pB->pColl ) return 2;
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compare two ExprList objects.  Return 0 if they are identical and
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** non-zero if they differ in any way.
34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine might return non-zero for equivalent ExprLists.  The
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** only consequence will be disabled optimizations.  But this routine
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** must never return 0 if the two ExprList objects are different, or
34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a malfunction will result.
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Two NULL pointers are considered to be the same.  But a NULL pointer
34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** always differs from a non-NULL pointer.
34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprListCompare(ExprList *pA, ExprList *pB){
34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pA==0 && pB==0 ) return 0;
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pA==0 || pB==0 ) return 1;
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pA->nExpr!=pB->nExpr ) return 1;
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<pA->nExpr; i++){
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Expr *pExprA = pA->a[i].pExpr;
34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Expr *pExprB = pB->a[i].pExpr;
34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pA->a[i].sortOrder!=pB->a[i].sortOrder ) return 1;
34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3ExprCompare(pExprA, pExprB) ) return 1;
34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add a new element to the pAggInfo->aCol[] array.  Return the index of
34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the new element.  Return a negative number if malloc fails.
34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int addAggInfoColumn(sqlite3 *db, AggInfo *pInfo){
34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pInfo->aCol = sqlite3ArrayAllocate(
34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       db,
34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       pInfo->aCol,
35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       sizeof(pInfo->aCol[0]),
35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       3,
35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       &pInfo->nColumn,
35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       &pInfo->nColumnAlloc,
35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       &i
35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return i;
35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add a new element to the pAggInfo->aFunc[] array.  Return the index of
35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the new element.  Return a negative number if malloc fails.
35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){
35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pInfo->aFunc = sqlite3ArrayAllocate(
35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       db,
35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       pInfo->aFunc,
35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       sizeof(pInfo->aFunc[0]),
35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       3,
35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       &pInfo->nFunc,
35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       &pInfo->nFuncAlloc,
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       &i
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return i;
35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is the xExprCallback for a tree walker.  It is used to
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** implement sqlite3ExprAnalyzeAggregates().  See sqlite3ExprAnalyzeAggregates
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for additional information.
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NameContext *pNC = pWalker->u.pNC;
35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse = pNC->pParse;
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SrcList *pSrcList = pNC->pSrcList;
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AggInfo *pAggInfo = pNC->pAggInfo;
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( pExpr->op ){
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_AGG_COLUMN:
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_COLUMN: {
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( pExpr->op==TK_AGG_COLUMN );
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testcase( pExpr->op==TK_COLUMN );
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Check to see if the column is in one of the tables in the FROM
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** clause of the aggregate query */
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( ALWAYS(pSrcList!=0) ){
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        struct SrcList_item *pItem = pSrcList->a;
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(i=0; i<pSrcList->nSrc; i++, pItem++){
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          struct AggInfo_col *pCol;
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          assert( !ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_Reduced) );
35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( pExpr->iTable==pItem->iCursor ){
35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* If we reach this point, it means that pExpr refers to a table
35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ** that is in the FROM clause of the aggregate query.
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            **
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ** Make an entry for the column in pAggInfo->aCol[] if there
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ** is not an entry there already.
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            */
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int k;
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pCol = pAggInfo->aCol;
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for(k=0; k<pAggInfo->nColumn; k++, pCol++){
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if( pCol->iTable==pExpr->iTable &&
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  pCol->iColumn==pExpr->iColumn ){
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if( (k>=pAggInfo->nColumn)
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ){
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pCol = &pAggInfo->aCol[k];
35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pCol->pTab = pExpr->pTab;
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pCol->iTable = pExpr->iTable;
35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pCol->iColumn = pExpr->iColumn;
35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pCol->iMem = ++pParse->nMem;
35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pCol->iSorterColumn = -1;
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pCol->pExpr = pExpr;
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if( pAggInfo->pGroupBy ){
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                int j, n;
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ExprList *pGB = pAggInfo->pGroupBy;
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                struct ExprList_item *pTerm = pGB->a;
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                n = pGB->nExpr;
35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                for(j=0; j<n; j++, pTerm++){
35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  Expr *pE = pTerm->pExpr;
35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  if( pE->op==TK_COLUMN && pE->iTable==pExpr->iTable &&
35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      pE->iColumn==pExpr->iColumn ){
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    pCol->iSorterColumn = j;
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    break;
35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  }
35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }
35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if( pCol->iSorterColumn<0 ){
35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                pCol->iSorterColumn = pAggInfo->nSortingColumn++;
35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              }
35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* There is now an entry for pExpr in pAggInfo->aCol[] (either
35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ** because it was there before or because we just created it).
35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ** Convert the pExpr to be a TK_AGG_COLUMN referring to that
35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ** pAggInfo->aCol[] entry.
35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            */
35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExprSetIrreducible(pExpr);
36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pExpr->pAggInfo = pAggInfo;
36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pExpr->op = TK_AGG_COLUMN;
36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pExpr->iAgg = (i16)k;
36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          } /* endif pExpr->iTable==pItem->iCursor */
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } /* end loop over pSrcList */
36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return WRC_Prune;
36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TK_AGG_FUNCTION: {
36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* The pNC->nDepth==0 test causes aggregate functions in subqueries
36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** to be ignored */
36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pNC->nDepth==0 ){
36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Check to see if pExpr is a duplicate of another aggregate
36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** function that is already in the pAggInfo structure
36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        */
36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        struct AggInfo_func *pItem = pAggInfo->aFunc;
36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(i=0; i<pAggInfo->nFunc; i++, pItem++){
36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( sqlite3ExprCompare(pItem->pExpr, pExpr)==0 ){
36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( i>=pAggInfo->nFunc ){
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* pExpr is original.  Make a new entry in pAggInfo->aFunc[]
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          */
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          u8 enc = ENC(pParse->db);
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          i = addAggInfoFunc(pParse->db, pAggInfo);
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( i>=0 ){
36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pItem = &pAggInfo->aFunc[i];
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pItem->pExpr = pExpr;
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pItem->iMem = ++pParse->nMem;
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assert( !ExprHasProperty(pExpr, EP_IntValue) );
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pItem->pFunc = sqlite3FindFunction(pParse->db,
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   pExpr->u.zToken, sqlite3Strlen30(pExpr->u.zToken),
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   pExpr->x.pList ? pExpr->x.pList->nExpr : 0, enc, 0);
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if( pExpr->flags & EP_Distinct ){
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pItem->iDistinct = pParse->nTab++;
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }else{
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              pItem->iDistinct = -1;
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Make pExpr point to the appropriate pAggInfo->aFunc[] entry
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        */
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( !ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_Reduced) );
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ExprSetIrreducible(pExpr);
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pExpr->iAgg = (i16)i;
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pExpr->pAggInfo = pAggInfo;
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return WRC_Prune;
36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WRC_Continue;
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int analyzeAggregatesInSelect(Walker *pWalker, Select *pSelect){
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NameContext *pNC = pWalker->u.pNC;
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pNC->nDepth==0 ){
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNC->nDepth++;
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3WalkSelect(pWalker, pSelect);
36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNC->nDepth--;
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WRC_Prune;
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WRC_Continue;
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Analyze the given expression looking for aggregate functions and
36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for variables that need to be added to the pParse->aAgg[] array.
36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Make additional entries to the pParse->aAgg[] array as necessary.
36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine should only be called after the expression has been
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** analyzed by sqlite3ResolveExprNames().
36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Walker w;
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w.xExprCallback = analyzeAggregate;
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w.xSelectCallback = analyzeAggregatesInSelect;
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  w.u.pNC = pNC;
36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pNC->pSrcList!=0 );
36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3WalkExpr(&w, pExpr);
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call sqlite3ExprAnalyzeAggregates() for every expression in an
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression list.  Return the number of errors.
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If an error is found, the analysis is cut short.
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprAnalyzeAggList(NameContext *pNC, ExprList *pList){
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ExprList_item *pItem;
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pList ){
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(pItem=pList->a, i=0; i<pList->nExpr; i++, pItem++){
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprAnalyzeAggregates(pNC, pItem->pExpr);
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate a single new register for use to hold some intermediate result.
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3GetTempReg(Parse *pParse){
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pParse->nTempReg==0 ){
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ++pParse->nMem;
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pParse->aTempReg[--pParse->nTempReg];
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Deallocate a register, making available for reuse for some other
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** purpose.
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If a register is currently being used by the column cache, then
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the dallocation is deferred until the column cache line that uses
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the register becomes stale.
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ReleaseTempReg(Parse *pParse, int iReg){
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( iReg && pParse->nTempReg<ArraySize(pParse->aTempReg) ){
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct yColCache *p;
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( p->iReg==iReg ){
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->tempReg = 1;
37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->aTempReg[pParse->nTempReg++] = iReg;
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate or deallocate a block of nReg consecutive registers
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3GetTempRange(Parse *pParse, int nReg){
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i, n;
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i = pParse->iRangeReg;
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = pParse->nRangeReg;
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( nReg<=n ){
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( !usedAsColumnCache(pParse, i, i+n-1) );
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->iRangeReg += nReg;
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->nRangeReg -= nReg;
37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i = pParse->nMem+1;
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->nMem += nReg;
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return i;
37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprCacheRemove(pParse, iReg, nReg);
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( nReg>pParse->nRangeReg ){
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->nRangeReg = nReg;
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->iRangeReg = iReg;
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3756