/ Hex Artifact Content
Login

Artifact 36c313049a716c3edcdd99d703f0f16ce96a4cc6:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0470: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0480: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0490: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
04a0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
04b0: 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
04c0: 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  t( pExpr->flags&
04d0: 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a  EP_xIsSelect );.
04e0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
04f0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0500: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
0510: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
0520: 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  xpr);.  }.#ifnde
0530: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
0540: 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  ST.  if( op==TK_
0550: 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73 65  CAST ){.    asse
0560: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0570: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
0580: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
0590: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 66  return sqlite3Af
05a0: 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
05b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a  ->u.zToken, 0);.
05c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
05d0: 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c   (op==TK_AGG_COL
05e0: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f  UMN || op==TK_CO
05f0: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52  LUMN || op==TK_R
0600: 45 47 49 53 54 45 52 29 20 0a 20 20 20 26 26 20  EGISTER) .   && 
0610: 70 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20  pExpr->pTab!=0. 
0620: 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54   ){.    /* op==T
0630: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45  K_REGISTER && pE
0640: 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70  xpr->pTab!=0 hap
0650: 70 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20  pens when pExpr 
0660: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
0670: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
0680: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
0690: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
06a0: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
06b0: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69  egister */.    i
06c0: 6e 74 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43  nt j = pExpr->iC
06d0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a  olumn;.    if( j
06e0: 3c 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <0 ) return SQLI
06f0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
0700: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0710: 72 2d 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78  r->pTab && j<pEx
0720: 70 72 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  pr->pTab->nCol )
0730: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  ;.    return pEx
0740: 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  pr->pTab->aCol[j
0750: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a  ].affinity;.  }.
0760: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
0770: 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a  affinity;.}../*.
0780: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
0790: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
07a0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  r expression pEx
07b0: 70 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c  pr to be the col
07c0: 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
07d0: 63 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b  ce named by pTok
07e0: 65 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70  en.   Return a p
07f0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
0800: 45 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a  Expr node that.*
0810: 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
0820: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
0830: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  r..**.** If a me
0840: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
0850: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
0860: 61 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72  at fact is recor
0870: 64 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64  ded in pParse->d
0880: 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78  b.** and the pEx
0890: 70 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pr parameter is 
08a0: 72 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67  returned unchang
08b0: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
08c0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
08d0: 74 65 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70  teToken(Parse *p
08e0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
08f0: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c  pr, Token *pColl
0900: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 43 6f  Name){.  if( pCo
0910: 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20  llName->n>0 ){. 
0920: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
0930: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
0940: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
0950: 43 4f 4c 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61  COLLATE, pCollNa
0960: 6d 65 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  me, 1);.    if( 
0970: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e  pNew ){.      pN
0980: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70  ew->pLeft = pExp
0990: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  r;.      pNew->f
09a0: 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61  lags |= EP_Colla
09b0: 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20  te|EP_Skip;.    
09c0: 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
09d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
09e0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72  rn pExpr;.}.Expr
09f0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64   *sqlite3ExprAdd
0a00: 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61  CollateString(Pa
0a10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
0a20: 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20  r *pExpr, const 
0a30: 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b  char *zC){.  Tok
0a40: 65 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20  en s;.  assert( 
0a50: 7a 43 21 3d 30 20 29 3b 0a 20 20 73 2e 7a 20 3d  zC!=0 );.  s.z =
0a60: 20 7a 43 3b 0a 20 20 73 2e 6e 20 3d 20 73 71 6c   zC;.  s.n = sql
0a70: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 2e 7a  ite3Strlen30(s.z
0a80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
0a90: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0aa0: 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70  eToken(pParse, p
0ab0: 45 78 70 72 2c 20 26 73 29 3b 0a 7d 0a 0a 2f 2a  Expr, &s);.}../*
0ac0: 0a 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e  .** Skip over an
0ad0: 79 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 72 20  y TK_COLLATE or 
0ae0: 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 73 20  TK_AS operators 
0af0: 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79  and any unlikely
0b00: 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68  ().** or likelih
0b10: 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ood() function a
0b20: 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e  t the root of an
0b30: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
0b40: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
0b50: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70  rSkipCollate(Exp
0b60: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69  r *pExpr){.  whi
0b70: 6c 65 28 20 70 45 78 70 72 20 26 26 20 45 78 70  le( pExpr && Exp
0b80: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
0b90: 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a  pr, EP_Skip) ){.
0ba0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
0bb0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0bc0: 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20  P_Unlikely) ){. 
0bd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
0be0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0bf0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
0c00: 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  t) );.      asse
0c10: 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  rt( pExpr->x.pLi
0c20: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
0c30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
0c40: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pr->op==TK_FUNCT
0c50: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ION );.      pEx
0c60: 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  pr = pExpr->x.pL
0c70: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
0c80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
0c90: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0ca0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
0cb0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
0cc0: 5f 41 53 20 29 3b 0a 20 20 20 20 20 20 70 45 78  _AS );.      pEx
0cd0: 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pr = pExpr->pLef
0ce0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a  t;.    }.  }   .
0cf0: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
0d00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0d10: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
0d20: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65  quence for the e
0d30: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
0d40: 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20   If.** there is 
0d50: 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61  no defined colla
0d60: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72  ting sequence, r
0d70: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
0d80: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
0d90: 73 65 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62  sequence might b
0da0: 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  e determined by 
0db0: 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  a COLLATE operat
0dc0: 6f 72 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20  or.** or by the 
0dd0: 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f  presence of a co
0de0: 6c 75 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69  lumn with a defi
0df0: 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ned collating se
0e00: 71 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41  quence..** COLLA
0e10: 54 45 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b  TE operators tak
0e20: 65 20 66 69 72 73 74 20 70 72 65 63 65 64 65 6e  e first preceden
0e30: 63 65 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e  ce.  Left operan
0e40: 64 73 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65  ds take.** prece
0e50: 64 65 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74  dence over right
0e60: 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f   operands..*/.Co
0e70: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78  llSeq *sqlite3Ex
0e80: 70 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  prCollSeq(Parse 
0e90: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
0ea0: 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Expr){.  sqlite3
0eb0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
0ec0: 62 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  b;.  CollSeq *pC
0ed0: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20  oll = 0;.  Expr 
0ee0: 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68  *p = pExpr;.  wh
0ef0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e  ile( p ){.    in
0f00: 74 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  t op = p->op;.  
0f10: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53    if( op==TK_CAS
0f20: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55  T || op==TK_UPLU
0f30: 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70  S ){.      p = p
0f40: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63  ->pLeft;.      c
0f50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
0f60: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f     if( op==TK_CO
0f70: 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54 4b  LLATE || (op==TK
0f80: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
0f90: 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 29  op2==TK_COLLATE)
0fa0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
0fb0: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
0fc0: 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43 28  Seq(pParse, ENC(
0fd0: 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f  db), 0, p->u.zTo
0fe0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
0ff0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
1000: 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20   p->pTab!=0.    
1010: 20 26 26 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f   && (op==TK_AGG_
1020: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
1030: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
1040: 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    || op==TK_REGI
1050: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54  STER || op==TK_T
1060: 52 49 47 47 45 52 29 0a 20 20 20 20 29 7b 0a 20  RIGGER).    ){. 
1070: 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52       /* op==TK_R
1080: 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54  EGISTER && p->pT
1090: 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68  ab!=0 happens wh
10a0: 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72 69  en pExpr was ori
10b0: 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ginally.      **
10c0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
10d0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
10e0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
10f0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
1100: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
1110: 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  j = p->iColumn;.
1120: 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29        if( j>=0 )
1130: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1140: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d  char *zColl = p-
1150: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  >pTab->aCol[j].z
1160: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43  Coll;.        pC
1170: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
1180: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
1190: 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
11a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11c0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
11d0: 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
11e0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d     if( ALWAYS(p-
11f0: 3e 70 4c 65 66 74 29 20 26 26 20 28 70 2d 3e 70  >pLeft) && (p->p
1200: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
1210: 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a  _Collate)!=0 ){.
1220: 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70          p = p->p
1230: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Left;.      }els
1240: 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  e{.        p = p
1250: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1260: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1270: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1280: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1290: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
12a0: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20  arse, pColl) ){ 
12b0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a  .    pColl = 0;.
12c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
12d0: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ll;.}../*.** pEx
12e0: 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64  pr is an operand
12f0: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
1300: 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32   operator.  aff2
1310: 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20   is the.** type 
1320: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
1330: 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20  other operand.  
1340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1350: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  urns the.** type
1360: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73   affinity that s
1370: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
1380: 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  r the comparison
1390: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68   operator..*/.ch
13a0: 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  ar sqlite3Compar
13b0: 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  eAffinity(Expr *
13c0: 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32  pExpr, char aff2
13d0: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d  ){.  char aff1 =
13e0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
13f0: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69  nity(pExpr);.  i
1400: 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20  f( aff1 && aff2 
1410: 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73  ){.    /* Both s
1420: 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70  ides of the comp
1430: 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d  arison are colum
1440: 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e  ns. If one has n
1450: 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66  umeric.    ** af
1460: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
1470: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
1480: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
1490: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
14a0: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
14b0: 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71  nity(aff1) || sq
14c0: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
14d0: 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a  finity(aff2) ){.
14e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
1500: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1510: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1520: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  AFF_NONE;.    }.
1530: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
1540: 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20  1 && !aff2 ){.  
1550: 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64    /* Neither sid
1560: 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  e of the compari
1570: 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  son is a column.
1580: 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20    Compare the.  
1590: 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72    ** results dir
15a0: 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ectly..    */.  
15b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15c0: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73  AFF_NONE;.  }els
15d0: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
15e0: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
15f0: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
1600: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
1610: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
1620: 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d     assert( aff1=
1630: 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b  =0 || aff2==0 );
1640: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66  .    return (aff
1650: 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d  1 + aff2);.  }.}
1660: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
1670: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1680: 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  erator.  Return 
1690: 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
16a0: 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  y that should.**
16b0: 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62   be applied to b
16c0: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69  oth operands pri
16d0: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20  or to doing the 
16e0: 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73  comparison..*/.s
16f0: 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61  tatic char compa
1700: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78  risonAffinity(Ex
1710: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68  pr *pExpr){.  ch
1720: 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74  ar aff;.  assert
1730: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1740: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
1750: 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d  =TK_IN || pExpr-
1760: 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20  >op==TK_LT ||.  
1770: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1780: 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70  p==TK_GT || pExp
1790: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20  r->op==TK_GE || 
17a0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
17b0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
17c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c  xpr->op==TK_NE |
17d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
17e0: 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IS || pExpr->op=
17f0: 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61  =TK_ISNOT );.  a
1800: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1810: 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73  eft );.  aff = s
1820: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
1830: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
1840: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ;.  if( pExpr->p
1850: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66  Right ){.    aff
1860: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
1870: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
1880: 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20  >pRight, aff);. 
1890: 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48   }else if( ExprH
18a0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18b0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
18c0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
18d0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
18e0: 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65  ity(pExpr->x.pSe
18f0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
1900: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a  0].pExpr, aff);.
1910: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
1920: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51   ){.    aff = SQ
1930: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1940: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
1950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1960: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1970: 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20  expression, eg. 
1980: 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e  '=', '<', IN(...
1990: 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66  ) etc..** idx_af
19a0: 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66  finity is the af
19b0: 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64  finity of an ind
19c0: 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74  exed column. Ret
19d0: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74  urn true.** if t
19e0: 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66  he index with af
19f0: 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e  finity idx_affin
1a00: 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20  ity may be used 
1a10: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
1a20: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1a30: 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20  n pExpr..*/.int 
1a40: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
1a50: 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78  nityOk(Expr *pEx
1a60: 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66  pr, char idx_aff
1a70: 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61  inity){.  char a
1a80: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
1a90: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
1aa0: 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b    switch( aff ){
1ab0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ac0: 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20  _AFF_NONE:.     
1ad0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63   return 1;.    c
1ae0: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
1af0: 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72  EXT:.      retur
1b00: 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d  n idx_affinity==
1b10: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
1b20: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
1b30: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1b40: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1b50: 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79  ity(idx_affinity
1b60: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1b70: 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61  Return the P5 va
1b80: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
1b90: 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69  be used for a bi
1ba0: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  nary comparison.
1bb0: 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71  ** opcode (OP_Eq
1bc0: 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73  , OP_Ge etc.) us
1bd0: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45  ed to compare pE
1be0: 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e  xpr1 and pExpr2.
1bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69  .*/.static u8 bi
1c00: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78  naryCompareP5(Ex
1c10: 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72  pr *pExpr1, Expr
1c20: 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75   *pExpr2, int ju
1c30: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20  mpIfNull){.  u8 
1c40: 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69  aff = (char)sqli
1c50: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1c60: 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d  pExpr2);.  aff =
1c70: 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70   (u8)sqlite3Comp
1c80: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1c90: 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a  r1, aff) | (u8)j
1ca0: 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  umpIfNull;.  ret
1cb0: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
1cc0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1cd0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
1ce0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
1cf0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1d00: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
1d10: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1d20: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
1d30: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
1d40: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
1d50: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1d60: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
1d70: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
1d80: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
1d90: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
1da0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1db0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
1dc0: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
1dd0: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
1de0: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
1df0: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
1e00: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
1e10: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
1e20: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   type..**.** Arg
1e30: 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75  ument pRight (bu
1e40: 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79  t not pLeft) may
1e50: 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   be a null point
1e60: 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
1e70: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63  ,.** it is not c
1e80: 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f  onsidered..*/.Co
1e90: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69  llSeq *sqlite3Bi
1ea0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
1eb0: 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eq(.  Parse *pPa
1ec0: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c  rse, .  Expr *pL
1ed0: 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52  eft, .  Expr *pR
1ee0: 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  ight.){.  CollSe
1ef0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65  q *pColl;.  asse
1f00: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69  rt( pLeft );.  i
1f10: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
1f20: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
1f30: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1f40: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1f50: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
1f60: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
1f70: 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c  t && (pRight->fl
1f80: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
1f90: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  )!=0 ){.    pCol
1fa0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1fb0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1fc0: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
1fd0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1fe0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1ff0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
2000: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2010: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
2020: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2030: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
2040: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
2050: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
2060: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2070: 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61  code for a compa
2080: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
2090: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
20a0: 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72  deCompare(.  Par
20b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
20c0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61  * The parsing (a
20d0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
20e0: 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ng) context */. 
20f0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
2100: 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f     /* The left o
2110: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
2120: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a   *pRight,     /*
2130: 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   The right opera
2140: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f  nd */.  int opco
2150: 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  de,       /* The
2160: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f   comparison opco
2170: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c  de */.  int in1,
2180: 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67   int in2, /* Reg
2190: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70  ister holding op
21a0: 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20  erands */.  int 
21b0: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
21c0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72   Jump here if tr
21d0: 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  ue.  */.  int ju
21e0: 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49  mpIfNull    /* I
21f0: 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20  f true, jump if 
2200: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
2210: 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  s NULL */.){.  i
2220: 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64  nt p5;.  int add
2230: 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34  r;.  CollSeq *p4
2240: 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65  ;..  p4 = sqlite
2250: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2260: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2270: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
2280: 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61  p5 = binaryCompa
2290: 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67  reP5(pLeft, pRig
22a0: 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ht, jumpIfNull);
22b0: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
22c0: 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72  3VdbeAddOp4(pPar
22d0: 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64  se->pVdbe, opcod
22e0: 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e  e, in2, dest, in
22f0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
2310: 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c  oid*)p4, P4_COLL
2320: 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  SEQ);.  sqlite3V
2330: 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72  dbeChangeP5(pPar
2340: 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70  se->pVdbe, (u8)p
2350: 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  5);.  return add
2360: 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  r;.}..#if SQLITE
2370: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
2380: 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  0./*.** Check th
2390: 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69  at argument nHei
23a0: 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ght is less than
23b0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
23c0: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72   maximum.** expr
23d0: 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c  ession depth all
23e0: 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  owed. If it is n
23f0: 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ot, leave an err
2400: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a  or message in.**
2410: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20   pParse..*/.int 
2420: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
2430: 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50  Height(Parse *pP
2440: 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68  arse, int nHeigh
2450: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2460: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2470: 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73  mxHeight = pPars
2480: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
2490: 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
24a0: 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48  DEPTH];.  if( nH
24b0: 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29  eight>mxHeight )
24c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
24d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
24e0: 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f        "Expressio
24f0: 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61  n tree is too la
2500: 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70  rge (maximum dep
2510: 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68  th %d)", mxHeigh
2520: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20  t.    );.    rc 
2530: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2540: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2550: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  .}../* The follo
2560: 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74  wing three funct
2570: 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78  ions, heightOfEx
2580: 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78  pr(), heightOfEx
2590: 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20  prList().** and 
25a0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29  heightOfSelect()
25b0: 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65  , are used to de
25c0: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69  termine the maxi
25d0: 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66  mum height.** of
25e0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
25f0: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20  tree referenced 
2600: 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  by the structure
2610: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
2620: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
2630: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
2640: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69  maximum height i
2650: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
2660: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
2670: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
2680: 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20  y pnHeight, the 
2690: 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
26a0: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65  , then set *pnHe
26b0: 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  ight to that.** 
26c0: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
26d0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
26e0: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
26f0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2700: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
2710: 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69  ->nHeight>*pnHei
2720: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  ght ){.      *pn
2730: 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69  Height = p->nHei
2740: 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ght;.    }.  }.}
2750: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2760: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78  ghtOfExprList(Ex
2770: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a  prList *p, int *
2780: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
2790: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
27a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
27b0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  p->nExpr; i++){.
27c0: 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78        heightOfEx
27d0: 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pr(p->a[i].pExpr
27e0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
27f0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
2800: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c  void heightOfSel
2810: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
2820: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
2830: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65   if( p ){.    he
2840: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
2850: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
2860: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2870: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
2880: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2890: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
28a0: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
28b0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
28c0: 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48  (p->pOffset, pnH
28d0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
28e0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
28f0: 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74  pEList, pnHeight
2900: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2910: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
2920: 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  pBy, pnHeight);.
2930: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2940: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
2950: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2960: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2970: 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69  p->pPrior, pnHei
2980: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
2990: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
29a0: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
29b0: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
29c0: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
29d0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
29e0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
29f0: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
2a00: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
2a10: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
2a20: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
2a30: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
2a40: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
2a50: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
2a60: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2a70: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
2a80: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
2a90: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
2aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2ab0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45   exprSetHeight(E
2ac0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  xpr *p){.  int n
2ad0: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
2ae0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
2af0: 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  eft, &nHeight);.
2b00: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2b10: 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67  ->pRight, &nHeig
2b20: 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ht);.  if( ExprH
2b30: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
2b40: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
2b50: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
2b60: 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  t(p->x.pSelect, 
2b70: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c  &nHeight);.  }el
2b80: 73 65 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  se{.    heightOf
2b90: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
2ba0: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
2bb0: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
2bc0: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
2bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2be0: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
2bf0: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
2c00: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
2c10: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
2c20: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
2c30: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
2c40: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
2c50: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
2c60: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
2c70: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
2c80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
2c90: 70 72 53 65 74 48 65 69 67 68 74 28 50 61 72 73  prSetHeight(Pars
2ca0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
2cb0: 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48 65  *p){.  exprSetHe
2cc0: 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74  ight(p);.  sqlit
2cd0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
2ce0: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
2cf0: 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ight);.}../*.** 
2d00: 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  Return the maxim
2d10: 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79  um height of any
2d20: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
2d30: 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62   referenced.** b
2d40: 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  y the select sta
2d50: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
2d60: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f   an argument..*/
2d70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
2d80: 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c  ctExprHeight(Sel
2d90: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ect *p){.  int n
2da0: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
2db0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20  ightOfSelect(p, 
2dc0: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74  &nHeight);.  ret
2dd0: 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23  urn nHeight;.}.#
2de0: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 65  else.  #define e
2df0: 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a  xprSetHeight(y).
2e00: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2e10: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
2e20: 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0 */../*.** This
2e30: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
2e40: 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66  core allocator f
2e50: 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a  or Expr nodes..*
2e60: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
2e70: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
2e80: 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20  node and return 
2e90: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
2ea0: 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20    Memory.** for 
2eb0: 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f  this node and fo
2ec0: 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67  r the pToken arg
2ed0: 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c  ument is a singl
2ee0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  e allocation.** 
2ef0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2f00: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
2f10: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
2f20: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73  nction.** is res
2f30: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
2f40: 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64  ing sure the nod
2f50: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74  e eventually get
2f60: 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  s freed..**.** I
2f70: 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72 75  f dequote is tru
2f80: 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  e, then the toke
2f90: 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  n (if it exists)
2fa0: 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a   is dequoted..**
2fb0: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 66   If dequote is f
2fc0: 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69  alse, no dequoti
2fd0: 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 61 6e 63  ng is performanc
2fe0: 65 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  e.  The deQuote.
2ff0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
3000: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
3010: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
3020: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
3030: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
3040: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
3050: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
3060: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
3070: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
3080: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
3090: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
30a0: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
30b0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
30c0: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
30d0: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
30e0: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
30f0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
3100: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
3110: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
3120: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
3130: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
3140: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
3150: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
3160: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
3170: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
3180: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
3190: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
31a0: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
31b0: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
31c0: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
31d0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
31e0: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
31f0: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
3200: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
3210: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
3220: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3230: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3250: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
3260: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
3270: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
3280: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
3290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
32a0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
32b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
32c0: 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20   *pToken,    /* 
32d0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
32e0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
32f0: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
3300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3310: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a  rue to dequote *
3320: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
3330: 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  w;.  int nExtra 
3340: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75  = 0;.  int iValu
3350: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 54  e = 0;..  if( pT
3360: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
3370: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
3380: 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20  | pToken->z==0. 
3390: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
33a0: 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b  te3GetInt32(pTok
33b0: 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d  en->z, &iValue)=
33c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  =0 ){.      nExt
33d0: 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31  ra = pToken->n+1
33e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
33f0: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20  iValue>=0 );.   
3400: 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20   }.  }.  pNew = 
3410: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
3420: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  ero(db, sizeof(E
3430: 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20  xpr)+nExtra);.  
3440: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
3450: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
3460: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
3470: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
3480: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
3490: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
34a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
34b0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
34c0: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
34d0: 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56  w->u.iValue = iV
34e0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  alue;.      }els
34f0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  e{.        int c
3500: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
3510: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
3520: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20  *)&pNew[1];.    
3530: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
3540: 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b  en->z!=0 || pTok
3550: 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  en->n==0 );.    
3560: 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e      if( pToken->
3570: 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  n ) memcpy(pNew-
3580: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65  >u.zToken, pToke
3590: 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29  n->z, pToken->n)
35a0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
35b0: 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d  u.zToken[pToken-
35c0: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  >n] = 0;.       
35d0: 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20   if( dequote && 
35e0: 6e 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20 20  nExtra>=3 .     
35f0: 20 20 20 20 20 20 20 20 26 26 20 28 28 63 20 3d          && ((c =
3600: 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d 3d   pToken->z[0])==
3610: 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20 7c  '\'' || c=='"' |
3620: 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27  | c=='[' || c=='
3630: 60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  `') ){.         
3640: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
3650: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  pNew->u.zToken);
3660: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
3670: 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c  =='"' ) pNew->fl
3680: 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f  ags |= EP_DblQuo
3690: 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ted;.        }. 
36a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
36b0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
36c0: 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65  _DEPTH>0.    pNe
36d0: 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a  w->nHeight = 1;.
36e0: 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72  #endif  .  }.  r
36f0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
3700: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
3710: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
3720: 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d  ode from a zero-
3730: 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e  terminated token
3740: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72   that has.** alr
3750: 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74  eady been dequot
3760: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
3770: 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69  ite3Expr(.  sqli
3780: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
3790: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
37a0: 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  r sqlite3DbMallo
37b0: 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20  cZero() (may be 
37c0: 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  null) */.  int o
37d0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
37e0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
37f0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e   opcode */.  con
3800: 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20  st char *zToken 
3810: 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72       /* Token ar
3820: 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  gument.  Might b
3830: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54  e NULL */.){.  T
3840: 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20  oken x;.  x.z = 
3850: 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20  zToken;.  x.n = 
3860: 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33  zToken ? sqlite3
3870: 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29  Strlen30(zToken)
3880: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73   : 0;.  return s
3890: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
38a0: 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a  db, op, &x, 0);.
38b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20  }../*.** Attach 
38c0: 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61  subtrees pLeft a
38d0: 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65  nd pRight to the
38e0: 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74   Expr node pRoot
38f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74  ..**.** If pRoot
3900: 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
3910: 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20  s that a memory 
3920: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
3930: 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a   has occurred..*
3940: 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  * In that case, 
3950: 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72  delete the subtr
3960: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
3970: 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ight..*/.void sq
3980: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
3990: 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74  ubtrees(.  sqlit
39a0: 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a  e3 *db,.  Expr *
39b0: 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70  pRoot,.  Expr *p
39c0: 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52  Left,.  Expr *pR
39d0: 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52  ight.){.  if( pR
39e0: 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  oot==0 ){.    as
39f0: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
3a00: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
3a10: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3a20: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
3a30: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3a40: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
3a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
3a60: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
3a70: 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20  pRoot->pRight = 
3a80: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52  pRight;.      pR
3a90: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
3aa0: 5f 43 6f 6c 6c 61 74 65 20 26 20 70 52 69 67 68  _Collate & pRigh
3ab0: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
3ac0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
3ad0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
3ae0: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
3af0: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
3b00: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26 20  |= EP_Collate & 
3b10: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20  pLeft->flags;.  
3b20: 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48    }.    exprSetH
3b30: 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20  eight(pRoot);.  
3b40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
3b50: 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64 65 20  ate a Expr node 
3b60: 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d  which joins as m
3b70: 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72  any as two subtr
3b80: 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f  ees..**.** One o
3b90: 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75  r both of the su
3ba0: 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55  btrees can be NU
3bb0: 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  LL.  Return a po
3bc0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
3bd0: 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  .** Expr node.  
3be0: 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  Or, if an OOM er
3bf0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
3c00: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
3c10: 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65  ocFailed,.** fre
3c20: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61  e the subtrees a
3c30: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
3c40: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3c50: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
3c60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3c70: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
3c80: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
3cb0: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
3cc0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
3cd0: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
3ce0: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
3cf0: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
3d00: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
3d10: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65   */.  const Toke
3d20: 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a  n *pToken     /*
3d30: 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20   Argument token 
3d40: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b  */.){.  Expr *p;
3d50: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e  .  if( op==TK_AN
3d60: 44 20 26 26 20 70 4c 65 66 74 20 26 26 20 70 52  D && pLeft && pR
3d70: 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ight ){.    /* T
3d80: 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
3d90: 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66   short-circuit f
3da0: 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  alse optimizatio
3db0: 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20  n for AND */.   
3dc0: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
3dd0: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
3de0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
3df0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
3e00: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
3e10: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70  c(pParse->db, op
3e20: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
3e30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
3e40: 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72  achSubtrees(pPar
3e50: 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74  se->db, p, pLeft
3e60: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  , pRight);.  }. 
3e70: 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73   if( p ) {.    s
3e80: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
3e90: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
3ea0: 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20  >nHeight);.  }. 
3eb0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
3ec0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
3ed0: 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ssion is always 
3ee0: 65 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46  either TRUE or F
3ef0: 41 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65  ALSE (respective
3f00: 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  ly),.** then ret
3f10: 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63  urn 1.  If one c
3f20: 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
3f30: 74 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20  the truth value 
3f40: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
3f50: 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d  sion at compile-
3f60: 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  time return 0..*
3f70: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
3f80: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
3f90: 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72  f is OK to retur
3fa0: 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66  n 0 here even if
3fb0: 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
3fc0: 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77  on really is alw
3fd0: 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c  ays false or fal
3fe0: 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61  se (a false nega
3ff0: 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74  tive)..** But it
4000: 20 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74   is a bug to ret
4010: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
4020: 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61  ression might ha
4030: 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ve different.** 
4040: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69  boolean values i
4050: 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63  n different circ
4060: 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c  umstances (a fal
4070: 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a  se positive.).**
4080: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
4090: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
40a0: 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69  is part of condi
40b0: 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20  tional for a.** 
40c0: 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
40d0: 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
40e0: 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ine at compile-t
40f0: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
4100: 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65  ot.** is it true
4110: 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c   or false, so al
4120: 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ways return 0..*
4130: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
4140: 72 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72  rAlwaysTrue(Expr
4150: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20   *p){.  int v = 
4160: 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
4170: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
4180: 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
4190: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
41a0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
41b0: 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e  (p, &v) ) return
41c0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d   0;.  return v!=
41d0: 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  0;.}.static int 
41e0: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
41f0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
4200: 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70  v = 0;.  if( Exp
4210: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
4220: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72  EP_FromJoin) ) r
4230: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
4240: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
4250: 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65  eger(p, &v) ) re
4260: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
4270: 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   v==0;.}../*.** 
4280: 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73  Join two express
4290: 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e  ions using an AN
42a0: 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  D operator.  If 
42b0: 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f  either expressio
42c0: 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68  n is.** NULL, th
42d0: 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  en just return t
42e0: 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
42f0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e  ion..**.** If on
4300: 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74  e side or the ot
4310: 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69  her of the AND i
4320: 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61  s known to be fa
4330: 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  lse, then instea
4340: 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e  d.** of returnin
4350: 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73  g an AND express
4360: 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  ion, just return
4370: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
4380: 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61  ession with.** a
4390: 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e   value of false.
43a0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
43b0: 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33  3ExprAnd(sqlite3
43c0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66   *db, Expr *pLef
43d0: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
43e0: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
43f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
4400: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
4410: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
4420: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
4430: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78  ;.  }else if( ex
4440: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c  prAlwaysFalse(pL
4450: 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61  eft) || exprAlwa
4460: 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20  ysFalse(pRight) 
4470: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
4480: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
4490: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
44a0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
44b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
44c0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
44d0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
44e0: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
44f0: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20  okens[0], 0);.  
4500: 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20  }else{.    Expr 
4510: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
4520: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
4530: 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  AND, 0, 0);.    
4540: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
4550: 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e  hSubtrees(db, pN
4560: 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  ew, pLeft, pRigh
4570: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  t);.    return p
4580: 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  New;.  }.}../*.*
4590: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
45a0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
45b0: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
45c0: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
45d0: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
45e0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
45f0: 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  rFunction(Parse 
4600: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
4610: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
4620: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
4630: 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65   *pNew;.  sqlite
4640: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
4650: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  db;.  assert( pT
4660: 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d  oken );.  pNew =
4670: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4680: 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f  c(db, TK_FUNCTIO
4690: 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20  N, pToken, 1);. 
46a0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
46b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
46c0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
46d0: 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d  ist); /* Avoid m
46e0: 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20  emory leak when 
46f0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
4700: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4710: 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73  }.  pNew->x.pLis
4720: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73  t = pList;.  ass
4730: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
4740: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
4750: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73  IsSelect) );.  s
4760: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
4770: 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ght(pParse, pNew
4780: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
4790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
47a0: 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  n a variable num
47b0: 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73  ber to an expres
47c0: 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65  sion that encode
47d0: 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20  s a wildcard.** 
47e0: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
47f0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
4800: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
4810: 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
4820: 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20   single "?" are 
4830: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78  assigned the nex
4840: 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20  t sequential.** 
4850: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e  variable number.
4860: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
4870: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
4880: 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  nn" are assigned
4890: 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e   the number "nnn
48a0: 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73  ".  We make.** s
48b0: 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74  ure "nnn" is not
48c0: 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64   too be to avoid
48d0: 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72   a denial of ser
48e0: 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e  vice attack when
48f0: 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74  .** the SQL stat
4900: 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d  ement comes from
4910: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75   an external sou
4920: 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  rce..**.** Wildc
4930: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
4940: 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c   ":aaa", "@aaa",
4950: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
4960: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
4970: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
4980: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
4990: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
49a0: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
49b0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
49c0: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
49d0: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
49e0: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
49f0: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
4a00: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
4a10: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
4a20: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
4a30: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
4a40: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
4a50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
4a60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
4a70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
4a80: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
4a90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
4aa0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
4ab0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
4ac0: 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63  ntValue|EP_Reduc
4ad0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
4ae0: 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d   );.  z = pExpr-
4af0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73  >u.zToken;.  ass
4b00: 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61  ert( z!=0 );.  a
4b10: 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29  ssert( z[0]!=0 )
4b20: 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20  ;.  if( z[1]==0 
4b30: 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  ){.    /* Wildca
4b40: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
4b50: 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20  ?".  Assign the 
4b60: 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75  next variable nu
4b70: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65  mber */.    asse
4b80: 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b  rt( z[0]=='?' );
4b90: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  .    pExpr->iCol
4ba0: 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b  umn = (ynVar)(++
4bb0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
4bc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61   }else{.    ynVa
4bd0: 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75 33 32  r x = 0;.    u32
4be0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
4bf0: 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28  en30(z);.    if(
4c00: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
4c10: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
4c20: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
4c30: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
4c40: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
4c50: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
4c60: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
4c70: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
4c80: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
4c90: 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73    int bOk = 0==s
4ca0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b  qlite3Atoi64(&z[
4cb0: 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c  1], &i, n-1, SQL
4cc0: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
4cd0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
4ce0: 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a  = x = (ynVar)i;.
4cf0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4d00: 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  i==0 );.      te
4d10: 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a  stcase( i==1 );.
4d20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4d30: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
4d40: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4d50: 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b  BLE_NUMBER]-1 );
4d60: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4d70: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
4d80: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
4d90: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a  ABLE_NUMBER] );.
4da0: 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30        if( bOk==0
4db0: 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d   || i<1 || i>db-
4dc0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4dd0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4de0: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20  MBER] ){.       
4df0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4e00: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
4e10: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
4e20: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
4e30: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
4e40: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51     db->aLimit[SQ
4e50: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4e60: 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20  BLE_NUMBER]);.  
4e70: 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20        x = 0;.   
4e80: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
4e90: 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b  >pParse->nVar ){
4ea0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
4eb0: 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a  >nVar = (int)i;.
4ec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
4ed0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64  e{.      /* Wild
4ee0: 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61  cards like ":aaa
4ef0: 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61  ", "$aaa" or "@a
4f00: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
4f10: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
4f20: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73      ** number as
4f30: 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61   the prior appea
4f40: 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  rance of the sam
4f50: 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68  e name, or if th
4f60: 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e name.      ** 
4f70: 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72  has never appear
4f80: 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65  ed before, reuse
4f90: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
4fa0: 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  le number.      
4fb0: 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72 20 69  */.      ynVar i
4fc0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
4fd0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   i<pParse->nzVar
4fe0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4ff0: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  if( pParse->azVa
5000: 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 70  r[i] && strcmp(p
5010: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c  Parse->azVar[i],
5020: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
5030: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
5040: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
5050: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  +1;.          br
5060: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5080: 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70   x==0 ) x = pExp
5090: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
50a0: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
50b0: 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Var);.    }.    
50c0: 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20  if( x>0 ){.     
50d0: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
50e0: 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zVar ){.        
50f0: 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20  char **a;.      
5100: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
5110: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73  ealloc(db, pPars
5120: 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65  e->azVar, x*size
5130: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
5140: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 20 72 65     if( a==0 ) re
5150: 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f 72 20  turn;  /* Error 
5160: 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68  reported through
5170: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
5180: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 61  d */.        pPa
5190: 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a  rse->azVar = a;.
51a0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
51b0: 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d  a[pParse->nzVar]
51c0: 2c 20 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e  , 0, (x-pParse->
51d0: 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b  nzVar)*sizeof(a[
51e0: 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50  0]));.        pP
51f0: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b  arse->nzVar = x;
5200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5210: 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20  f( z[0]!='?' || 
5220: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
5230: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
5240: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5250: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
5260: 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  [x-1]);.        
5270: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
5280: 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  1] = sqlite3DbSt
5290: 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b  rNDup(db, z, n);
52a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
52b0: 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73   } .  if( !pPars
52c0: 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73  e->nErr && pPars
52d0: 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d  e->nVar>db->aLim
52e0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
52f0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
5300: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5310: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5320: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
5330: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
5340: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
5350: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
5360: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
5370: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5380: 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  prDelete(sqlite3
5390: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
53a0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
53b0: 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  urn;.  /* Sanity
53c0: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
53d0: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
53e0: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
53f0: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
5400: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
5410: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5420: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
5430: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
5440: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
5450: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
5460: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
5470: 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e  /* The Expr.x un
5480: 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65  ion is never use
5490: 64 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  d at the same ti
54a0: 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68  me as Expr.pRigh
54b0: 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
54c0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
54d0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
54e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
54f0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
5500: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
5510: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5520: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20   p->pRight);.   
5530: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
5540: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
5550: 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62  ken) ) sqlite3Db
5560: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  Free(db, p->u.zT
5570: 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 45  oken);.    if( E
5580: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5590: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
55a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
55b0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
55c0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
55d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
55e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
55f0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
5600: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
5610: 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  }.  if( !ExprHas
5620: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
5630: 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71  tatic) ){.    sq
5640: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5650: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
5660: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
5670: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
5680: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
5690: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
56a0: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
56b0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
56c0: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
56d0: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
56e0: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
56f0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
5700: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
5710: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
5720: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
5730: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
5740: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
5750: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
5760: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
5770: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
5780: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
5790: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
57a0: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
57b0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
57c0: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
57d0: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
57e0: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
57f0: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
5800: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
5810: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
5820: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
5830: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
5840: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
5850: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
5860: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
5870: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
5880: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
5890: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
58a0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
58b0: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
58c0: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
58d0: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
58e0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
58f0: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
5900: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
5910: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
5920: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
5930: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
5940: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
5950: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
5960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
59b0: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
59c0: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
59d0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
59e0: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
59f0: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
5a00: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
5a10: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
5a20: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
5a30: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
5a40: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
5a50: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
5a60: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
5a70: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
5a80: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
5a90: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
5aa0: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
5ab0: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
5ac0: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
5ad0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5ae0: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
5af0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
5b00: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
5b10: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
5b20: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
5b30: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
5b40: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
5b50: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
5b60: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
5b70: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
5b80: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
5b90: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
5ba0: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
5bb0: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
5bc0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
5bd0: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
5be0: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
5bf0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
5c00: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
5c10: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
5c20: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
5c30: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
5c40: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
5c50: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
5c60: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
5c70: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
5c80: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
5c90: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5ca0: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
5cb0: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
5cc0: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
5cd0: 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  eh Expr object a
5ce0: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
5cf0: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
5d00: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
5d10: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
5d20: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
5d30: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
5d40: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
5d50: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45  k to.** make a E
5d60: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f  XPRDUP_REDUCE co
5d70: 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20  py of a reduced 
5d80: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20  expression.  It 
5d90: 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a  is only legal.**
5da0: 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69   to reduce a pri
5db0: 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  stine expression
5dc0: 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70   tree from the p
5dd0: 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c  arser.  The impl
5de0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ementation.** of
5df0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5e00: 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d  Size() contain m
5e10: 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29  ultiple assert()
5e20: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
5e30: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
5e40: 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73  nforce this cons
5e50: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  traint..*/.stati
5e60: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
5e70: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
5e80: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5e90: 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73   int nSize;.  as
5ea0: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50  sert( flags==EXP
5eb0: 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66  RDUP_REDUCE || f
5ec0: 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e  lags==0 ); /* On
5ed0: 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75  ly one flag valu
5ee0: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61  e allowed */.  a
5ef0: 73 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c  ssert( EXPR_FULL
5f00: 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20  SIZE<=0xfff );. 
5f10: 20 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20   assert( (0xfff 
5f20: 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50  & (EP_Reduced|EP
5f30: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20  _TokenOnly))==0 
5f40: 29 3b 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c 61  );.  if( 0==(fla
5f50: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
5f60: 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  E) ){.    nSize 
5f70: 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  = EXPR_FULLSIZE;
5f80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
5f90: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5fa0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
5fb0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
5fc0: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
5fd0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5fe0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
5ff0: 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72  n) ); .    asser
6000: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
6010: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
6020: 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  en) );.    asser
6030: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
6040: 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75  rty(p, EP_NoRedu
6050: 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ce) );.    if( p
6060: 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e  ->pLeft || p->x.
6070: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
6080: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
6090: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
60a0: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
60b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
60c0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
60d0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
60e0: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20  R_TOKENONLYSIZE 
60f0: 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  | EP_TokenOnly;.
6100: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6110: 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nSize;.}../*.
6120: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6130: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61   returns the spa
6140: 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75  ce in bytes requ
6150: 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
6160: 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68  e copy .** of th
6170: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
6180: 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74   and a copy of t
6190: 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  he Expr.u.zToken
61a0: 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74   string (if that
61b0: 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65  .** string is de
61c0: 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69  fined.).*/.stati
61d0: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e  c int dupedExprN
61e0: 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  odeSize(Expr *p,
61f0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
6200: 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64  nt nByte = duped
6210: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
6220: 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66  , flags) & 0xfff
6230: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
6240: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
6250: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
6260: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e  .zToken ){.    n
6270: 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
6280: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
6290: 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65  ken)+1;.  }.  re
62a0: 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74  turn ROUND8(nByt
62b0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
62c0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
62d0: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
62e0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70   to create a dup
62f0: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a  licate of the .*
6300: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  * expression pas
6310: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
6320: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73   argument. The s
6330: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
6340: 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74  s a.** mask cont
6350: 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58  aining EXPRDUP_X
6360: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  XX flags..**.** 
6370: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
6380: 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63  ed includes spac
6390: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f  e to create a co
63a0: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
63b0: 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20  truct.** itself 
63c0: 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72  and the buffer r
63d0: 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78  eferred to by Ex
63e0: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20  pr.u.zToken, if 
63f0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  any..**.** If th
6400: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
6410: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
6420: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
6430: 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a  lue includes .**
6440: 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63   space to duplic
6450: 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64  ate all Expr nod
6460: 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66  es in the tree f
6470: 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c  ormed by Expr.pL
6480: 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72  eft .** and Expr
6490: 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65  .pRight variable
64a0: 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61  s (but not for a
64b0: 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f  ny structures po
64c0: 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20  inted to or .** 
64d0: 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74  descended from t
64e0: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
64f0: 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  or Expr.x.pSelec
6500: 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f  t variables)..*/
6510: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
6520: 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a  dExprSize(Expr *
6530: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
6540: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a   int nByte = 0;.
6550: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e    if( p ){.    n
6560: 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72  Byte = dupedExpr
6570: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67  NodeSize(p, flag
6580: 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67  s);.    if( flag
6590: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
65a0: 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20   ){.      nByte 
65b0: 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  += dupedExprSize
65c0: 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73  (p->pLeft, flags
65d0: 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a  ) + dupedExprSiz
65e0: 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61  e(p->pRight, fla
65f0: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
6600: 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d   return nByte;.}
6610: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
6620: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
6630: 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44   to sqlite3ExprD
6640: 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  up(), except tha
6650: 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a  t if pzBuffer .*
6660: 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  * is not NULL th
6670: 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  en *pzBuffer is 
6680: 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
6690: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72   to a buffer lar
66a0: 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f  ge enough .** to
66b0: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
66c0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c  of expression p,
66d0: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70   the copies of p
66e0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69  ->u.zToken.** (i
66f0: 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61  f applicable), a
6700: 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  nd the copies of
6710: 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e   the p->pLeft an
6720: 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72  d p->pRight expr
6730: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61  essions,.** if a
6740: 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  ny. Before retur
6750: 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20  ning, *pzBuffer 
6760: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69  is set to the fi
6770: 72 73 74 20 62 79 74 65 20 70 61 73 73 65 64 20  rst byte passed 
6780: 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f  the.** portion o
6790: 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70  f the buffer cop
67a0: 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73  ied into by this
67b0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
67c0: 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44  atic Expr *exprD
67d0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
67e0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
67f0: 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65  gs, u8 **pzBuffe
6800: 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  r){.  Expr *pNew
6810: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
6820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
6830: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
6840: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
6850: 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75  const int isRedu
6860: 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50  ced = (flags&EXP
6870: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
6880: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20    u8 *zAlloc;.  
6890: 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67    u32 staticFlag
68a0: 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72   = 0;..    asser
68b0: 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c  t( pzBuffer==0 |
68c0: 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a  | isReduced );..
68d0: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
68e0: 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65  t where to write
68f0: 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74   the new Expr st
6900: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20  ructure. */.    
6910: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
6920: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a        zAlloc = *
6930: 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20  pzBuffer;.      
6940: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f  staticFlag = EP_
6950: 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73  Static;.    }els
6960: 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  e{.      zAlloc 
6970: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6980: 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45 78  cRaw(db, dupedEx
6990: 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  prSize(p, flags)
69a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
69b0: 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c  w = (Expr *)zAll
69c0: 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  oc;..    if( pNe
69d0: 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65  w ){.      /* Se
69e0: 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68  t nNewSize to th
69f0: 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64  e size allocated
6a00: 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
6a10: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20  re pointed to.  
6a20: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
6a30: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
6a40: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
6a50: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
6a60: 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f  r.      ** EXPR_
6a70: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e  TOKENONLYSIZE. n
6a80: 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20  Token is set to 
6a90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
6aa0: 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20  tes consumed.   
6ab0: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70     ** by the cop
6ac0: 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54  y of the p->u.zT
6ad0: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
6ae0: 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  any)..      */. 
6af0: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
6b00: 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20  ned nStructSize 
6b10: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
6b20: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  tSize(p, flags);
6b30: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
6b40: 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72   nNewSize = nStr
6b50: 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b  uctSize & 0xfff;
6b60: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  .      int nToke
6b70: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  n;.      if( !Ex
6b80: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
6b90: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
6ba0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
6bb0: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d          nToken =
6bc0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6bd0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20  (p->u.zToken) + 
6be0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
6bf0: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d          nToken =
6c00: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6c10: 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64 20    if( isReduced 
6c20: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
6c30: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
6c40: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
6c50: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
6c60: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
6c70: 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20  , nNewSize);.   
6c80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6c90: 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78    int nSize = ex
6ca0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b  prStructSize(p);
6cb0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
6cc0: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65  zAlloc, p, nSize
6cd0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
6ce0: 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d  t(&zAlloc[nSize]
6cf0: 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49  , 0, EXPR_FULLSI
6d00: 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  ZE-nSize);.     
6d10: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
6d20: 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c   the EP_Reduced,
6d30: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61   EP_TokenOnly, a
6d40: 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61  nd EP_Static fla
6d50: 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  gs appropriately
6d60: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  . */.      pNew-
6d70: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52  >flags &= ~(EP_R
6d80: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
6d90: 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50  nly|EP_Static|EP
6da0: 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  _MemToken);.    
6db0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6dc0: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28   nStructSize & (
6dd0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
6de0: 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20  kenOnly);.      
6df0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73  pNew->flags |= s
6e00: 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20  taticFlag;..    
6e10: 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d    /* Copy the p-
6e20: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
6e30: 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
6e40: 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b     if( nToken ){
6e50: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
6e60: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
6e70: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
6e80: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
6e90: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ];.        memcp
6ea0: 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a  y(zToken, p->u.z
6eb0: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
6ec0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
6ed0: 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73  f( 0==((p->flags
6ee0: 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20  |pNew->flags) & 
6ef0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
6f00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  .        /* Fill
6f10: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
6f20: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
6f30: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
6f40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
6f50: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6f60: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
6f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
6f80: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  ew->x.pSelect = 
6f90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
6fa0: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
6fb0: 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20  t, isReduced);. 
6fc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6fd0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
6fe0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
6ff0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
7000: 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64  ->x.pList, isRed
7010: 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  uced);.        }
7020: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7030: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
7040: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
7050: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
7060: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
7070: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
7080: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
7090: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
70a0: 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45  zAlloc += dupedE
70b0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
70c0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69  lags);.        i
70d0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
70e0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
70f0: 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ced) ){.        
7100: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
7110: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
7120: 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45  Left, EXPRDUP_RE
7130: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
7140: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
7150: 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70  pRight = exprDup
7160: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
7170: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
7180: 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  &zAlloc);.      
7190: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
71a0: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
71b0: 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20        *pzBuffer 
71c0: 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  = zAlloc;.      
71d0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
71e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78  .        if( !Ex
71f0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7200: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
7210: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
7220: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
7230: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
7240: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
7250: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
7260: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
7270: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
7280: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
7290: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20        }..    }. 
72a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
72b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
72c0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  e and return a d
72d0: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
72e0: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
72f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
7300: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20  argument. If an 
7310: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
7320: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55   encountered, NU
7330: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  LL is returned.*
7340: 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61  * and the db->ma
7350: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
7360: 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  set..*/.#ifndef 
7370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
7380: 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74  static With *wit
7390: 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  hDup(sqlite3 *db
73a0: 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69  , With *p){.  Wi
73b0: 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  th *pRet = 0;.  
73c0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
73d0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
73e0: 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e  *p) + sizeof(p->
73f0: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65  a[0]) * (p->nCte
7400: 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  -1);.    pRet = 
7410: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
7420: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
7430: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
7440: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
7450: 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20     pRet->nCte = 
7460: 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66  p->nCte;.      f
7470: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
7480: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
7490: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pRet->a[i].pSel
74a0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
74b0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  ectDup(db, p->a[
74c0: 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  i].pSelect, 0);.
74d0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
74e0: 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74  i].pCols = sqlit
74f0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
7500: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c  , p->a[i].pCols,
7510: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
7520: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
7530: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
7540: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  db, p->a[i].zNam
7550: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
7560: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
7570: 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Ret;.}.#else.# d
7580: 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c  efine withDup(x,
7590: 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y) 0.#endif../*.
75a0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
75b0: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
75c0: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
75d0: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
75e0: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
75f0: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
7600: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
7610: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
7620: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
7630: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
7640: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
7650: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
7660: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
7670: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
7680: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
7690: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
76a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
76b0: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
76c0: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
76d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
76e0: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
76f0: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
7700: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
7710: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
7720: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
7730: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
7740: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
7750: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
7760: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
7770: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
7780: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
7790: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
77a0: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
77b0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
77c0: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
77d0: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
77e0: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
77f0: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
7800: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
7810: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
7820: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
7830: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
7840: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
7850: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
7860: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
7870: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
7880: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
7890: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
78a0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
78b0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
78c0: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
78d0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
78e0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
78f0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
7900: 73 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  s){.  return exp
7910: 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67  rDup(db, p, flag
7920: 73 2c 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73  s, 0);.}.ExprLis
7930: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
7940: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
7950: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  b, ExprList *p, 
7960: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78  int flags){.  Ex
7970: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
7980: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
7990: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
79a0: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
79b0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
79c0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
79d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
79e0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
79f0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
7a00: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
7a10: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72  0;.  pNew->iECur
7a20: 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  sor = 0;.  pNew-
7a30: 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e  >nExpr = i = p->
7a40: 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c  nExpr;.  if( (fl
7a50: 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52 45  ags & EXPRDUP_RE
7a60: 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69  DUCE)==0 ) for(i
7a70: 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =1; i<p->nExpr; 
7a80: 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e  i+=i){}.  pNew->
7a90: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
7aa0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7ab0: 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e  b,  i*sizeof(p->
7ac0: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
7ad0: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
7ae0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7af0: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
7b00: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
7b10: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
7b20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
7b30: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
7b40: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
7b50: 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78      Expr *pOldEx
7b60: 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  pr = pOldItem->p
7b70: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
7b80: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
7b90: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
7ba0: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
7bb0: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
7bc0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7bd0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7be0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
7bf0: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
7c00: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
7c10: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
7c20: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
7c30: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
7c40: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
7c50: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
7c60: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
7c70: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
7c80: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
7c90: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
7ca0: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
7cb0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
7cc0: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
7cd0: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
7ce0: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
7cf0: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
7d00: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
7d10: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
7d20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
7d30: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
7d40: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
7d50: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
7d60: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
7d70: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
7d80: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
7d90: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
7da0: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
7db0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
7dc0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
7dd0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7de0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
7df0: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
7e00: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
7e10: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
7e20: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
7e30: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
7e40: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
7e50: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
7e60: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
7e70: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
7e80: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
7e90: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
7ea0: 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72  of(*p) + (p->nSr
7eb0: 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e  c>0 ? sizeof(p->
7ec0: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63  a[0]) * (p->nSrc
7ed0: 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  -1) : 0);.  pNew
7ee0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7ef0: 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20  ocRaw(db, nByte 
7f00: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
7f10: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
7f20: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
7f30: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
7f40: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
7f50: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
7f60: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
7f70: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
7f80: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
7f90: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
7fa0: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
7fb0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
7fc0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
7fd0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
7fe0: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
7ff0: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
8000: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
8010: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
8020: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8030: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
8040: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
8050: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
8060: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8070: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
8080: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
8090: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
80a0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
80b0: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
80c0: 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  wItem->jointype 
80d0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e  = pOldItem->join
80e0: 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74  type;.    pNewIt
80f0: 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f  em->iCursor = pO
8100: 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ldItem->iCursor;
8110: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61  .    pNewItem->a
8120: 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c  ddrFillSub = pOl
8130: 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  dItem->addrFillS
8140: 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ub;.    pNewItem
8150: 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f  ->regReturn = pO
8160: 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  ldItem->regRetur
8170: 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  n;.    pNewItem-
8180: 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20  >isCorrelated = 
8190: 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72 72  pOldItem->isCorr
81a0: 65 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77  elated;.    pNew
81b0: 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
81c0: 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 76  ne = pOldItem->v
81d0: 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a 20 20 20  iaCoroutine;.   
81e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 52 65 63   pNewItem->isRec
81f0: 75 72 73 69 76 65 20 3d 20 70 4f 6c 64 49 74 65  ursive = pOldIte
8200: 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3b 0a  m->isRecursive;.
8210: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49      pNewItem->zI
8220: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62  ndex = sqlite3Db
8230: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
8240: 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20  tem->zIndex);.  
8250: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49    pNewItem->notI
8260: 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65  ndexed = pOldIte
8270: 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20  m->notIndexed;. 
8280: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e     pNewItem->pIn
8290: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
82a0: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62  pIndex;.    pTab
82b0: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
82c0: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
82d0: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
82e0: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
82f0: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
8300: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
8310: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
8320: 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  ectDup(db, pOldI
8330: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c  tem->pSelect, fl
8340: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
8350: 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65  em->pOn = sqlite
8360: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
8370: 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67  dItem->pOn, flag
8380: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
8390: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
83a0: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
83b0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pOldItem->pUsing
83c0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
83d0: 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49  >colUsed = pOldI
83e0: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
83f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
8400: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
8410: 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69  e3IdListDup(sqli
8420: 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
8430: 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70  *p){.  IdList *p
8440: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
8450: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
8460: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
8470: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8480: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
8490: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
84a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
84b0: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
84c0: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
84d0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
84e0: 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  cRaw(db, p->nId*
84f0: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
8500: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
8510: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8520: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
8530: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
8540: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
8550: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
8560: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
8570: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
8580: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
8590: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
85a0: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
85b0: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
85c0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
85d0: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
85e0: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
85f0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8600: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
8610: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
8620: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
8630: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
8640: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
8650: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
8660: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
8670: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
8680: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
8690: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
86a0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
86b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
86c0: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
86d0: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
86e0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
86f0: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
8700: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
8710: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
8720: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
8730: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a   Select *pNew, *
8740: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d  pPrior;.  if( p=
8750: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8760: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
8770: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
8780: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
8790: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
87a0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  urn 0;.  pNew->p
87b0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
87c0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
87d0: 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29  ->pEList, flags)
87e0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
87f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
8800: 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20  up(db, p->pSrc, 
8810: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
8820: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
8830: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8840: 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Where, flags);. 
8850: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
8860: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8870: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
8880: 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  upBy, flags);.  
8890: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
88a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
88b0: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66  b, p->pHaving, f
88c0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
88d0: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
88e0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
88f0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
8900: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  ags);.  pNew->op
8910: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
8920: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
8930: 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  r = sqlite3Selec
8940: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69  tDup(db, p->pPri
8950: 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  or, flags);.  if
8960: 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f  ( pPrior ) pPrio
8970: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
8980: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
8990: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d   0;.  pNew->pLim
89a0: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
89b0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  Dup(db, p->pLimi
89c0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
89d0: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c  w->pOffset = sql
89e0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
89f0: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67  p->pOffset, flag
8a00: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  s);.  pNew->iLim
8a10: 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  it = 0;.  pNew->
8a20: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
8a30: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
8a40: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53  p->selFlags & ~S
8a50: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
8a60: 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d  .  pNew->pRightm
8a70: 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ost = 0;.  pNew-
8a80: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
8a90: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
8aa0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
8ab0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
8ac0: 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d  rOpenEphm[2] = -
8ad0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  1;.  pNew->pWith
8ae0: 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20 70   = withDup(db, p
8af0: 2d 3e 70 57 69 74 68 29 3b 0a 20 20 61 73 73 65  ->pWith);.  asse
8b00: 72 74 28 20 70 2d 3e 70 52 65 63 75 72 73 65 3d  rt( p->pRecurse=
8b10: 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  =0 );.  pNew->pR
8b20: 65 63 75 72 73 65 20 3d 20 30 3b 0a 20 20 72 65  ecurse = 0;.  re
8b30: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c  turn pNew;.}.#el
8b40: 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  se.Select *sqlit
8b50: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
8b60: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
8b70: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
8b80: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
8b90: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
8ba0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
8bb0: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
8bc0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
8bd0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
8be0: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
8bf0: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
8c00: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
8c10: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
8c20: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  list..**.** If a
8c30: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
8c40: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
8c50: 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74   the entire list
8c60: 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a   is freed and.**
8c70: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
8c80: 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20  d.  If non-NULL 
8c90: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
8ca0: 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
8cb0: 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e  ed.** that the n
8cc0: 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63  ew entry was suc
8cd0: 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64  cessfully append
8ce0: 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  ed..*/.ExprList 
8cf0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
8d00: 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20  Append(.  Parse 
8d10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8d20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8d30: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
8d40: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
8d50: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
8d60: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
8d70: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
8d80: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
8d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
8da0: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70  ession to be app
8db0: 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20  ended. Might be 
8dc0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  NULL */.){.  sql
8dd0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
8de0: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69  e->db;.  if( pLi
8df0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
8e00: 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
8e10: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
8e20: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
8e30: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
8e40: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
8e50: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
8e60: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c    pList->a = sql
8e70: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
8e80: 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74  db, sizeof(pList
8e90: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
8ea0: 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 20  ( pList->a==0 ) 
8eb0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
8ec0: 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d  else if( (pList-
8ed0: 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d  >nExpr & (pList-
8ee0: 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b  >nExpr-1))==0 ){
8ef0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
8f00: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
8f10: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
8f20: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
8f30: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  a = sqlite3DbRea
8f40: 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e  lloc(db, pList->
8f50: 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2a  a, pList->nExpr*
8f60: 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  2*sizeof(pList->
8f70: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
8f80: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  a==0 ){.      go
8f90: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
8fa0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
8fb0: 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  a;.  }.  assert(
8fc0: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a   pList->a!=0 );.
8fd0: 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20 20 73    if( 1 ){.    s
8fe0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
8ff0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
9000: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
9010: 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73  xpr++];.    mems
9020: 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a  et(pItem, 0, siz
9030: 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20  eof(*pItem));.  
9040: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
9050: 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65   pExpr;.  }.  re
9060: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f  turn pList;..no_
9070: 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41  mem:     .  /* A
9080: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
9090: 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61  ory if malloc ha
90a0: 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73  s failed. */.  s
90b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
90c0: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73  (db, pExpr);.  s
90d0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
90e0: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
90f0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
9100: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
9110: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  prList.a[].zName
9120: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
9130: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
9140: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
9150: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
9160: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
9170: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
9180: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
9190: 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65  rror.  But pName
91a0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
91b0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
91c0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
91d0: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
91e0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
91f0: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
9200: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
9210: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
9220: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
9230: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
9240: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
9250: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
9260: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
9270: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
9280: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
9290: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  . */.  Token *pN
92a0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ame,           /
92b0: 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64  * Name to be add
92c0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ed */.  int dequ
92d0: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
92e0: 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65  /* True to cause
92f0: 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20   the name to be 
9300: 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20  dequoted */.){. 
9310: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
9320: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
9330: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
9340: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
9350: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
9360: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
9370: 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  em;.    assert( 
9380: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
9390: 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70  ;.    pItem = &p
93a0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
93b0: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
93c0: 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ert( pItem->zNam
93d0: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65  e==0 );.    pIte
93e0: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
93f0: 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72  e3DbStrNDup(pPar
9400: 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a  se->db, pName->z
9410: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
9420: 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20   if( dequote && 
9430: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 73  pItem->zName ) s
9440: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49  qlite3Dequote(pI
9450: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  tem->zName);.  }
9460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
9470: 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  e ExprList.a[].z
9480: 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Span element of 
9490: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
94a0: 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20  y added item.** 
94b0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
94c0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  n list..**.** pL
94d0: 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ist might be NUL
94e0: 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f  L following an O
94f0: 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70  OM error.  But p
9500: 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65  Span should neve
9510: 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49  r be.** NULL.  I
9520: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
9530: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
9540: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
9550: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a  locFailed flag.*
9560: 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  * is set..*/.voi
9570: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
9580: 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73  tSetSpan(.  Pars
9590: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
95a0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
95b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
95c0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
95d0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
95e0: 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20  hich to add the 
95f0: 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53  span. */.  ExprS
9600: 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20  pan *pSpan      
9610: 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74     /* The span t
9620: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b  o be added */.){
9630: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9640: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
9650: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
9660: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
9670: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
9680: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
9690: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
96a0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
96b0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
96c0: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
96d0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
96e0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
96f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9700: 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72   || pItem->pExpr
9710: 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29  ==pSpan->pExpr )
9720: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
9730: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
9740: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
9750: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
9760: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
9770: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
9780: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97a0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
97b0: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
97c0: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
97d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
97e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
97f0: 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e  t pEList contain
9800: 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d  s more than iLim
9810: 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20  it elements,.** 
9820: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
9830: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
9840: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9850: 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
9860: 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70  ngth(.  Parse *p
9870: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
9880: 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e  t *pEList,.  con
9890: 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74  st char *zObject
98a0: 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70  .){.  int mx = p
98b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
98c0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
98d0: 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61  OLUMN];.  testca
98e0: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
98f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20  List->nExpr==mx 
9900: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
9910: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
9920: 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a  >nExpr==mx+1 );.
9930: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
9940: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78  pEList->nExpr>mx
9950: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
9960: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9970: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
9980: 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63  s in %s", zObjec
9990: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
99a0: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
99b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
99c0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
99d0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
99e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
99f0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
9a00: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
9a10: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
9a20: 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
9a30: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
9a40: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
9a50: 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d  ->a!=0 || pList-
9a60: 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66  >nExpr==0 );.  f
9a70: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
9a80: 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
9a90: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
9aa0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
9ab0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
9ac0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
9ad0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9ae0: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
9af0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
9b00: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
9b10: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20  ->zSpan);.  }.  
9b20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9b30: 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
9b40: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9b50: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
9b60: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
9b70: 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c   are Walker call
9b80: 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75  backs.  Walker.u
9b90: 2e 70 69 20 69 73 20 61 20 70 6f 69 6e 74 65 72  .pi is a pointer
9ba0: 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  .** to an intege
9bb0: 72 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  r.  These routin
9bc0: 65 73 20 61 72 65 20 63 68 65 63 6b 69 6e 67 20  es are checking 
9bd0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
9be0: 20 73 65 65 0a 2a 2a 20 69 66 20 69 74 20 69 73   see.** if it is
9bf0: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65   a constant.  Se
9c00: 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74  t *Walker.u.pi t
9c10: 6f 20 30 20 69 66 20 74 68 65 20 65 78 70 72 65  o 0 if the expre
9c20: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20  ssion is.** not 
9c30: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  constant..**.** 
9c40: 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72  These callback r
9c50: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
9c60: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
9c70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
9c80: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
9c90: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a  prIsConstant().*
9ca0: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
9cb0: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
9cc0: 69 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  in().**     sqli
9cd0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9ce0: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a  tOrFunction().**
9cf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
9d00: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
9d10: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
9d20: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
9d30: 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65  ..  /* If pWalke
9d40: 72 2d 3e 75 2e 69 20 69 73 20 33 20 74 68 65 6e  r->u.i is 3 then
9d50: 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65   any term of the
9d60: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
9d70: 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a   comes from.  **
9d80: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
9d90: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
9da0: 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20  in disqualifies 
9db0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
9dc0: 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63   ** from being c
9dd0: 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61  onsidered consta
9de0: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61  nt. */.  if( pWa
9df0: 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20  lker->u.i==3 && 
9e00: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9e10: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
9e20: 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  in) ){.    pWalk
9e30: 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20  er->u.i = 0;.   
9e40: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
9e50: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
9e60: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
9e70: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
9e80: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
9e90: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
9ea0: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
9eb0: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
9ec0: 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57  ** and either pW
9ed0: 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 6f 72  alker->u.i==2 or
9ee0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 73   the function as
9ef0: 20 74 68 65 20 53 51 4c 49 54 45 5f 46 55 4e 43   the SQLITE_FUNC
9f00: 5f 43 4f 4e 53 54 0a 20 20 20 20 2a 2a 20 66 6c  _CONST.    ** fl
9f10: 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ag. */.    case 
9f20: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
9f30: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
9f40: 75 2e 69 3d 3d 32 20 7c 7c 20 45 78 70 72 48 61  u.i==2 || ExprHa
9f50: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
9f60: 45 50 5f 43 6f 6e 73 74 61 6e 74 29 20 29 7b 0a  EP_Constant) ){.
9f70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
9f80: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
9f90: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
9fa0: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
9fb0: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
9fc0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
9fd0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
9fe0: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
9ff0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
a000: 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  MN:.      testca
a010: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
a020: 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65  K_ID );.      te
a030: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
a040: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
a050: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a060: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
a070: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
a080: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
a090: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
a0a0: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
a0b0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
a0c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
a0d0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 64 65  RC_Abort;.    de
a0e0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73  fault:.      tes
a0f0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
a100: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f  ==TK_SELECT ); /
a110: 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  * selectNodeIsCo
a120: 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61  nstant will disa
a130: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74 65  llow */.      te
a140: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
a150: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20  p==TK_EXISTS ); 
a160: 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43  /* selectNodeIsC
a170: 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73  onstant will dis
a180: 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72  allow */.      r
a190: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
a1a0: 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ue;.  }.}.static
a1b0: 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65 49   int selectNodeI
a1c0: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
a1d0: 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
a1e0: 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  t *NotUsed){.  U
a1f0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
a200: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c  NotUsed);.  pWal
a210: 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20  ker->u.i = 0;.  
a220: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
a230: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  ;.}.static int e
a240: 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20  xprIsConst(Expr 
a250: 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67  *p, int initFlag
a260: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
a270: 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
a280: 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 75  izeof(w));.  w.u
a290: 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20  .i = initFlag;. 
a2a0: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
a2b0: 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e   = exprNodeIsCon
a2c0: 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65  stant;.  w.xSele
a2d0: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
a2e0: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
a2f0: 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  t;.  sqlite3Walk
a300: 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
a310: 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a  eturn w.u.i;.}..
a320: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
a330: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
a340: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
a350: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
a360: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
a370: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
a380: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
a390: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
a3a0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
a3b0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
a3c0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
a3d0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
a3e0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
a3f0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
a400: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
a410: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
a420: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
a430: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
a440: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
a450: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
a460: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
a470: 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a  rIsConst(p, 1);.
a480: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
a490: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
a4a0: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
a4b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a4c0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
a4d0: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
a4e0: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
a4f0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
a500: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
a510: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
a520: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
a530: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
a540: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
a550: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
a560: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
a570: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
a580: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
a590: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
a5a0: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
a5b0: 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   3);.}../*.** Wa
a5c0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
a5d0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
a5e0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
a5f0: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
a600: 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20  * or a function 
a610: 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61  call with consta
a620: 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
a630: 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74  eturn and 0 if t
a640: 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20  here.** are any 
a650: 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
a660: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
a670: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
a680: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
a690: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
a6a0: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
a6b0: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
a6c0: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
a6d0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
a6e0: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
a6f0: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
a700: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
a710: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
a720: 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  on(Expr *p){.  r
a730: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
a740: 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t(p, 2);.}../*.*
a750: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
a760: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
a770: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
a780: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
a790: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
a7a0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
a7b0: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
a7c0: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
a7d0: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
a7e0: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
a7f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a800: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
a810: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
a820: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
a830: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
a840: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
a850: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
a860: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
a870: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
a880: 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
a890: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
a8a0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  e){.  int rc = 0
a8b0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78  ;..  /* If an ex
a8c0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
a8d0: 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74  nteger literal t
a8e0: 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69  hat fits in a si
a8f0: 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a  gned 32-bit.  **
a900: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
a910: 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
a920: 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  lag will have al
a930: 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a  ready been set *
a940: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
a950: 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
a960: 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   (p->flags & EP_
a970: 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20  IntValue)!=0.   
a980: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
a990: 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e  e3GetInt32(p->u.
a9a0: 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20  zToken, &rc)==0 
a9b0: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  );..  if( p->fla
a9c0: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
a9d0: 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
a9e0: 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  = p->u.iValue;. 
a9f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
aa00: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
aa10: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
aa20: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
aa30: 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  c = sqlite3ExprI
aa40: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
aa50: 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
aa60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
aa70: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
aa80: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
aa90: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
aaa0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
aab0: 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
aac0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
aad0: 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34  ( v!=(-214748364
aae0: 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  7-1) );.        
aaf0: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
ab00: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
ab10: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ab20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
ab30: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
ab40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ab50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
ab60: 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
ab70: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
ab80: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
ab90: 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
aba0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
abb0: 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
abc0: 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
abd0: 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
abe0: 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
abf0: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
ac00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ac10: 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
ac20: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
ac30: 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
ac40: 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
ac50: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
ac60: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
ac70: 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
ac80: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
ac90: 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
aca0: 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
acb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
acc0: 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
acd0: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
ace0: 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
acf0: 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
ad00: 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
ad10: 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
ad20: 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
ad30: 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
ad40: 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
ad50: 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
ad60: 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
ad70: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
ad80: 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
ad90: 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
ada0: 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
adb0: 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
adc0: 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
add0: 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
ade0: 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
adf0: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
ae00: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
ae10: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
ae20: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
ae30: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
ae40: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
ae50: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
ae60: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
ae70: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
ae80: 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
ae90: 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
aea0: 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
aeb0: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
aec0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
aed0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
aee0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
aef0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
af00: 20 61 6e 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 6e   an OP_IsNull in
af10: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 74  struction that t
af20: 65 73 74 73 20 72 65 67 69 73 74 65 72 20 69 52  ests register iR
af30: 65 67 20 61 6e 64 20 6a 75 6d 70 73 0a 2a 2a 20  eg and jumps.** 
af40: 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 44 65 73  to location iDes
af50: 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  t if the value i
af60: 6e 20 69 52 65 67 20 69 73 20 4e 55 4c 4c 2e 20  n iReg is NULL. 
af70: 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 69 52   The value in iR
af80: 65 67 20 0a 2a 2a 20 77 61 73 20 63 6f 6d 70 75  eg .** was compu
af90: 74 65 64 20 62 79 20 70 45 78 70 72 2e 20 20 49  ted by pExpr.  I
afa0: 66 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 61 74  f we can look at
afb0: 20 70 45 78 70 72 20 61 74 20 63 6f 6d 70 69 6c   pExpr at compil
afc0: 65 2d 74 69 6d 65 20 61 6e 64 0a 2a 2a 20 64 65  e-time and.** de
afd0: 74 65 72 6d 69 6e 65 20 74 68 61 74 20 69 74 20  termine that it 
afe0: 63 61 6e 20 6e 65 76 65 72 20 67 65 6e 65 72 61  can never genera
aff0: 74 65 20 61 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  te a NULL, then 
b000: 74 68 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70  the OP_IsNull op
b010: 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  eration.** can b
b020: 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f  e omitted..*/.vo
b030: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
b040: 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 0a 20 20  deIsNullJump(.  
b050: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
b060: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
b070: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
b080: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 78  on */.  const Ex
b090: 70 72 20 2a 70 45 78 70 72 2c 20 20 2f 2a 20 4f  pr *pExpr,  /* O
b0a0: 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 4f 50 5f  nly generate OP_
b0b0: 49 73 4e 75 6c 6c 20 69 66 20 74 68 69 73 20 65  IsNull if this e
b0c0: 78 70 72 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20  xpr can be NULL 
b0d0: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
b0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 73 74           /* Test
b0f0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
b100: 69 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  is register for 
b110: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 44  NULL */.  int iD
b120: 65 73 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  est           /*
b130: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
b140: 65 20 76 61 6c 75 65 20 69 73 20 6e 75 6c 6c 20  e value is null 
b150: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  */.){.  if( sqli
b160: 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
b170: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
b180: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b190: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69  (v, OP_IsNull, i
b1a0: 52 65 67 2c 20 69 44 65 73 74 29 3b 0a 20 20 7d  Reg, iDest);.  }
b1b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b1c0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
b1d0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
b1e0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63   a constant whic
b1f0: 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e  h would be.** un
b200: 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66  changed by OP_Af
b210: 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20  finity with the 
b220: 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69  affinity given i
b230: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  n the second.** 
b240: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
b250: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
b260: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
b270: 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69  e if the OP_Affi
b280: 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  nity operation.*
b290: 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  * can be omitted
b2a0: 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  .  When in doubt
b2b0: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20   return FALSE.  
b2c0: 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
b2d0: 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  .** is harmless.
b2e0: 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
b2f0: 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e  ve, however, can
b300: 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77   result in the w
b310: 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a  rong.** answer..
b320: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
b330: 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
b340: 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78  yChange(const Ex
b350: 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29  pr *p, char aff)
b360: 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28  {.  u8 op;.  if(
b370: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
b380: 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 31  _NONE ) return 1
b390: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
b3a0: 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
b3b0: 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
b3c0: 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
b3d0: 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
b3e0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
b3f0: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
b400: 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
b410: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
b420: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
b430: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
b440: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
b450: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
b460: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
b470: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
b480: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  LOAT: {.      re
b490: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
b4a0: 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66  _AFF_REAL || aff
b4b0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
b4c0: 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
b4d0: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
b4e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
b4f0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
b500: 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  EXT;.    }.    c
b510: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
b520: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
b530: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b540: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
b550: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62   assert( p->iTab
b560: 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63  le>=0 );  /* p c
b570: 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66  annot be part of
b580: 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61   a CHECK constra
b590: 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  int */.      ret
b5a0: 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  urn p->iColumn<0
b5b0: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61  .          && (a
b5c0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
b5d0: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
b5e0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
b5f0: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  C);.    }.    de
b600: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
b610: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
b620: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
b630: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
b640: 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
b650: 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
b660: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
b670: 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
b680: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
b690: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
b6a0: 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
b6b0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
b6c0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
b6d0: 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
b6e0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
b6f0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
b700: 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
b710: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
b720: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
b730: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77  Return true if w
b740: 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 74 68  e are able to th
b750: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70  e IN operator op
b760: 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 61 0a  timization on a.
b770: 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65 20  ** query of the 
b780: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
b790: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e   x IN (SELECT ..
b7a0: 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 74  .).**.** Where t
b7b0: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 63 6c 61  he SELECT... cla
b7c0: 75 73 65 20 69 73 20 61 73 20 73 70 65 63 69 66  use is as specif
b7d0: 69 65 64 20 62 79 20 74 68 65 20 70 61 72 61 6d  ied by the param
b7e0: 65 74 65 72 20 74 6f 20 74 68 69 73 0a 2a 2a 20  eter to this.** 
b7f0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
b800: 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
b810: 20 70 61 73 73 65 64 20 69 6e 20 68 61 73 20 61   passed in has a
b820: 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
b830: 72 6f 63 65 73 73 65 64 20 61 6e 64 20 6e 6f 0a  rocessed and no.
b840: 2a 2a 20 65 72 72 6f 72 73 20 68 61 76 65 20 62  ** errors have b
b850: 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23 69  een found..*/.#i
b860: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b870: 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69  T_SUBQUERY.stati
b880: 63 20 69 6e 74 20 69 73 43 61 6e 64 69 64 61 74  c int isCandidat
b890: 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65 63 74  eForInOpt(Select
b8a0: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
b8b0: 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
b8c0: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
b8d0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20  le *pTab;.  if( 
b8e0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b900: 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64     /* right-hand
b910: 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73 20 53   side of IN is S
b920: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
b930: 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72  ->pPrior ) retur
b940: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
b950: 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f    /* Not a compo
b960: 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  und SELECT */.  
b970: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
b980: 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
b990: 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a  F_Aggregate) ){.
b9a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
b9b0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
b9c0: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
b9d0: 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
b9e0: 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73  tinct );.    tes
b9f0: 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
ba00: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
ba10: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
ba20: 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20  )==SF_Aggregate 
ba30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
ba40: 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20   /* No DISTINCT 
ba50: 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61  keyword and no a
ba60: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
ba70: 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65  ns */.  }.  asse
ba80: 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
ba90: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
baa0: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f     /* Has no GRO
bab0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
bac0: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
bad0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
bae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
baf0: 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  no LIMIT clause 
bb00: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
bb10: 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  pOffset==0 );   
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bb30: 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f  o LIMIT means no
bb40: 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 66 28   OFFSET */.  if(
bb50: 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
bb60: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
bb70: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48      /* Has no WH
bb80: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
bb90: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
bba0: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
bbb0: 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  0 );.  if( pSrc-
bbc0: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
bbd0: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
bbe0: 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   Single term in 
bbf0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
bc00: 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
bc10: 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
bc20: 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20   0;     /* FROM 
bc30: 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  is not a subquer
bc40: 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70  y or view */.  p
bc50: 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
bc60: 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 4e 45 56  .pTab;.  if( NEV
bc70: 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20 72 65  ER(pTab==0) ) re
bc80: 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
bc90: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
bca0: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
bcb0: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
bcc0: 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f  is not a view */
bcd0: 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
bce0: 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
bcf0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f  0;        /* FRO
bd00: 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76  M clause not a v
bd10: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
bd20: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
bd30: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
bd40: 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
bd50: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f  eturn 0;       /
bd60: 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  * One column in 
bd70: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
bd80: 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  /.  if( pEList->
bd90: 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d  a[0].pExpr->op!=
bda0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
bdb0: 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20  rn 0; /* Result 
bdc0: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  is a column */. 
bdd0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
bde0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
bdf0: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
be00: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
be10: 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f  _Once instructio
be20: 6e 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73  n and allocate s
be30: 70 61 63 65 20 66 6f 72 20 69 74 73 20 66 6c 61  pace for its fla
be40: 67 2e 20 52 65 74 75 72 6e 20 74 68 65 20 0a 2a  g. Return the .*
be50: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
be60: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
be70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
be80: 43 6f 64 65 4f 6e 63 65 28 50 61 72 73 65 20 2a  CodeOnce(Parse *
be90: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
bea0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
beb0: 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
bec0: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
bed0: 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
bee0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   */.  return sql
bef0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
bf00: 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72 73  , OP_Once, pPars
bf10: 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a  e->nOnce++);.}..
bf20: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
bf30: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
bf40: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
bf50: 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e  n of the IN (...
bf60: 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54  ) operator..** T
bf70: 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72 20  he pX parameter 
bf80: 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  is the expressio
bf90: 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  n on the RHS of 
bfa0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
bfb0: 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
bfc0: 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73 74  be either a list
bfd0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
bfe0: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a  or a subquery..*
bff0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
c000: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c010: 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  to find or creat
c020: 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  e a b-tree objec
c030: 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65  t that can.** be
c040: 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f 20   used either to 
c050: 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73  test for members
c060: 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20 73  hip in the RHS s
c070: 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65  et or to iterate
c080: 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20   through.** all 
c090: 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52  members of the R
c0a0: 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67  HS set, skipping
c0b0: 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a   duplicates..**.
c0c0: 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f  ** A cursor is o
c0d0: 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74  pened on the b-t
c0e0: 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ree object that 
c0f0: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
c100: 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e  N operator.** an
c110: 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20  d pX->iTable is 
c120: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
c130: 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e   of that cursor.
c140: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
c150: 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ned value of thi
c160: 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63  s function indic
c170: 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 20  ates the b-tree 
c180: 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  type, as follows
c190: 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  :.**.**   IN_IND
c1a0: 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20  EX_ROWID      - 
c1b0: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
c1c0: 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
c1d0: 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ase table..**   
c1e0: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
c1f0: 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72  SC  - The cursor
c200: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
c210: 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
c220: 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
c230: 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68  _INDEX_DESC - Th
c240: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
c250: 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  ned on a descend
c260: 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
c270: 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20  IN_INDEX_EPH    
c280: 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
c290: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
c2a0: 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74   specially creat
c2b0: 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ed and.**       
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
c2e0: 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  remal table..**.
c2f0: 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62  ** An existing b
c300: 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75  -tree might be u
c310: 73 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65  sed if the RHS e
c320: 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20  xpression pX is 
c330: 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71  a simple.** subq
c340: 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a  uery such as:.**
c350: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
c360: 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61  column> FROM <ta
c370: 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble>.**.** If th
c380: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
c390: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69  operator is a li
c3a0: 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d  st or a more com
c3b0: 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20 74  plex subquery, t
c3c0: 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65  hen.** an epheme
c3d0: 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  ral table might 
c3e0: 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72  need to be gener
c3f0: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48  ated from the RH
c400: 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58  S and then.** pX
c410: 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f  ->iTable made to
c420: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70   point to the ep
c430: 68 65 72 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  hermeral table i
c440: 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20  nstead of an.** 
c450: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 20  existing table. 
c460: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
c470: 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65  rNotFound parame
c480: 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 74  ter is 0, then t
c490: 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
c4a0: 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
c4b0: 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
c4c0: 20 73 65 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b   set members, sk
c4d0: 69 70 70 69 6e 67 20 61 6e 79 20 64 75 70 6c 69  ipping any dupli
c4e0: 63 61 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63  cates. In this c
c4f0: 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65  ase an.** ephere
c500: 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62  mal table must b
c510: 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68  e used unless th
c520: 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75  e selected <colu
c530: 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65  mn> is guarantee
c540: 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75  d.** to be uniqu
c550: 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75  e - either becau
c560: 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45  se it is an INTE
c570: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
c580: 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55  or it.** has a U
c590: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
c5a0: 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78   or UNIQUE index
c5b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
c5c0: 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65  rNotFound parame
c5d0: 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
c5e0: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 77 69  en the b-tree wi
c5f0: 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66  ll be used .** f
c600: 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62  or fast set memb
c610: 65 72 73 68 69 70 20 74 65 73 74 73 2e 20 49 6e  ership tests. In
c620: 20 74 68 69 73 20 63 61 73 65 20 61 6e 20 65 70   this case an ep
c630: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
c640: 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75  st .** be used u
c650: 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69  nless <column> i
c660: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
c670: 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69  MARY KEY or an i
c680: 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20  ndex can .** be 
c690: 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75  found with <colu
c6a0: 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  mn> as its left-
c6b0: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a  most column..**.
c6c0: 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72  ** When the b-tr
c6d0: 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ee is being used
c6e0: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
c6f0: 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69  tests, the calli
c700: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e  ng function.** n
c710: 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68 65  eeds to know whe
c720: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
c730: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
c740: 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 0a  ns an SQL NULL .
c750: 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65  ** value in orde
c760: 72 20 74 6f 20 63 6f 72 72 65 63 74 6c 79 20 65  r to correctly e
c770: 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
c780: 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e 20 28  ons like "X IN (
c790: 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20 74 68  Y, Z)"..** If th
c7a0: 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63  ere is any chanc
c7b0: 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
c7c0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
c7d0: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a   NULL value at.*
c7e0: 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20  * runtime, then 
c7f0: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
c800: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
c810: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
c820: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70  written.** to *p
c830: 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20 74 68  rNotFound. If th
c840: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
c850: 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
c860: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
c870: 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
c880: 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73 20 6c 65  prNotFound is le
c890: 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
c8a0: 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
c8b0: 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
c8c0: 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20  nd its location 
c8d0: 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 4e 6f 74  stored in *prNot
c8e0: 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 69  Found, then.** i
c8f0: 74 73 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  ts initial value
c900: 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 74 68   is NULL.  If th
c910: 65 20 28 2e 2e 2e 29 20 64 6f 65 73 20 6e 6f 74  e (...) does not
c920: 20 72 65 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74   remain constant
c930: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 75 72 61  .** for the dura
c940: 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 65 72  tion of the quer
c950: 79 20 28 69 2e 65 2e 20 74 68 65 20 53 45 4c 45  y (i.e. the SELE
c960: 43 54 20 77 69 74 68 69 6e 20 74 68 65 20 28 2e  CT within the (.
c970: 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 63 6f 72 72  ..).** is a corr
c980: 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 29  elated subquery)
c990: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
c9a0: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
c9b0: 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20   register is.** 
c9c0: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 65 61  reset to NULL ea
c9d0: 63 68 20 74 69 6d 65 20 74 68 65 20 73 75 62 71  ch time the subq
c9e0: 75 65 72 79 20 69 73 20 72 65 72 75 6e 2e 20 54  uery is rerun. T
c9f0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a  his allows the.*
ca00: 2a 20 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20  * caller to use 
ca10: 76 64 62 65 20 63 6f 64 65 20 65 71 75 69 76 61  vdbe code equiva
ca20: 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c  lent to the foll
ca30: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  owing:.**.**   i
ca40: 66 28 20 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c  f( register==NUL
ca50: 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f  L ){.**     has_
ca60: 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20 69 66 20  null = <test if 
ca70: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
ca80: 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a  ontains null>.**
ca90: 20 20 20 20 20 72 65 67 69 73 74 65 72 20 3d 20       register = 
caa0: 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69  1.**   }.**.** i
cab0: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
cac0: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65   running the <te
cad0: 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63  st if data struc
cae0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75  ture contains nu
caf0: 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65  ll>.** test more
cb00: 20 6f 66 74 65 6e 20 74 68 61 6e 20 69 73 20 6e   often than is n
cb10: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66  ecessary..*/.#if
cb20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
cb30: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
cb40: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
cb50: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
cb60: 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70  Expr *pX, int *p
cb70: 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65  rNotFound){.  Se
cb80: 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20  lect *p;        
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cba0: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f      /* SELECT to
cbb0: 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e   the right of IN
cbc0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
cbd0: 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20  nt eType = 0;   
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbf0: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
cc00: 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e  RHS table. IN_IN
cc10: 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69  DEX_* */.  int i
cc20: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
cc30: 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  ab++;           
cc40: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68   /* Cursor of th
cc50: 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20  e RHS table */. 
cc60: 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75   int mustBeUniqu
cc70: 65 20 3d 20 28 70 72 4e 6f 74 46 6f 75 6e 64 3d  e = (prNotFound=
cc80: 3d 30 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  =0);   /* True i
cc90: 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e  f RHS must be un
cca0: 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ique */.  Vdbe *
ccb0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
ccc0: 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  be(pParse);     
ccd0: 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69  /* Virtual machi
cce0: 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ne being coded *
ccf0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d  /..  assert( pX-
cd00: 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 0a 20  >op==TK_IN );.. 
cd10: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
cd20: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
cd30: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63  table or index c
cd40: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  an be used to.  
cd50: 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20 71  ** satisfy the q
cd60: 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20 70  uery.  This is p
cd70: 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e  referable to gen
cd80: 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20  erating a new . 
cd90: 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61   ** ephemeral ta
cda0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ble..  */.  p = 
cdb0: 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  (ExprHasProperty
cdc0: 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
cdd0: 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65  t) ? pX->x.pSele
cde0: 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 41  ct : 0);.  if( A
cdf0: 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e 6e 45  LWAYS(pParse->nE
ce00: 72 72 3d 3d 30 29 20 26 26 20 69 73 43 61 6e 64  rr==0) && isCand
ce10: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
ce20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
ce30: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ce40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
ce50: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
ce60: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62  ction */.    Tab
ce70: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61      /* Table <ta
cea0: 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 45 78 70  ble>. */.    Exp
ceb0: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
cee0: 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20  n <column> */.  
cef0: 20 20 69 31 36 20 69 43 6f 6c 3b 20 20 20 20 20    i16 iCol;     
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
cf20: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c  x of column <col
cf30: 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20  umn> */.    i16 
cf40: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
cf70: 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 0a  dx for pTab */..
cf80: 20 20 20 20 61 73 73 65 72 74 28 20 70 20 29 3b      assert( p );
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
cfb0: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
cfc0: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
cfd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
cfe0: 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
cff0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
d000: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
d010: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
d020: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
d030: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
d040: 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
d050: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
d060: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
d070: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
d080: 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
d090: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
d0a0: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
d0b0: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
d0c0: 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
d0d0: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
d0e0: 20 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45     pExpr = p->pE
d0f0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
d100: 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 28 69 31  ;.    iCol = (i1
d110: 36 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  6)pExpr->iColumn
d120: 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64  ;.   .    /* Cod
d130: 65 20 61 6e 20 4f 50 5f 56 65 72 69 66 79 43 6f  e an OP_VerifyCo
d140: 6f 6b 69 65 20 61 6e 64 20 4f 50 5f 54 61 62 6c  okie and OP_Tabl
d150: 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65  eLock for <table
d160: 3e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  >. */.    if( pT
d170: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  ab->pSchema ){. 
d180: 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74       iDb = sqlit
d190: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
d1a0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
d1b0: 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
d1c0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
d1d0: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
d1e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
d1f0: 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
d200: 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
d210: 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
d220: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
d230: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d240: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
d250: 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20   two places. In 
d260: 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76  both cases the v
d270: 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61  dbe.    ** has a
d280: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
d290: 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65  cated. So assume
d2a0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
d2b0: 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  ) is always.    
d2c0: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65  ** successful he
d2d0: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
d2e0: 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66  ssert(v);.    if
d2f0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
d300: 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 0a 20 20    int iAddr;..  
d310: 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69      iAddr = sqli
d320: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
d330: 73 65 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  se);..      sqli
d340: 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
d350: 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
d360: 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
d370: 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
d380: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
d390: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
d3a0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d3b0: 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73  iAddr);.    }els
d3c0: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
d3d0: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d3f0: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
d400: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  le */..      /* 
d410: 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
d420: 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20 74  quence used by t
d430: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49  he comparison. I
d440: 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f  f an index is to
d450: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65  .      ** be use
d460: 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  d in place of a 
d470: 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d  temp-table, it m
d480: 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20 61  ust be ordered a
d490: 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a  ccording.      *
d4a0: 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74  * to this collat
d4b0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a  ion sequence.  *
d4c0: 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
d4d0: 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42  *pReq = sqlite3B
d4e0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
d4f0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
d500: 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a  pLeft, pExpr);..
d510: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
d520: 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
d530: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
d540: 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  ed to perform th
d550: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  e .      ** comp
d560: 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61  arison is the sa
d570: 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69  me as the affini
d580: 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ty of the column
d590: 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74  . If.      ** it
d5a0: 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e   is not, it is n
d5b0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
d5c0: 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20  se any index..  
d5d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
d5e0: 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73   affinity_ok = s
d5f0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
d600: 69 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d 3e  ityOk(pX, pTab->
d610: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e  aCol[iCol].affin
d620: 69 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  ity);..      for
d630: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
d640: 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
d650: 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79  e==0 && affinity
d660: 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  _ok; pIdx=pIdx->
d670: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
d680: 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c  if( (pIdx->aiCol
d690: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20  umn[0]==iCol).  
d6a0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
d6b0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
d6c0: 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e   ENC(db), pIdx->
d6d0: 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70  azColl[0], 0)==p
d6e0: 52 65 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  Req.         && 
d6f0: 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c  (!mustBeUnique |
d700: 7c 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  | (pIdx->nKeyCol
d710: 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45  ==1 && pIdx->onE
d720: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a  rror!=OE_None)).
d730: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
d740: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
d750: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
d760: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
d770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d780: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
d790: 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78  Read, iTab, pIdx
d7a0: 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
d7b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d7c0: 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
d7d0: 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
d7e0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
d7f0: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
d800: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
d810: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d820: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
d830: 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f  ESC == IN_INDEX_
d840: 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20  INDEX_ASC+1 );. 
d850: 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d           eType =
d860: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
d870: 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72  ASC + pIdx->aSor
d880: 74 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20 20 20 20  tOrder[0];..    
d890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d8a0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
d8b0: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
d8c0: 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26  f( prNotFound &&
d8d0: 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   !pTab->aCol[iCo
d8e0: 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  l].notNull ){.  
d8f0: 20 20 20 20 20 20 20 20 20 20 2a 70 72 4e 6f 74            *prNot
d900: 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65  Found = ++pParse
d910: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
d920: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d930: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
d940: 2c 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  , 0, *prNotFound
d950: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
d960: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d970: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
d980: 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
d990: 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66    /* Could not f
d9a0: 6f 75 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67  ound an existing
d9b0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
d9c0: 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48  to use as the RH
d9d0: 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a  S b-tree..    **
d9e0: 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f   We will have to
d9f0: 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68   generate an eph
da00: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
da10: 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20  do the job..    
da20: 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64  */.    u32 saved
da30: 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
da40: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
da50: 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76  .    int rMayHav
da60: 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65  eNull = 0;.    e
da70: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
da80: 45 50 48 3b 0a 20 20 20 20 69 66 28 20 70 72 4e  EPH;.    if( prN
da90: 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20  otFound ){.     
daa0: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 72   *prNotFound = r
dab0: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
dac0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
dad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dae0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
daf0: 2c 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  , 0, *prNotFound
db00: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
db10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
db20: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
db30: 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  >0 );.      pPar
db40: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
db50: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58   0;.      if( pX
db60: 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ->pLeft->iColumn
db70: 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72  <0 && !ExprHasPr
db80: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
db90: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
dba0: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
dbb0: 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NDEX_ROWID;.    
dbc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
dbd0: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
dbe0: 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72  ct(pParse, pX, r
dbf0: 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79  MayHaveNull, eTy
dc00: 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
dc10: 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ID);.    pParse-
dc20: 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61  >nQueryLoop = sa
dc30: 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
dc40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e   }else{.    pX->
dc50: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
dc60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70   }.  return eTyp
dc70: 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
dc80: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
dc90: 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71   for scalar subq
dca0: 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61  ueries used as a
dcb0: 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73   subquery expres
dcc0: 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a  sion, EXISTS,.**
dcd0: 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   or IN operators
dce0: 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  .  Examples:.**.
dcf0: 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61  **     (SELECT a
dd00: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20   FROM b)        
dd10: 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a    -- subquery.**
dd20: 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c       EXISTS (SEL
dd30: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
dd40: 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65  -- EXISTS subque
dd50: 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  ry.**     x IN (
dd60: 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20  4,5,11)         
dd70: 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
dd80: 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e  tor with list on
dd90: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
dda0: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45  .**     x IN (SE
ddb0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
ddc0: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
ddd0: 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20  r with subquery 
dde0: 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a  on the right.**.
ddf0: 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72  ** The pExpr par
de00: 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73  ameter describes
de10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
de20: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
de30: 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  e IN.** operator
de40: 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a   or subquery..**
de50: 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
de60: 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d   isRowid is non-
de70: 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65  zero, then expre
de80: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67  ssion pExpr is g
de90: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
dea0: 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  be of the form "
deb0: 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f  <rowid> IN (?, ?
dec0: 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f  , ?)", where <ro
ded0: 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65  wid> is a refere
dee0: 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69  nce.** to some i
def0: 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d  nteger key colum
df00: 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54  n of a table B-T
df10: 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
df20: 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74  e, use an.** int
df30: 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74  key B-Tree to st
df40: 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49  ore the set of I
df50: 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e  N(...) values in
df60: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
df70: 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76  al.** (slower) v
df80: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
df90: 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a  eys B-Tree..**.*
dfa0: 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c  * If rMayHaveNul
dfb0: 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  l is non-zero, t
dfc0: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
dfd0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
dfe0: 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20  an IN.** (not a 
dff0: 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
e000: 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 52  ) and that the R
e010: 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  HS might contain
e020: 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74  s NULLs..** Furt
e030: 68 65 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e 20  hermore, the IN 
e040: 69 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  is in a WHERE cl
e050: 61 75 73 65 20 61 6e 64 20 74 68 61 74 20 77 65  ause and that we
e060: 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20   really want.** 
e070: 74 6f 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  to iterate over 
e080: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
e090: 4e 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f 72  N operator in or
e0a0: 64 65 72 20 74 6f 20 71 75 69 63 6b 6c 79 20 6c  der to quickly l
e0b0: 6f 63 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72  ocate.** all cor
e0c0: 72 65 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20 65  responding LHS e
e0d0: 6c 65 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74 68  lements.  All th
e0e0: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
e0f0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a  is initialize.**
e100: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67 69   the register gi
e110: 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e  ven by rMayHaveN
e120: 75 6c 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61  ull to NULL.  Ca
e130: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77  lling routines w
e140: 69 6c 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72 65  ill take.** care
e150: 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69   of changing thi
e160: 73 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65  s register value
e170: 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20   to non-NULL if 
e180: 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d  the RHS is NULL-
e190: 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  free..**.** If r
e1a0: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 7a  MayHaveNull is z
e1b0: 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
e1c0: 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72  that the subquer
e1d0: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 0a  y is being used.
e1e0: 2a 2a 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ** for membershi
e1f0: 70 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20  p testing only. 
e200: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
e210: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
e220: 61 6e 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  any.** registers
e230: 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65   to indicate the
e240: 20 70 72 65 73 65 6e 63 65 20 6f 72 20 61 62 73   presence or abs
e250: 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e  ence of NULLs on
e260: 20 74 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a 20   the RHS..**.** 
e270: 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20  For a SELECT or 
e280: 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c  EXISTS operator,
e290: 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   return the regi
e2a0: 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20  ster that holds 
e2b0: 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20  the.** result.  
e2c0: 46 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  For IN operators
e2d0: 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
e2e0: 6f 63 63 75 72 73 2c 20 74 68 65 20 72 65 74 75  occurs, the retu
e2f0: 72 6e 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a  rn value is 0..*
e300: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
e310: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
e320: 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  nt sqlite3CodeSu
e330: 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  bselect(.  Parse
e340: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e350: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e360: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
e370: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
e380: 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45     /* The IN, SE
e390: 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20  LECT, or EXISTS 
e3a0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
e3b0: 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20  t rMayHaveNull, 
e3c0: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
e3d0: 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77  r that records w
e3e0: 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69  hether NULLs exi
e3f0: 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69  st in RHS */.  i
e400: 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20  nt isRowid      
e410: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
e420: 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65  e, LHS of IN ope
e430: 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64  rator is a rowid
e440: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73   */.){.  int tes
e450: 74 41 64 64 72 20 3d 20 2d 31 3b 20 20 20 20 20  tAddr = -1;     
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73   /* One-time tes
e480: 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69  t address */.  i
e490: 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20  nt rReg = 0;    
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4b0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
e4c0: 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c  er storing resul
e4d0: 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ting */.  Vdbe *
e4e0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
e4f0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
e500: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
e510: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
e520: 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
e530: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
e540: 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62  This code must b
e550: 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74  e run in its ent
e560: 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d 65  irety every time
e570: 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
e580: 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f  ed.  ** if any o
e590: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e5a0: 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  is true:.  **.  
e5b0: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
e5c0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
e5d0: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
e5e0: 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20  query.  **    * 
e5f0: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
e600: 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65  side is an expre
e610: 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ssion list conta
e620: 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a  ining variables.
e630: 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72    **    *  We ar
e640: 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67  e inside a trigg
e650: 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  er.  **.  ** If 
e660: 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
e670: 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e   are false, then
e680: 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73   we can run this
e690: 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a   code just once.
e6a0: 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65    ** save the re
e6b0: 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65  sults, and reuse
e6c0: 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
e6d0: 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69   on subsequent i
e6e0: 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  nvocations..  */
e6f0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
e700: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
e710: 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a  P_VarSelect) ){.
e720: 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 73      testAddr = s
e730: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
e740: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 23 69 66  Parse);.  }..#if
e750: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e760: 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70  _EXPLAIN.  if( p
e770: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
e780: 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
e790: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
e7a0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
e7b0: 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55  arse->db, "EXECU
e7c0: 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52 59  TE %s%s SUBQUERY
e7d0: 20 25 64 22 2c 20 74 65 73 74 41 64 64 72 3e 3d   %d", testAddr>=
e7e0: 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44  0?"":"CORRELATED
e7f0: 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70   ",.        pExp
e800: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49  r->op==TK_IN?"LI
e810: 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20 70 50  ST":"SCALAR", pP
e820: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
e830: 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tId.    );.    s
e840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
e850: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
e860: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
e870: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
e880: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
e890: 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68  #endif..  switch
e8a0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
e8b0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
e8c0: 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69  .      char affi
e8d0: 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  nity;           
e8e0: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f     /* Affinity o
e8f0: 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  f the LHS of the
e900: 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74   IN */.      int
e910: 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
e920: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
e930: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
e940: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
e950: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
e960: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
e970: 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20  ->pLeft; /* the 
e980: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
e990: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
e9a0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
e9b0: 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b  o = 0;      /* K
e9c0: 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ey information *
e9d0: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61  /..      if( rMa
e9e0: 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20  yHaveNull ){.   
e9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ea00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
ea10: 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75  l, 0, rMayHaveNu
ea20: 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ll);.      }..  
ea30: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
ea40: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
ea50: 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20  ty(pLeft);..    
ea60: 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
ea70: 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
ea80: 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
ea90: 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
eaa0: 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
eab0: 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
eac0: 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
ead0: 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c  y.  An ephemeral
eae0: 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20   table is .     
eaf0: 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
eb00: 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64  single-field ind
eb10: 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e  ex keys represen
eb20: 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
eb30: 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
eb40: 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65  he SELECT or the
eb50: 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20   <exprlist>..   
eb60: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
eb70: 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73  f the 'x' expres
eb80: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
eb90: 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53   value, or the S
eba0: 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a  ELECT....      *
ebb0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  * statement retu
ebc0: 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c  rns a column val
ebd0: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66  ue, then the aff
ebe0: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20  inity of that.  
ebf0: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73      ** column is
ec00: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74   used to build t
ec10: 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  he index keys. I
ec20: 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74  f both 'x' and t
ec30: 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45  he.      ** SELE
ec40: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
ec50: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
ec60: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
ec70: 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20  ty is used.     
ec80: 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f   ** if either co
ec90: 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43  lumn has NUMERIC
eca0: 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69   or INTEGER affi
ecb0: 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72  nity. If neither
ecc0: 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f  .      ** 'x' no
ecd0: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20  r the SELECT... 
ece0: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
ecf0: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
ed00: 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ric affinity.   
ed10: 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20     ** is used.. 
ed20: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45       */.      pE
ed30: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
ed40: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
ed50: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
ed60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ed70: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
ed80: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
ed90: 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20   !isRowid);.    
eda0: 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75    if( rMayHaveNu
edb0: 6c 6c 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ll==0 ) sqlite3V
edc0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
edd0: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
ede0: 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
edf0: 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20  = isRowid ? 0 : 
ee00: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
ee10: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
ee20: 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66  1, 1);..      if
ee30: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
ee40: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
ee50: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
ee60: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
ee70: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
ee80: 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
ee90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
eea0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
eeb0: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
eec0: 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
eed0: 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
eee0: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
eef0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
ef00: 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
ef10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
ef20: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
ef30: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
ef40: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t *pEList;..    
ef50: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
ef60: 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
ef70: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
ef80: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
ef90: 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
efa0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65  ble);.        de
efb0: 73 74 2e 61 66 66 53 64 73 74 20 3d 20 28 75 38  st.affSdst = (u8
efc0: 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  )affinity;.     
efd0: 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
efe0: 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
eff0: 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
f000: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
f010: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
f020: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
f030: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f040: 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f  pKeyInfo==0 ); /
f050: 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20  * Caused by OOM 
f060: 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  in sqlite3KeyInf
f070: 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20  oAlloc() */.    
f080: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
f090: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
f0a0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
f0b0: 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
f0c0: 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
f0d0: 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f  foUnref(pKeyInfo
f0e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
f0f0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
f100: 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20  .        pEList 
f110: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
f120: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
f130: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
f140: 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
f150: 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
f160: 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
f170: 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
f180: 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
f190: 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
f1a0: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e  assert( pEList->
f1b0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20  nExpr>0 );.     
f1c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f1d0: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
f1e0: 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
f1f0: 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  ;.        pKeyIn
f200: 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  fo->aColl[0] = s
f210: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
f220: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
f230: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
f240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
f280: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
f290: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
f2a0: 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
f2b0: 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
f2c0: 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
f2d0: 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
f2e0: 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a  list).        **
f2f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  .        ** For 
f300: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c  each expression,
f310: 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20   build an index 
f320: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61  key from the eva
f330: 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  luation and.    
f340: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
f350: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
f360: 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72   table. If <expr
f370: 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  > is a column, t
f380: 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20  hen use.        
f390: 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
f3a0: 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
f3b0: 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
f3c0: 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
f3d0: 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
f3e0: 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d   column, use num
f3f0: 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20  eric affinity.. 
f400: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
f410: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
f420: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
f430: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
f440: 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  t;.        struc
f450: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
f460: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20  *pItem;.        
f470: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
f480: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
f490: 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
f4a0: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
f4b0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
f4c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f4d0: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
f4e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
f4f0: 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
f500: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
f510: 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20  eyInfo) );.     
f520: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
f530: 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
f540: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
f550: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f560: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  t);.        }.. 
f570: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
f580: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
f590: 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
f5a0: 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ist>. */.       
f5b0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
f5c0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
f5d0: 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
f5e0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
f5f0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
f600: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f610: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
f620: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66  , r2);.        f
f630: 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  or(i=pList->nExp
f640: 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  r, pItem=pList->
f650: 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
f660: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
f670: 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74   Expr *pE2 = pIt
f680: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
f690: 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49       int iValToI
f6a0: 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  ns;..          /
f6b0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
f6c0: 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  ion is not const
f6d0: 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ant then we will
f6e0: 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
f6f0: 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
f700: 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20  e test that was 
f710: 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20  generated above 
f720: 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a  that makes sure.
f730: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
f740: 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63  s code only exec
f750: 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61  utes once.  Beca
f760: 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f  use for a non-co
f770: 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20  nstant.         
f780: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
f790: 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20  e need to rerun 
f7a0: 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74  this code each t
f7b0: 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ime..          *
f7c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
f7d0: 74 65 73 74 41 64 64 72 3e 3d 30 20 26 26 20 21  testAddr>=0 && !
f7e0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
f7f0: 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
f800: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f810: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
f820: 70 28 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a  p(v, testAddr);.
f830: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
f840: 41 64 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20  Addr = -1;.     
f850: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
f860: 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
f870: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
f880: 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
f890: 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  the temp table *
f8a0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
f8b0: 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74  isRowid && sqlit
f8c0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
f8d0: 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29  pE2, &iValToIns)
f8e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f8f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f900: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e  3(v, OP_InsertIn
f910: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
f920: 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29  , r2, iValToIns)
f930: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
f940: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
f950: 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  3 = sqlite3ExprC
f960: 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
f970: 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20  , pE2, r1);.    
f980: 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
f990: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
f9a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f9b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
f9c0: 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20  tBeInt, r3,.    
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f9f0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
fa00: 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20  dr(v)+2);.      
fa10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fa20: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
fa30: 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
fa40: 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a  Table, r2, r3);.
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
fa60: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
fa70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa80: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
fa90: 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20  ord, r3, 1, r2, 
faa0: 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  &affinity, 1);. 
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
fac0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
fad0: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
fae0: 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20  se, r3, 1);.    
faf0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
fb00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fb10: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78  P_IdxInsert, pEx
fb20: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b  pr->iTable, r2);
fb30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
fb40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
fb50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
fb60: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
fb70: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
fb80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
fb90: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
fba0: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
fbb0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65   }.      if( pKe
fbc0: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
fbd0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
fbe0: 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76  geP4(v, addr, (v
fbf0: 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  oid *)pKeyInfo, 
fc00: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
fc10: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
fc20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
fc30: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
fc40: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
fc50: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
fc60: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
fc70: 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61   has to be a sca
fc80: 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e  lar SELECT.  Gen
fc90: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
fca0: 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76  t the.      ** v
fcb0: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c  alue of this sel
fcc0: 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20  ect in a memory 
fcd0: 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20  cell and record 
fce0: 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  the number.     
fcf0: 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72   ** of the memor
fd00: 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
fd10: 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61  n.  If this is a
fd20: 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a  n EXISTS, write.
fd30: 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65        ** an inte
fd40: 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74  ger 0 (not exist
fd50: 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29  s) or 1 (exists)
fd60: 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63   into a memory c
fd70: 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ell.      ** and
fd80: 20 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d   record that mem
fd90: 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c  ory cell in iCol
fda0: 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  umn..      */.  
fdb0: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
fdc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fdd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
fde0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
fdf0: 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   encode */.     
fe00: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
fe10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fe20: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
fe30: 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43   deal with SELEC
fe40: 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20  t result */..   
fe50: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
fe60: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
fe70: 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
fe80: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
fe90: 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
fea0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
feb0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
fec0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
fed0: 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20  _SELECT );..    
fee0: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
fef0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
ff00: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
ff10: 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ;.      pSel = p
ff20: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
ff30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
ff40: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
ff50: 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d  st, 0, ++pParse-
ff60: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  >nMem);.      if
ff70: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
ff80: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
ff90: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
ffa0: 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  RT_Mem;.        
ffb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ffc0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
ffd0: 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
ffe0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
fff0: 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75  ent((v, "Init su
10000 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
10010 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10020 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73         dest.eDes
10030 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a  t = SRT_Exists;.
10040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10050 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10060 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74  Integer, 0, dest
10070 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  .iSDParm);.     
10080 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
10090 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20  v, "Init EXISTS 
100a0 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
100b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
100c0 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
100d0 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69  e->db, pSel->pLi
100e0 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  mit);.      pSel
100f0 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
10100 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
10110 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30  TK_INTEGER, 0, 0
10120 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54      &sqlite3IntT
10150 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20  okens[1]);.     
10160 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20   pSel->iLimit = 
10170 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  0;.      if( sql
10180 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
10190 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20  e, pSel, &dest) 
101a0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
101b0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
101c0 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69     rReg = dest.i
101d0 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78  SDParm;.      Ex
101e0 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
101f0 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
10200 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  uce);.      brea
10210 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
10220 69 66 28 20 74 65 73 74 41 64 64 72 3e 3d 30 20  if( testAddr>=0 
10230 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
10240 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65  beJumpHere(v, te
10250 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73  stAddr);.  }.  s
10260 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
10270 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 0a  op(pParse, 1);..
10280 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d    return rReg;.}
10290 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
102a0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
102b0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
102c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
102d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
102e0 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65  code for an IN e
102f0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
10300 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45        x IN (SELE
10310 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20  CT ...).**      
10320 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
10330 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ue, ...).**.** T
10340 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
10350 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61  e (LHS) is a sca
10360 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  lar expression. 
10370 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
10380 73 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73  side (RHS).** is
10390 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72   an array of zer
103a0 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73  o or more values
103b0 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
103c0 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  n is true if the
103d0 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61   LHS is.** conta
103e0 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
103f0 52 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20  RHS.  The value 
10400 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
10410 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55  n is unknown (NU
10420 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48  LL).** if the LH
10430 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  S is NULL or if 
10440 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63  the LHS is not c
10450 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
10460 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a  the RHS and the.
10470 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  ** RHS contains 
10480 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c  one or more NULL
10490 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   values..**.** T
104a0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
104b0 72 61 74 65 73 20 63 6f 64 65 20 77 69 6c 6c 20  rates code will 
104c0 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61  jump to destIfFa
104d0 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
104e0 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
104f0 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
10500 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
10510 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
10520 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
10530 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
10540 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
10550 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
10560 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
10570 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
10580 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
10590 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
105a0 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ough..*/.static 
105b0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
105c0 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
105d0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
105e0 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
105f0 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
10600 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
10610 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
10620 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
10630 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
10640 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
10650 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
10660 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
10670 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
10680 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
10690 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
106a0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
106b0 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
106c0 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
106d0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
106e0 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
106f0 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
10700 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
10710 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
10720 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 61  lues */.  char a
10730 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20  ffinity;        
10740 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66  /* Comparison af
10750 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f  finity to use */
10760 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
10770 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
10780 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   of the RHS */. 
10790 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
107a0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
107b0 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
107c0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
107d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
107e0 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
107f0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a  onstruction */..
10800 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
10810 20 52 48 53 2e 20 20 20 41 66 74 65 72 20 74 68   RHS.   After th
10820 69 73 20 73 74 65 70 2c 20 74 68 65 20 74 61 62  is step, the tab
10830 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 0a 20  le with cursor. 
10840 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   ** pExpr->iTabl
10850 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20  e will contains 
10860 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
10870 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
10880 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  .  */.  v = pPar
10890 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
108a0 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
108b0 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74     /* OOM detect
108c0 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ed prior to this
108d0 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64   routine */.  Vd
108e0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
108f0 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72  , "begin IN expr
10900 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73  "));.  eType = s
10910 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
10920 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  x(pParse, pExpr,
10930 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a   &rRhsHasNull);.
10940 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
10950 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
10960 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
10970 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
10980 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68  sults.  ** of th
10990 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66  e expression. af
109a0 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73  finityStr stores
109b0 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
109c0 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20   suitable for.  
109d0 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65  ** P4 of OP_Make
109e0 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61  Record..  */.  a
109f0 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72  ffinity = compar
10a00 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
10a10 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  pr);..  /* Code 
10a20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
10a30 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
10a40 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f   IN (...)"..  */
10a50 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
10a60 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
10a70 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
10a80 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
10a90 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
10aa0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
10ab0 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a  pr->pLeft, r1);.
10ac0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53  .  /* If the LHS
10ad0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
10ae0 68 65 20 72 65 73 75 6c 74 20 69 73 20 65 69 74  he result is eit
10af0 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c  her false or NUL
10b00 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  L depending.  **
10b10 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 20   on whether the 
10b20 52 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72 20  RHS is empty or 
10b30 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c  not, respectivel
10b40 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  y..  */.  if( de
10b50 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
10b60 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 2f 2a 20  False ){.    /* 
10b70 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65  Shortcut for the
10b80 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
10b90 72 65 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64  re the false and
10ba0 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61   NULL outcomes a
10bb0 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  re.    ** the sa
10bc0 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  me. */.    sqlit
10bd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10be0 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64  OP_IsNull, r1, d
10bf0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  estIfNull);.  }e
10c00 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  lse{.    int add
10c10 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
10c20 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp1(v, OP_Not
10c30 4e 75 6c 6c 2c 20 72 31 29 3b 0a 20 20 20 20 73  Null, r1);.    s
10c40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10c50 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
10c60 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
10c70 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
10c80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10c90 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
10ca0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
10cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10cc0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
10cd0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70  .  }..  if( eTyp
10ce0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
10cf0 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  D ){.    /* In t
10d00 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
10d10 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f  S is the ROWID o
10d20 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 0a 20  f table b-tree. 
10d30 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
10d40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10d50 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c  P_MustBeInt, r1,
10d60 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
10d70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10d80 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
10d90 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61  ists, pExpr->iTa
10da0 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
10db0 2c 20 72 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , r1);.  }else{.
10dc0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
10dd0 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20  ase, the RHS is 
10de0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
10df0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
10e00 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10e10 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 31   OP_Affinity, r1
10e20 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74  , 1, 0, &affinit
10e30 79 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  y, 1);..    /* I
10e40 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  f the set member
10e50 73 68 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c  ship test fails,
10e60 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
10e70 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   of the .    ** 
10e80 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70  "x IN (...)" exp
10e90 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
10ea0 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c  either 0 or NULL
10eb0 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20  . If the set.   
10ec0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   ** contains no 
10ed0 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
10ee0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
10ef0 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a 20  0. If the set . 
10f00 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f     ** contains o
10f10 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
10f20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65  values, then the
10f30 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
10f40 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
10f50 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20   is also NULL.. 
10f60 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 52     */.    if( rR
10f70 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20  hsHasNull==0 || 
10f80 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
10f90 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  tIfNull ){.     
10fa0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
10fb0 72 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e  runs if it is kn
10fc0 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  own at compile t
10fd0 69 6d 65 20 74 68 61 74 20 74 68 65 20 52 48 53  ime that the RHS
10fe0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74  .      ** cannot
10ff0 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61   contain NULL va
11000 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65  lues. This happe
11010 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ns as the result
11020 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22  .      ** of a "
11030 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
11040 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61  aint in the data
11050 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
11060 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
11070 6c 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72 61  lso run this bra
11080 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20 65  nch if NULL is e
11090 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c  quivalent to FAL
110a0 53 45 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  SE.      ** for 
110b0 74 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  this particular 
110c0 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  IN operator..   
110d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
110e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
110f0 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
11100 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
11110 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c  destIfFalse, r1,
11120 20 31 29 3b 0a 0a 20 20 20 20 7d 65 6c 73 65 7b   1);..    }else{
11130 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
11140 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48  s branch, the RH
11150 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68  S of the IN migh
11160 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
11170 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
11180 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20  e presence of a 
11190 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20  NULL on the RHS 
111a0 6d 61 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e  makes a differen
111b0 63 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ce in the.      
111c0 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20  ** outcome..    
111d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a    */.      int j
111e0 31 2c 20 6a 32 2c 20 6a 33 3b 0a 0a 20 20 20 20  1, j2, j3;..    
111f0 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b    /* First check
11200 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c   to see if the L
11210 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  HS is contained 
11220 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
11230 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  so,.      ** the
11240 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
11250 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52  f NULLs in the R
11260 48 53 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  HS does not matt
11270 65 72 2c 20 73 6f 20 6a 75 6d 70 0a 20 20 20 20  er, so jump.    
11280 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66    ** over all of
11290 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66   the code that f
112a0 6f 6c 6c 6f 77 73 2e 0a 20 20 20 20 20 20 2a 2f  ollows..      */
112b0 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  .      j1 = sqli
112c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
112d0 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
112e0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20  xpr->iTable, 0, 
112f0 72 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f  r1, 1);..      /
11300 2a 20 48 65 72 65 20 77 65 20 62 65 67 69 6e 20  * Here we begin 
11310 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20  generating code 
11320 74 68 61 74 20 72 75 6e 73 20 69 66 20 74 68 65  that runs if the
11330 20 4c 48 53 20 69 73 20 6e 6f 74 0a 20 20 20 20   LHS is not.    
11340 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77    ** contained w
11350 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
11360 47 65 6e 65 72 61 74 65 20 61 64 64 69 74 69 6f  Generate additio
11370 6e 61 6c 20 63 6f 64 65 20 74 68 61 74 0a 20 20  nal code that.  
11380 20 20 20 20 2a 2a 20 74 65 73 74 73 20 74 68 65      ** tests the
11390 20 52 48 53 20 66 6f 72 20 4e 55 4c 4c 73 2e 20   RHS for NULLs. 
113a0 20 49 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74   If the RHS cont
113b0 61 69 6e 73 20 61 20 4e 55 4c 4c 20 74 68 65 6e  ains a NULL then
113c0 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74  .      ** jump t
113d0 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
113e0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4e  f there are no N
113f0 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20  ULLs in the RHS 
11400 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75  then.      ** ju
11410 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73  mp to destIfFals
11420 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
11430 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
11440 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
11450 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e  otNull, rRhsHasN
11460 75 6c 6c 29 3b 0a 20 20 20 20 20 20 6a 33 20 3d  ull);.      j3 =
11470 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11480 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
11490 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
114a0 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  , 0, rRhsHasNull
114b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
114c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
114d0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c   OP_Integer, -1,
114e0 20 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20   rRhsHasNull);. 
114f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11500 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b  JumpHere(v, j3);
11510 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11520 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
11530 64 64 49 6d 6d 2c 20 72 52 68 73 48 61 73 4e 75  ddImm, rRhsHasNu
11540 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ll, 1);.      sq
11550 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11560 65 28 76 2c 20 6a 32 29 3b 0a 0a 20 20 20 20 20  e(v, j2);..     
11570 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
11580 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 72 67  appropriate targ
11590 65 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  et depending on 
115a0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20  whether or not. 
115b0 20 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20       ** the RHS 
115c0 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 0a  contains a NULL.
115d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
115e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
115f0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73 48  (v, OP_If, rRhsH
11600 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75  asNull, destIfNu
11610 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
11620 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11630 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
11640 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20  IfFalse);..     
11650 20 2f 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e 64   /* The OP_Found
11660 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
11670 68 69 73 20 62 72 61 6e 63 68 20 6a 75 6d 70 73  his branch jumps
11680 20 68 65 72 65 20 77 68 65 6e 20 74 72 75 65 2c   here when true,
11690 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 75 73 69   .      ** causi
116a0 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 49  ng the overall I
116b0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  N expression eva
116c0 6c 75 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c 20  luation to fall 
116d0 74 68 72 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a  through..      *
116e0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
116f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
11700 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
11710 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
11720 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
11730 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
11740 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
11750 20 31 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65   1);.  VdbeComme
11760 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65  nt((v, "end IN e
11770 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  xpr"));.}.#endif
11780 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11790 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
117a0 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20  ** Duplicate an 
117b0 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a  8-byte value.*/.
117c0 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70  static char *dup
117d0 38 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20  8bytes(Vdbe *v, 
117e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b  const char *in){
117f0 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73  .  char *out = s
11800 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
11810 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
11820 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75  v), 8);.  if( ou
11830 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t ){.    memcpy(
11840 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d  out, in, 8);.  }
11850 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d  .  return out;.}
11860 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11870 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
11880 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  OINT./*.** Gener
11890 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
118a0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
118b0 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f   the floating po
118c0 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73  int.** value des
118d0 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e  cribed by z[0..n
118e0 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
118f0 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r iMem..**.** Th
11900 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c  e z[] string wil
11910 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62  l probably not b
11920 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  e zero-terminate
11930 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20  d.  But the .** 
11940 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69  z[n] character i
11950 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
11960 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  be something tha
11970 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a  t does not look.
11980 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74  ** like the cont
11990 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  inuation of the 
119a0 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
119b0 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28  c void codeReal(
119c0 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
119d0 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61  har *z, int nega
119e0 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  teFlag, int iMem
119f0 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
11a00 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75  z!=0) ){.    dou
11a10 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63  ble value;.    c
11a20 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c  har *zV;.    sql
11a30 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c  ite3AtoF(z, &val
11a40 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ue, sqlite3Strle
11a50 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
11a60 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TF8);.    assert
11a70 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  ( !sqlite3IsNaN(
11a80 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65  value) ); /* The
11a90 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20   new AtoF never 
11aa0 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20  returns NaN */. 
11ab0 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61     if( negateFla
11ac0 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
11ad0 75 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70  ue;.    zV = dup
11ae0 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
11af0 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71  )&value);.    sq
11b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
11b10 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69  v, OP_Real, 0, i
11b20 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52  Mem, 0, zV, P4_R
11b30 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  EAL);.  }.}.#end
11b40 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  if.../*.** Gener
11b50 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
11b60 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
11b70 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
11b80 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
11b90 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
11ba0 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
11bb0 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  *.** Expr.u.zTok
11bc0 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46  en is always UTF
11bd0 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69  8 and zero-termi
11be0 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nated..*/.static
11bf0 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
11c00 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
11c10 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
11c20 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
11c30 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Mem){.  Vdbe *v 
11c40 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
11c50 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
11c60 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
11c70 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  e ){.    int i =
11c80 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
11c90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
11ca0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  =0 );.    if( ne
11cb0 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a  gFlag ) i = -i;.
11cc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11cd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
11ce0 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20  ger, i, iMem);. 
11cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
11d00 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65  c;.    i64 value
11d10 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
11d20 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a   *z = pExpr->u.z
11d30 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  Token;.    asser
11d40 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63  t( z!=0 );.    c
11d50 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34   = sqlite3Atoi64
11d60 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69  (z, &value, sqli
11d70 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20  te3Strlen30(z), 
11d80 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
11d90 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63    if( c==0 || (c
11da0 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20  ==2 && negFlag) 
11db0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
11dc0 56 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  V;.      if( neg
11dd0 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
11de0 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==2 ? SMALLEST_
11df0 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
11e00 7d 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70  }.      zV = dup
11e10 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
11e20 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  )&value);.      
11e30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11e40 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  4(v, OP_Int64, 0
11e50 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
11e60 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
11e70 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
11e80 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
11e90 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c  _POINT.      sql
11ea0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11eb0 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20  rse, "oversized 
11ec0 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20  integer: %s%s", 
11ed0 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20  negFlag ? "-" : 
11ee0 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 20 20  "", z);.#else.  
11ef0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
11f00 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d  z, negFlag, iMem
11f10 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
11f20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
11f30 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79  ar a cache entry
11f40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11f50 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
11f60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11f70 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
11f80 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
11f90 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
11fa0 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
11fb0 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
11fc0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
11fd0 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
11fe0 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
11ff0 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
12000 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
12010 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
12020 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
12030 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f  Record in the co
12040 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20  lumn cache that 
12050 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c  a particular col
12060 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61  umn from a.** pa
12070 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69  rticular table i
12080 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61  s stored in a pa
12090 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
120a0 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
120b0 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
120c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
120d0 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43  int iTab, int iC
120e0 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  ol, int iReg){. 
120f0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69   int i;.  int mi
12100 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c  nLru;.  int idxL
12110 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f  ru;.  struct yCo
12120 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73  lCache *p;..  as
12130 73 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20  sert( iReg>0 ); 
12140 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d   /* Register num
12150 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20  bers are always 
12160 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73  positive */.  as
12170 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
12180 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
12190 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
121a0 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
121b0 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f  /* The SQLITE_Co
121c0 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64  lumnCache flag d
121d0 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75  isables the colu
121e0 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  mn cache.  This 
121f0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72  is used.  ** for
12200 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20   testing only - 
12210 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53  to verify that S
12220 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74  QLite always get
12230 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  s the same answe
12240 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20  r.  ** with and 
12250 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75  without the colu
12260 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  mn cache..  */. 
12270 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
12280 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65  nDisabled(pParse
12290 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c  ->db, SQLITE_Col
122a0 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75  umnCache) ) retu
122b0 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20  rn;..  /* First 
122c0 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73  replace any exis
122d0 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a  ting entry..  **
122e0 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
122f0 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75  the way the colu
12300 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72  mn cache is curr
12310 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61  ently used, we a
12320 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20  re guaranteed.  
12330 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65  ** that the obje
12340 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c  ct will never al
12350 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68  ready be in cach
12360 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20  e.  Verify this 
12370 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a  guarantee..  */.
12380 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
12390 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
123a0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
123b0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
123c0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
123d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52     assert( p->iR
123e0 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62  eg==0 || p->iTab
123f0 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69  le!=iTab || p->i
12400 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a  Column!=iCol );.
12410 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
12420 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73   Find an empty s
12430 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20  lot and replace 
12440 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  it */.  for(i=0,
12450 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
12460 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
12470 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
12480 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
12490 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >iReg==0 ){.    
124a0 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
124b0 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
124c0 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62  l;.      p->iTab
124d0 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  le = iTab;.     
124e0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
124f0 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  ol;.      p->iRe
12500 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20  g = iReg;.      
12510 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
12520 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
12530 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
12540 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
12550 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12560 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61  * Replace the la
12570 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64  st recently used
12580 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30   */.  minLru = 0
12590 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78  x7fffffff;.  idx
125a0 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28  Lru = -1;.  for(
125b0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
125c0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
125d0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
125e0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
125f0 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20  ( p->lru<minLru 
12600 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20  ){.      idxLru 
12610 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72  = i;.      minLr
12620 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20  u = p->lru;.    
12630 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41  }.  }.  if( ALWA
12640 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b  YS(idxLru>=0) ){
12650 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65  .    p = &pParse
12660 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c  ->aColCache[idxL
12670 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76  ru];.    p->iLev
12680 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
12690 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d  cheLevel;.    p-
126a0 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
126b0 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
126c0 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52   iCol;.    p->iR
126d0 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70  eg = iReg;.    p
126e0 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
126f0 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
12700 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
12710 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
12720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
12730 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72  te that register
12740 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e  s between iReg..
12750 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20  iReg+nReg-1 are 
12760 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
12770 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  n..** Purge the 
12780 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
12790 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  rs from the colu
127a0 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69  mn cache..*/.voi
127b0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
127c0 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a  heRemove(Parse *
127d0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
127e0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
127f0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73  nt i;.  int iLas
12800 74 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20  t = iReg + nReg 
12810 2d 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43  - 1;.  struct yC
12820 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
12830 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
12840 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
12850 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
12860 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
12870 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
12880 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67  .    if( r>=iReg
12890 20 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a   && r<=iLast ){.
128a0 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
128b0 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
128c0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
128d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
128e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
128f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
12900 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78  umn cache contex
12910 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72  t.  Any new entr
12920 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64  ies added.** add
12930 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ed to the column
12940 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
12950 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76  s call are remov
12960 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63  ed when the.** c
12970 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70  orresponding pop
12980 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
12990 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
129a0 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  ePush(Parse *pPa
129b0 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
129c0 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23  iCacheLevel++;.#
129d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
129e0 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
129f0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
12a00 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
12a10 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
12a20 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c  ("PUSH to %d\n",
12a30 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
12a40 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
12a50 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  f.}../*.** Remov
12a60 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  e from the colum
12a70 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72  n cache any entr
12a80 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64  ies that were ad
12a90 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  ded since the.**
12aa0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 4e 20   the previous N 
12ab0 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e  Push operations.
12ac0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
12ad0 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 61  , restore the ca
12ae0 63 68 65 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  che.** to the st
12af0 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 4e 20  ate it was in N 
12b00 50 75 73 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76  Pushes ago..*/.v
12b10 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
12b20 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70  achePop(Parse *p
12b30 50 61 72 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20  Parse, int N){. 
12b40 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
12b50 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
12b60 20 61 73 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a   assert( N>0 );.
12b70 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
12b80 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e  ->iCacheLevel>=N
12b90 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43   );.  pParse->iC
12ba0 61 63 68 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a  acheLevel -= N;.
12bb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
12bc0 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
12bd0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
12be0 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
12bf0 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
12c00 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22  f("POP  to %d\n"
12c10 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
12c20 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
12c30 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  if.  for(i=0, p=
12c40 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
12c50 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
12c60 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
12c70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
12c80 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e  eg && p->iLevel>
12c90 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
12ca0 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63  vel ){.      cac
12cb0 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
12cc0 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
12cd0 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
12ce0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
12cf0 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c  hen a cached col
12d00 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d  umn is reused, m
12d10 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74  ake sure that it
12d20 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a  s register is.**
12d30 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c   no longer avail
12d40 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72  able as a temp r
12d50 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74  egister.  ticket
12d60 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61   #3879:  that sa
12d70 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d  me.** register m
12d80 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63  ight be in the c
12d90 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65  ache in multiple
12da0 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73   places, so be s
12db0 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68  ure to.** get th
12dc0 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  em all..*/.stati
12dd0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
12de0 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
12df0 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
12e00 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
12e10 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
12e20 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
12e30 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
12e40 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
12e50 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
12e60 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
12e70 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
12e80 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74  eg ){.      p->t
12e90 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
12ea0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
12eb0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12ec0 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  extract the valu
12ed0 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  e of the iCol-th
12ee0 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
12ef0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
12f00 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
12f10 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56  lumnOfTable(.  V
12f20 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f  dbe *v,        /
12f30 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
12f40 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
12f50 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
12f60 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
12f70 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
12f80 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  alue */.  int iT
12f90 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65  abCur,    /* The
12fa0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20   table cursor.  
12fb0 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72  Or the PK cursor
12fc0 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
12fd0 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ID */.  int iCol
12fe0 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ,       /* Index
12ff0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74   of the column t
13000 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69  o extract */.  i
13010 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f  nt regOut      /
13020 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
13030 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65  lue into this re
13040 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  gister */.){.  i
13050 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f  f( iCol<0 || iCo
13060 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  l==pTab->iPKey )
13070 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
13080 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
13090 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65  wid, iTabCur, re
130a0 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gOut);.  }else{.
130b0 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56      int op = IsV
130c0 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f  irtual(pTab) ? O
130d0 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43  P_VColumn : OP_C
130e0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78  olumn;.    int x
130f0 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28   = iCol;.    if(
13100 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
13110 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71   ){.      x = sq
13120 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
13130 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72  ex(sqlite3Primar
13140 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c  yKeyIndex(pTab),
13150 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
13160 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13170 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43  Op3(v, op, iTabC
13180 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a  ur, x, regOut);.
13190 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
131a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
131b0 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
131c0 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67   pTab, iCol, reg
131d0 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
131e0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
131f0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
13200 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
13210 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
13220 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
13230 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
13240 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69   value in a regi
13250 73 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74  ster.  An effort
13260 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73  .** is made to s
13270 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
13280 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
13290 72 20 69 52 65 67 2c 20 62 75 74 20 74 68 69 73  r iReg, but this
132a0 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61   is.** not guara
132b0 6e 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61  nteed.  The loca
132c0 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75  tion of the colu
132d0 6d 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  mn value is retu
132e0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rned..**.** Ther
132f0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
13300 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
13310 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
13320 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
13330 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
13340 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
13350 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
13360 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
13370 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20  e rowid..*/.int 
13380 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
13390 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
133a0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
133b0 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
133c0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
133d0 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
133e0 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
133f0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
13400 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
13410 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
13420 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
13430 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
13440 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
13450 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
13460 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
13470 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
13480 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
13490 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
134a0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
134b0 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20  re */.  u8 p5   
134c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76           /* P5 v
134d0 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75  alue for OP_Colu
134e0 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  mn */.){.  Vdbe 
134f0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
13500 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
13510 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
13520 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *p;..  for(i=0, 
13530 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
13540 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
13550 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
13560 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
13570 69 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61  iReg>0 && p->iTa
13580 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
13590 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  ->iColumn==iColu
135a0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c  mn ){.      p->l
135b0 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
135c0 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
135d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
135e0 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72  PinRegister(pPar
135f0 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20  se, p->iReg);.  
13600 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52      return p->iR
13610 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a  eg;.    }.  }  .
13620 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
13630 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
13640 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
13650 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61  ble(v, pTab, iTa
13660 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
13670 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b  eg);.  if( p5 ){
13680 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13690 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b  ChangeP5(v, p5);
136a0 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20  .  }else{   .   
136b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
136c0 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
136d0 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
136e0 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  iReg);.  }.  ret
136f0 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
13700 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c  ** Clear all col
13710 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65  umn cache entrie
13720 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
13730 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
13740 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
13750 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
13760 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
13770 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
13780 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
13790 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
137a0 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
137b0 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
137c0 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d  ("CLEAR\n");.  }
137d0 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
137e0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
137f0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
13800 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
13810 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
13820 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20  p->iReg ){.     
13830 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
13840 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
13850 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
13860 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
13870 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61  ** Record the fa
13880 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e  ct that an affin
13890 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f  ity change has o
138a0 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e  ccurred on iCoun
138b0 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73  t.** registers s
138c0 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74  tarting with iSt
138d0 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  art..*/.void sql
138e0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
138f0 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73  inityChange(Pars
13900 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
13910 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e  Start, int iCoun
13920 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t){.  sqlite3Exp
13930 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
13940 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f  rse, iStart, iCo
13950 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  unt);.}../*.** G
13960 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13970 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  move content fro
13980 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f  m registers iFro
13990 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31  m...iFrom+nReg-1
139a0 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e  .** over to iTo.
139b0 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65  .iTo+nReg-1. Kee
139c0 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  p the column cac
139d0 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a  he up-to-date..*
139e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
139f0 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65  prCodeMove(Parse
13a00 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
13a10 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e  rom, int iTo, in
13a20 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
13a30 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
13a40 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72  ache *p;.  asser
13a50 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52  t( iFrom>=iTo+nR
13a60 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67  eg || iFrom+nReg
13a70 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74  <=iTo );.  sqlit
13a80 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61  e3VdbeAddOp3(pPa
13a90 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d  rse->pVdbe, OP_M
13aa0 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c  ove, iFrom, iTo,
13ab0 20 6e 52 65 67 2d 31 29 3b 0a 20 20 66 6f 72 28   nReg-1);.  for(
13ac0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
13ad0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
13ae0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
13af0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
13b00 74 20 78 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t x = p->iReg;. 
13b10 20 20 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20     if( x>=iFrom 
13b20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20  && x<iFrom+nReg 
13b30 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  ){.      p->iReg
13b40 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20   += iTo-iFrom;. 
13b50 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20     }.  }.}..#if 
13b60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
13b70 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
13b80 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45  (SQLITE_COVERAGE
13b90 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
13ba0 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
13bb0 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
13bc0 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f  range iFrom..iTo
13bd0 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20   (inclusive).** 
13be0 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
13bf0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  of the column ca
13c00 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
13c10 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
13c20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
13c30 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d  and testcase() m
13c40 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e  acros only.** an
13c50 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  d does not appea
13c60 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75  r in a normal bu
13c70 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ild..*/.static i
13c80 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  nt usedAsColumnC
13c90 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
13ca0 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
13cb0 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69  nt iTo){.  int i
13cc0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
13cd0 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
13ce0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
13cf0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
13d00 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
13d10 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
13d20 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   r = p->iReg;.  
13d30 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26    if( r>=iFrom &
13d40 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72  & r<=iTo ) retur
13d50 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53  n 1;    /*NO_TES
13d60 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  T*/.  }.  return
13d70 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
13d80 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20  SQLITE_DEBUG || 
13d90 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
13da0 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  TEST */../*.** C
13db0 6f 6e 76 65 72 74 20 61 6e 20 65 78 70 72 65 73  onvert an expres
13dc0 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54  sion node to a T
13dd0 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2f 0a 73 74  K_REGISTER.*/.st
13de0 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f  atic void exprTo
13df0 52 65 67 69 73 74 65 72 28 45 78 70 72 20 2a 70  Register(Expr *p
13e00 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70  , int iReg){.  p
13e10 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20  ->op2 = p->op;. 
13e20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49   p->op = TK_REGI
13e30 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  STER;.  p->iTabl
13e40 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72  e = iReg;.  Expr
13e50 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c  ClearProperty(p,
13e60 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a   EP_Skip);.}../*
13e70 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
13e80 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  e into the curre
13e90 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75  nt Vdbe to evalu
13ea0 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ate the given.**
13eb0 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74   expression.  At
13ec0 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74  tempt to store t
13ed0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  he results in re
13ee0 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e  gister "target".
13ef0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
13f00 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65  egister where re
13f10 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
13f20 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69  ..**.** With thi
13f30 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65  s routine, there
13f40 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65   is no guarantee
13f50 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69   that results wi
13f60 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20  ll.** be stored 
13f70 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  in target.  The 
13f80 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20  result might be 
13f90 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f  stored in some o
13fa0 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72  ther.** register
13fb0 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e   if it is conven
13fc0 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20  ient to do so.  
13fd0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
13fe0 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65  tion.** must che
13ff0 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  ck the return co
14000 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  de and move the 
14010 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64  results to the d
14020 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74  esired.** regist
14030 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
14040 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
14050 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14060 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
14070 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
14080 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
14090 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20  dbe;  /* The VM 
140a0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
140b0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  on */.  int op; 
140c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140d0 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
140e0 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
140f0 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72   int inReg = tar
14100 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  get;       /* Re
14110 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20  sults stored in 
14120 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a  register inReg *
14130 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
14140 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
14150 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
14160 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
14170 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
14180 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
14190 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
141a0 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
141b0 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
141c0 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31  ster */.  int r1
141d0 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20  , r2, r3, r4;   
141e0 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72      /* Various r
141f0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
14200 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
14210 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f   = pParse->db; /
14220 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
14230 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
14240 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20  xpr tempX;      
14250 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
14260 6f 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  orary expression
14270 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   node */..  asse
14280 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
14290 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
142a0 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d  nMem );.  if( v=
142b0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
142c0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
142d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
142e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
142f0 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
14300 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e  ){.    op = TK_N
14310 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
14320 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
14330 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
14340 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
14350 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  K_AGG_COLUMN: {.
14360 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
14370 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d  AggInfo = pExpr-
14380 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
14390 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
143a0 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67  col *pCol = &pAg
143b0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70  gInfo->aCol[pExp
143c0 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20  r->iAgg];.      
143d0 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64  if( !pAggInfo->d
143e0 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20  irectMode ){.   
143f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
14400 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20  l->iMem>0 );.   
14410 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f       inReg = pCo
14420 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20  l->iMem;.       
14430 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
14440 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f  lse if( pAggInfo
14450 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  ->useSortingIdx 
14460 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14470 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14480 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49  OP_Column, pAggI
14490 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50  nfo->sortingIdxP
144a0 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144c0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
144d0 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
144e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
144f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
14500 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
14510 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
14520 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
14530 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14540 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
14550 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45     int iTab = pE
14560 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
14570 20 20 20 69 66 28 20 69 54 61 62 3c 30 20 29 7b     if( iTab<0 ){
14580 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
14590 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b  rse->ckBase>0 ){
145a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  .          /* Ge
145b0 6e 65 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63  nerating CHECK c
145c0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e  onstraints or in
145d0 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72  serting into par
145e0 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  tial index */.  
145f0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
14600 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b  pExpr->iColumn +
14610 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b   pParse->ckBase;
14620 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
14630 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14640 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  .          /* De
14650 6c 65 74 69 6e 67 20 66 72 6f 6d 20 61 20 70 61  leting from a pa
14660 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20  rtial index */. 
14670 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20           iTab = 
14680 70 50 61 72 73 65 2d 3e 69 50 61 72 74 49 64 78  pParse->iPartIdx
14690 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Tab;.        }. 
146a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52       }.      inR
146b0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
146c0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
146d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61  arse, pExpr->pTa
146e0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14700 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
14710 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a  , iTab, target,.
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14740 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20  Expr->op2);.    
14750 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14760 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
14770 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65  ER: {.      code
14780 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
14790 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74  pExpr, 0, target
147a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
147b0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
147c0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
147d0 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73  NG_POINT.    cas
147e0 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
147f0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
14800 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
14810 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
14820 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65   );.      codeRe
14830 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  al(v, pExpr->u.z
14840 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74  Token, 0, target
14850 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14860 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
14870 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
14880 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
14890 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
148a0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
148b0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73  alue) );.      s
148c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
148d0 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
148e0 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 70 45  0, target, 0, pE
148f0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
14900 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14910 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14920 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
14930 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14940 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
14950 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14960 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
14970 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14980 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
14990 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
149a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
149b0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
149c0 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  *z;.      char *
149d0 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73  zBlob;.      ass
149e0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
149f0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
14a00 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
14a10 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
14a20 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
14a30 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a  x' || pExpr->u.z
14a40 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b  Token[0]=='X' );
14a50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14a60 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
14a70 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
14a80 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a   z = &pExpr->u.z
14a90 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20  Token[2];.      
14aa0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
14ab0 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20  n30(z) - 1;.    
14ac0 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d    assert( z[n]==
14ad0 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42  '\'' );.      zB
14ae0 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78  lob = sqlite3Hex
14af0 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64  ToBlob(sqlite3Vd
14b00 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a  beDb(v), z, n);.
14b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14b20 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
14b30 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c  ob, n/2, target,
14b40 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59   0, zBlob, P4_DY
14b50 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72  NAMIC);.      br
14b60 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
14b70 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
14b80 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
14b90 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
14ba0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
14bb0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
14bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
14bd0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30  xpr->u.zToken!=0
14be0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14bf0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
14c00 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  n[0]!=0 );.     
14c10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14c20 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c  p2(v, OP_Variabl
14c30 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
14c40 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
14c50 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a    if( pExpr->u.z
14c60 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20  Token[1]!=0 ){. 
14c70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14c80 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
14c90 5d 3d 3d 27 3f 27 20 0a 20 20 20 20 20 20 20 20  ]=='?' .        
14ca0 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 70       || strcmp(p
14cb0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
14cc0 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45  pParse->azVar[pE
14cd0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29  xpr->iColumn-1])
14ce0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==0 );.        s
14cf0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
14d00 50 34 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65  P4(v, -1, pParse
14d10 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69  ->azVar[pExpr->i
14d20 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54  Column-1], P4_ST
14d30 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
14d40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14d50 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  }.    case TK_RE
14d60 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
14d70 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69  inReg = pExpr->i
14d80 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65  Table;.      bre
14d90 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14da0 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20  se TK_AS: {.    
14db0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
14dc0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
14dd0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14de0 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
14df0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14e00 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
14e10 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
14e20 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
14e30 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
14e40 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
14e50 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
14e60 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
14e70 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b   int aff, to_op;
14e80 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
14e90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
14ea0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
14eb0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
14ec0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
14ed0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
14ee0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
14ef0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
14f00 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66  aff = sqlite3Aff
14f10 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d  inityType(pExpr-
14f20 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20  >u.zToken, 0);. 
14f30 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66       to_op = aff
14f40 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   - SQLITE_AFF_TE
14f50 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a  XT + OP_ToText;.
14f60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
14f70 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20  _op==OP_ToText  
14f80 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
14f90 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a  _AFF_TEXT    );.
14fa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
14fb0 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20  _op==OP_ToBlob  
14fc0 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
14fd0 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a  _AFF_NONE    );.
14fe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
14ff0 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69  _op==OP_ToNumeri
15000 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45  c || aff!=SQLITE
15010 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
15020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
15030 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20  _op==OP_ToInt   
15040 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
15050 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a  _AFF_INTEGER );.
15060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
15070 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20  _op==OP_ToReal  
15080 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
15090 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a  _AFF_REAL    );.
150a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
150b0 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74  to_op==OP_ToText
150c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
150d0 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
150e0 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 74 65  Blob );.      te
150f0 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
15100 50 5f 54 6f 4e 75 6d 65 72 69 63 20 29 3b 0a 20  P_ToNumeric );. 
15110 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
15120 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29  o_op==OP_ToInt )
15130 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15140 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65  ( to_op==OP_ToRe
15150 61 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  al );.      if( 
15160 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b  inReg!=target ){
15170 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15180 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15190 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
151a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
151b0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
151c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
151d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
151e0 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67 29  v, to_op, inReg)
151f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15200 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  ( usedAsColumnCa
15210 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  che(pParse, inRe
15220 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20  g, inReg) );.   
15230 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
15240 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
15250 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
15260 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
15270 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
15280 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  * SQLITE_OMIT_CA
15290 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ST */.    case T
152a0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
152b0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
152c0 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
152d0 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
152e0 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
152f0 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
15300 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
15310 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
15320 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
15330 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15340 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
15350 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15360 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
15370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
15380 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
15390 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
153a0 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
153b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
153c0 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_LT );.      t
153d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
153e0 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LE );.      test
153f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20  case( op==TK_GT 
15400 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15410 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  e( op==TK_GE );.
15420 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15430 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
15440 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15450 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
15460 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
15470 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
15480 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
15490 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
154a0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
154b0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
154c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
154d0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
154e0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
154f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
15500 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
15510 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
15520 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
15530 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
15540 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
15550 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
15560 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
15570 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
15580 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
15590 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
155a0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
155b0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
155c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
155d0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
155e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
155f0 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
15600 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
15610 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15620 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15630 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
15640 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
15650 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15660 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
15670 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
15680 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
15690 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
156a0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f   TK_NE;.      co
156b0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
156c0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
156d0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
156e0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
156f0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
15700 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
15710 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  P2 | SQLITE_NULL
15720 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
15730 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
15740 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15750 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
15760 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15770 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
15780 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  K_AND:.    case 
15790 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  TK_OR:.    case 
157a0 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  TK_PLUS:.    cas
157b0 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63  e TK_STAR:.    c
157c0 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20  ase TK_MINUS:.  
157d0 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20    case TK_REM:. 
157e0 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
157f0 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  D:.    case TK_B
15800 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  ITOR:.    case T
15810 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73  K_SLASH:.    cas
15820 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
15830 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
15840 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f   .    case TK_CO
15850 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  NCAT: {.      as
15860 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50  sert( TK_AND==OP
15870 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _And );.      as
15880 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
15890 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
158a0 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
158b0 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Add );.      ass
158c0 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
158d0 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20  P_Subtract );.  
158e0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
158f0 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
15900 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15910 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
15920 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  BitAnd );.      
15930 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
15940 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20  ==OP_BitOr );.  
15950 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
15960 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
15970 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15980 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
15990 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20  hiftLeft );.    
159a0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
159b0 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
159c0 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ht );.      asse
159d0 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f  rt( TK_CONCAT==O
159e0 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20  P_Concat );.    
159f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15a00 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
15a10 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15a20 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _OR );.      tes
15a30 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
15a40 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  US );.      test
15a50 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e  case( op==TK_MIN
15a60 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  US );.      test
15a70 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
15a80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15a90 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e  se( op==TK_BITAN
15aa0 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
15ab0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f  ase( op==TK_BITO
15ac0 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
15ad0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53  ase( op==TK_SLAS
15ae0 48 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  H );.      testc
15af0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49  ase( op==TK_LSHI
15b00 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  FT );.      test
15b10 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
15b20 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  IFT );.      tes
15b30 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
15b40 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31  NCAT );.      r1
15b50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15b60 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
15b70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
15b80 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
15b90 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
15ba0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
15bb0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
15bc0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
15bd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15be0 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
15bf0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
15c00 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
15c10 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
15c20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
15c30 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
15c40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15c50 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
15c60 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
15c70 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
15c80 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
15c90 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
15ca0 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
15cb0 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
15cc0 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
15cd0 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
15ce0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66   1, target);.#if
15cf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15d00 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
15d10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
15d20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
15d30 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OAT ){.        a
15d40 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
15d50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
15d60 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
15d70 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
15d80 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  v, pLeft->u.zTok
15d90 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  en, 1, target);.
15da0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
15db0 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  se{.        temp
15dc0 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45  X.op = TK_INTEGE
15dd0 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  R;.        tempX
15de0 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56  .flags = EP_IntV
15df0 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  alue|EP_TokenOnl
15e00 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  y;.        tempX
15e10 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20  .u.iValue = 0;. 
15e20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
15e30 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15e40 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20  pParse, &tempX, 
15e50 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
15e60 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
15e70 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15e80 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15e90 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
15ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15eb0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
15ec0 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c  ubtract, r2, r1,
15ed0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15ee0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
15ef0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
15f00 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
15f10 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62   target;.      b
15f20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15f30 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
15f40 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
15f50 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
15f60 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
15f70 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61  itNot );.      a
15f80 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f  ssert( TK_NOT==O
15f90 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74  P_Not );.      t
15fa0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15fb0 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  BITNOT );.      
15fc0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15fd0 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  _NOT );.      r1
15fe0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15ff0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
16000 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
16010 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
16020 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16030 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e  1==0 );.      in
16040 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
16050 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16060 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
16070 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62   inReg);.      b
16080 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
16090 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
160a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
160b0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
160c0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73   addr;.      ass
160d0 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
160e0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
160f0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
16100 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
16110 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  l );.      testc
16120 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
16130 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
16140 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
16150 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71  NULL );.      sq
16160 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16170 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
16180 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16190 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
161a0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
161b0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
161c0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
161d0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
161e0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
161f0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
16200 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c  dbeAddOp1(v, op,
16210 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
16220 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16230 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67   OP_AddImm, targ
16240 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73  et, -1);.      s
16250 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
16260 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
16270 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16280 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
16290 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
162a0 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f    AggInfo *pInfo
162b0 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
162c0 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
162d0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
162e0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
162f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16300 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
16310 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16320 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16330 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
16340 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70  regate: %s()", p
16350 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
16360 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16370 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49        inReg = pI
16380 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72  nfo->aFunc[pExpr
16390 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20  ->iAgg].iMem;.  
163a0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
163b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
163c0 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
163d0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
163e0 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a  *pFarg;       /*
163f0 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   List of functio
16400 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
16410 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20       int nFarg; 
16420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16430 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f  umber of functio
16440 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
16450 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
16460 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ef;         /* T
16470 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  he function defi
16480 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  nition object */
16490 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20  .      int nId; 
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
164b0 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66   Length of the f
164c0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20  unction name in 
164d0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63  bytes */.      c
164e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
164f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
16500 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
16510 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73      int constMas
16520 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61  k = 0;     /* Ma
16530 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  sk of function a
16540 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72  rguments that ar
16550 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20  e constant */.  
16560 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
16570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
16580 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
16590 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
165a0 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  (db);      /* Th
165b0 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
165c0 75 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74  used by this dat
165d0 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
165e0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
165f0 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61  0;    /* A colla
16600 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
16610 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
16620 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
16630 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
16640 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
16650 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
16660 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
16670 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
16680 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20     pFarg = 0;.  
16690 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
166a0 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72     pFarg = pExpr
166b0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
166c0 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d   }.      nFarg =
166d0 20 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e   pFarg ? pFarg->
166e0 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20  nExpr : 0;.     
166f0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
16700 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
16710 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
16720 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78  .      zId = pEx
16730 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
16740 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65      nId = sqlite
16750 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a  3Strlen30(zId);.
16760 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
16770 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
16780 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  (db, zId, nId, n
16790 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Farg, enc, 0);. 
167a0 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
167b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
167c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
167d0 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e  se, "unknown fun
167e0 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20  ction: %.*s()", 
167f0 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
16800 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16810 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65  }..      /* Atte
16820 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70  mpt a direct imp
16830 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
16840 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c  he built-in COAL
16850 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20  ESCE() and.     
16860 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e   ** IFNULL() fun
16870 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76  ctions.  This av
16880 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79  oids unnecessary
16890 20 65 76 61 6c 61 74 69 6f 6e 20 6f 66 0a 20 20   evalation of.  
168a0 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73      ** arguments
168b0 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20   past the first 
168c0 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
168d0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
168e0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
168f0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
16900 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a  UNC_COALESCE ){.
16910 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43          int endC
16920 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65  oalesce = sqlite
16930 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
16940 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
16950 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20  t( nFarg>=2 );. 
16960 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
16970 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
16980 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
16990 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
169a0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46     for(i=1; i<nF
169b0 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
169c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
169d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
169e0 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e  Null, target, en
169f0 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
16a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16a10 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
16a20 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b  rse, target, 1);
16a30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16a40 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
16a50 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
16a60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
16a70 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  de(pParse, pFarg
16a80 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[i].pExpr, ta
16a90 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rget);.         
16aa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
16ab0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
16ac0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16ad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
16ae0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
16af0 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
16b00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16b10 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   }..      /* The
16b20 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63   UNLIKELY() func
16b30 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
16b40 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20    The result is 
16b50 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
16b60 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
16b70 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
16b80 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
16b90 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
16ba0 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b  QLITE_FUNC_UNLIK
16bb0 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ELY ){.        a
16bc0 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20  ssert( nFarg>=1 
16bd0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16be0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
16bf0 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
16c00 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
16c10 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16c20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
16c30 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=0; i<nFarg; i
16c40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
16c50 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33   i<32 && sqlite3
16c60 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
16c70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
16c80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ) ){.          c
16c90 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c  onstMask |= (1<<
16ca0 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
16cb0 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
16cc0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
16cd0 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
16ce0 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20  L)!=0 && !pColl 
16cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
16d00 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
16d10 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
16d20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
16d30 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
16d40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16d50 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  pFarg ){.       
16d60 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29   if( constMask )
16d70 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  {.          r1 =
16d80 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
16d90 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
16da0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67  e->nMem += nFarg
16db0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
16dc0 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
16dd0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
16de0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72  nge(pParse, nFar
16df0 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  g);.        }.. 
16e00 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65         /* For le
16e10 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f  ngth() and typeo
16e20 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69  f() functions wi
16e30 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75  th a column argu
16e40 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ment,.        **
16e50 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61   set the P5 para
16e60 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f  meter to the OP_
16e70 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f  Column opcode to
16e80 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
16e90 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  G.        ** or 
16ea0 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
16eb0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74   respectively, t
16ec0 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
16ed0 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20  ary data.       
16ee0 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20   ** loading..   
16ef0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16f00 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
16f10 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46  lags & (SQLITE_F
16f20 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54  UNC_LENGTH|SQLIT
16f30 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21  E_FUNC_TYPEOF))!
16f40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16f50 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20  u8 exprOp;.     
16f60 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
16f70 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg==1 );.       
16f80 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67     assert( pFarg
16f90 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
16fa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  );.          exp
16fb0 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30  rOp = pFarg->a[0
16fc0 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20  ].pExpr->op;.   
16fd0 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f         if( exprO
16fe0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
16ff0 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43  exprOp==TK_AGG_C
17000 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
17010 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
17020 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d  ITE_FUNC_LENGTH=
17030 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  =OPFLAG_LENGTHAR
17040 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
17050 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
17060 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46  FUNC_TYPEOF==OPF
17070 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b  LAG_TYPEOFARG );
17080 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
17090 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e  tcase( pDef->fun
170a0 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  cFlags & OPFLAG_
170b0 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
170c0 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e           pFarg->
170d0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20  a[0].pExpr->op2 
170e0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
170f0 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46       pDef->funcF
17100 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c  lags & (OPFLAG_L
17110 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f  ENGTHARG|OPFLAG_
17120 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20  TYPEOFARG);.    
17130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17140 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  }..        sqlit
17150 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
17160 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
17170 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33  Ticket 2ea2425d3
17180 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  4be */.        s
17190 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
171a0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
171b0 46 61 72 67 2c 20 72 31 2c 20 0a 20 20 20 20 20  Farg, r1, .     
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171d0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
171e0 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54  E_ECEL_DUP|SQLIT
171f0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a  E_ECEL_FACTOR);.
17200 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17210 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
17220 73 65 2c 20 31 29 3b 20 20 20 2f 2a 20 54 69 63  se, 1);   /* Tic
17230 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
17240 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
17250 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b  .        r1 = 0;
17260 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
17270 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
17280 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
17290 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72  /* Possibly over
172a0 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f  load the functio
172b0 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61  n if the first a
172c0 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20  rgument is.     
172d0 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61   ** a virtual ta
172e0 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  ble column..    
172f0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
17300 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  r infix function
17310 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52  s (LIKE, GLOB, R
17320 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48  EGEXP, and MATCH
17330 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  ) use the.      
17340 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
17350 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73  nt, not the firs
17360 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  t, as the argume
17370 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20  nt to test to.  
17380 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
17390 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
173a0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
173b0 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62    This is done b
173c0 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
173d0 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
173e0 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69   of infix functi
173f0 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64  ons (the operand
17400 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20   we want to.    
17410 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65    ** control ove
17420 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75  rloading) ends u
17430 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  p as the second 
17440 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
17450 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
17460 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  n.  The expressi
17470 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73  on "A glob B" is
17480 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
17490 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42        ** "glob(B
174a0 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f  ,A).  We want to
174b0 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41   use the A in "A
174c0 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74   glob B" to test
174d0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75  .      ** for fu
174e0 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
174f0 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20  ng.  But we use 
17500 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67  the B term in "g
17510 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20  lob(B,A)"..     
17520 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46   */.      if( nF
17530 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72  arg>=2 && (pExpr
17540 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66  ->flags & EP_Inf
17550 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  ixFunc) ){.     
17560 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
17570 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
17580 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
17590 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
175a0 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
175b0 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67   }else if( nFarg
175c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
175d0 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
175e0 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
175f0 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
17600 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
17610 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  xpr);.      }.#e
17620 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
17630 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
17640 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
17650 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
17660 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
17670 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
17680 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
17690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
176a0 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
176b0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
176c0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
176d0 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
176e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
176f0 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69  Op4(v, OP_Functi
17700 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72  on, constMask, r
17710 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  1, target,.     
17720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17730 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20     (char*)pDef, 
17740 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
17750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
17760 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46  angeP5(v, (u8)nF
17770 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  arg);.      if( 
17780 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61  nFarg && constMa
17790 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sk==0 ){.       
177a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
177b0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
177c0 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20   r1, nFarg);.   
177d0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
177e0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
177f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
17800 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
17810 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
17820 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
17830 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17840 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
17850 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17860 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
17870 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
17880 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
17890 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
178a0 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
178b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
178c0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
178d0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
178e0 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
178f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17900 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
17910 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
17920 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17930 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17940 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
17950 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
17960 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17970 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
17980 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
17990 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
179a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
179b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
179c0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
179d0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
179e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
179f0 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
17a00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17a10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17a20 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
17a30 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
17a40 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17a50 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
17a60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17a70 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
17a80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
17a90 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
17aa0 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
17ab0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
17ac0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
17ad0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
17ae0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
17af0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
17b00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
17b10 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
17b20 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
17b30 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
17b40 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
17b50 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
17b60 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
17b70 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
17b80 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
17b90 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
17ba0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
17bb0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
17bc0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
17bd0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
17be0 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20  _item *pLItem = 
17bf0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
17c00 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  a;.      Expr *p
17c10 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
17c20 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31  pExpr;..      r1
17c30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17c40 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
17c50 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
17c60 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
17c70 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
17c80 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
17c90 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
17ca0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
17cb0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
17cc0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
17cd0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
17ce0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
17cf0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
17d00 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69  .      r4 = sqli
17d10 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
17d20 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64  arse);.      cod
17d30 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
17d40 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
17d50 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20  OP_Ge,.         
17d60 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
17d70 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52   r3, SQLITE_STOR
17d80 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74  EP2);.      pLIt
17d90 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67  em++;.      pRig
17da0 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
17db0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
17dc0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17dd0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
17de0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
17df0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
17e00 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  p(pParse, pRight
17e10 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
17e20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
17e30 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
17e40 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
17e50 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
17e60 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c  ight, OP_Le, r1,
17e70 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f   r2, r4, SQLITE_
17e80 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
17e90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17ea0 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c  3(v, OP_And, r3,
17eb0 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r4, target);.  
17ec0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17ed0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17ee0 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r3);.      sql
17ef0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17f00 65 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a  eg(pParse, r4);.
17f10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17f20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
17f30 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73  OLLATE: .    cas
17f40 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
17f50 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
17f60 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
17f70 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
17f80 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
17f90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17fa0 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
17fb0 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20  _TRIGGER: {.    
17fc0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f    /* If the opco
17fd0 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52  de is TK_TRIGGER
17fe0 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
17ff0 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72  ssion is a refer
18000 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ence.      ** to
18010 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
18020 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
18030 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76  pseudo-tables av
18040 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  ailable to.     
18050 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67   ** trigger prog
18060 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61  rams. In this ca
18070 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69  se Expr.iTable i
18080 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74  s set to 1 for t
18090 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  he.      ** new.
180a0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
180b0 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64  or 0 for the old
180c0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  .* pseudo-table.
180d0 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20   Expr.iColumn.  
180e0 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
180f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   the column of t
18100 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  he pseudo-table 
18110 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d  to read, or to -
18120 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  1 to.      ** re
18130 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  ad the rowid fie
18140 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ld..      **.   
18150 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73     ** The expres
18160 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  sion is implemen
18170 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f  ted using an OP_
18180 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68  Param opcode. Th
18190 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61  e p1.      ** pa
181a0 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74  rameter is set t
181b0 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72  o 0 for an old.r
181c0 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
181d0 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20  or to (i+1).    
181e0 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63    ** to referenc
181f0 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  e another column
18200 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73   of the old.* ps
18210 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72  eudo-table, wher
18220 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73  e .      ** i is
18230 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
18240 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20  e column. For a 
18250 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65  new.rowid refere
18260 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20  nce, p1 is.     
18270 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29   ** set to (n+1)
18280 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65  , where n is the
18290 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
182a0 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64  ns in each pseud
182b0 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  o-table..      *
182c0 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63  * For a referenc
182d0 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63  e to any other c
182e0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
182f0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
18300 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20   p1.      ** is 
18310 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20  set to (n+2+i), 
18320 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72  where n and i ar
18330 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65  e as defined pre
18340 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20  viously. For.   
18350 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69     ** example, i
18360 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77  f the table on w
18370 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72  hich triggers ar
18380 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73  e being fired is
18390 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72  .      ** declar
183a0 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
183b0 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
183c0 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
183d0 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ;.      **.     
183e0 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69   ** Then p1 is i
183f0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
18400 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  llows:.      **.
18410 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30        **   p1==0
18420 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77     ->    old.row
18430 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d  id     p1==3   -
18440 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20  >    new.rowid. 
18450 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20       **   p1==1 
18460 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20    ->    old.a   
18470 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e        p1==4   ->
18480 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20      new.a.      
18490 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20  **   p1==2   -> 
184a0 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20     old.b        
184b0 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e   p1==5   ->    n
184c0 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20  ew.b       .    
184d0 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
184e0 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e   *pTab = pExpr->
184f0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20  pTab;.      int 
18500 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  p1 = pExpr->iTab
18510 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c  le * (pTab->nCol
18520 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d  +1) + 1 + pExpr-
18530 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20  >iColumn;..     
18540 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
18550 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78  iTable==0 || pEx
18560 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  pr->iTable==1 );
18570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18580 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d  Expr->iColumn>=-
18590 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  1 && pExpr->iCol
185a0 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  umn<pTab->nCol )
185b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
185c0 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c  pTab->iPKey<0 ||
185d0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
185e0 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a  =pTab->iPKey );.
185f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
18600 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d  >=0 && p1<(pTab-
18610 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20  >nCol*2+2) );.. 
18620 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18630 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72  AddOp2(v, OP_Par
18640 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b  am, p1, target);
18650 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
18660 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e  nt((v, "%s.%s ->
18670 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28   $%d",.        (
18680 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20  pExpr->iTable ? 
18690 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a  "new" : "old"),.
186a0 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
186b0 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77  iColumn<0 ? "row
186c0 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61  id" : pExpr->pTa
186d0 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
186e0 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a  Column].zName),.
186f0 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20          target. 
18700 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65       ));..#ifnde
18710 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
18720 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
18730 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
18740 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66  umn has REAL aff
18750 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75  inity, it may cu
18760 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
18770 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a  d as an.      **
18780 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50   integer. Use OP
18790 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f  _RealAffinity to
187a0 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
187b0 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 20 20 2a   really real.  *
187c0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  /.      if( pExp
187d0 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20  r->iColumn>=0 . 
187e0 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61        && pTab->a
187f0 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
18800 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51  mn].affinity==SQ
18810 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
18820 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
18830 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
18840 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  (v, OP_RealAffin
18850 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ity, target);.  
18860 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
18870 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18880 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
18890 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20  Form A:.    **  
188a0 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20   CASE x WHEN e1 
188b0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
188c0 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
188d0 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
188e0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
188f0 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20    ** Form B:.   
18900 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
18910 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
18920 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
18930 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
18940 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
18950 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69  .    ** Form A i
18960 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f  s can be transfo
18970 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71  rmed into the eq
18980 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20  uivalent form B 
18990 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
189a0 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78  **   CASE WHEN x
189b0 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =e1 THEN r1 WHEN
189c0 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e   x=e2 THEN r2 ..
189d0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
189e0 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72  WHEN x=eN THEN r
189f0 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
18a00 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66   **.    ** X (if
18a10 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
18a20 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
18a30 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74      ** Y is in t
18a40 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20  he last element 
18a50 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  of pExpr->x.pLis
18a60 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t if pExpr->x.pL
18a70 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20  ist->nExpr is.  
18a80 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59    ** odd.  The Y
18a90 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61   is also optiona
18aa0 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65  l.  If the numbe
18ab0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
18ac0 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20   x.pList.    ** 
18ad0 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20  is even, then Y 
18ae0 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74  is omitted and t
18af0 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72  he "otherwise" r
18b00 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20  esult is NULL.. 
18b10 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70     ** Ei is in p
18b20 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
18b30 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45  *2] and Ri is pE
18b40 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
18b50 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  2+1]..    **.   
18b60 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f   ** The result o
18b70 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
18b80 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74   is the Ri for t
18b90 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
18ba0 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20  g Ei,.    ** or 
18bb0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
18bc0 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20  atching Ei, the 
18bd0 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20  ELSE term Y, or 
18be0 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  if there is.    
18bf0 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c  ** no ELSE term,
18c00 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
18c10 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
18c20 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29  t( op==TK_CASE )
18c30 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e  ; {.      int en
18c40 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  dLabel;         
18c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
18c60 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e  OTO label for en
18c70 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a  d of CASE stmt *
18c80 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74  /.      int next
18c90 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Case;           
18ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
18cb0 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74  O label for next
18cc0 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
18cd0 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75          /* 2x nu
18d00 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72  mber of WHEN ter
18d10 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ms */.      int 
18d20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18d40 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
18d50 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
18d60 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
18d70 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
18d80 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
18d90 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
18da0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c  xprList_item *aL
18db0 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72  istelem;  /* Arr
18dc0 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  ay of WHEN terms
18dd0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f   */.      Expr o
18de0 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20  pCompare;       
18df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18e00 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73  he X==Ei express
18e10 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
18e20 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18e40 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69  * The X expressi
18e50 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
18e60 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20   *pTest = 0;    
18e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18e80 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20   X==Ei (form A) 
18e90 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d  or just Ei (form
18ea0 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56 41   B) */.      VVA
18eb0 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63 68  _ONLY( int iCach
18ec0 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  eLevel = pParse-
18ed0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a  >iCacheLevel; ).
18ee0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
18ef0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18f00 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
18f10 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78  ect) && pExpr->x
18f20 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  .pList );.      
18f30 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e  assert(pExpr->x.
18f40 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
18f50 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  );.      pEList 
18f60 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
18f70 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65  ;.      aListele
18f80 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  m = pEList->a;. 
18f90 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c       nExpr = pEL
18fa0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
18fb0 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c    endLabel = sql
18fc0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18fd0 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l(v);.      if( 
18fe0 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  (pX = pExpr->pLe
18ff0 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ft)!=0 ){.      
19000 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20    tempX = *pX;. 
19010 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19020 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pX->op==TK_COLU
19030 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78  MN );.        ex
19040 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74 65  prToRegister(&te
19050 6d 70 58 2c 20 73 71 6c 69 74 65 33 45 78 70 72  mpX, sqlite3Expr
19060 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
19070 20 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29   pX, &regFree1))
19080 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
19090 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
190a0 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  );.        opCom
190b0 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b  pare.op = TK_EQ;
190c0 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
190d0 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d 70  re.pLeft = &temp
190e0 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74  X;.        pTest
190f0 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20   = &opCompare;. 
19100 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74         /* Ticket
19110 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31   b351d95f9cd5ef1
19120 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38  7e9d9dbae18f5ca8
19130 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20  611190001:.     
19140 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20     ** The value 
19150 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68  in regFree1 migh
19160 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69  t get SCopy-ed i
19170 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73  nto the file res
19180 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ult..        ** 
19190 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  So make sure tha
191a0 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72  t the regFree1 r
191b0 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72  egister is not r
191c0 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a  eused for other.
191d0 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f          ** purpo
191e0 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  ses and possibly
191f0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a   overwritten.  *
19200 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65  /.        regFre
19210 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  e1 = 0;.      }.
19220 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
19230 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29  <nExpr-1; i=i+2)
19240 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19250 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
19260 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
19270 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20  if( pX ){.      
19280 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 73      assert( pTes
19290 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
192a0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67    opCompare.pRig
192b0 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ht = aListelem[i
192c0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
192d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
192e0 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65    pTest = aListe
192f0 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
19300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19310 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74  nextCase = sqlit
19320 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19330 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
19340 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d  case( pTest->op=
19350 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
19360 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19370 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
19380 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65   pTest, nextCase
19390 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
193a0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ULL);.        te
193b0 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65  stcase( aListele
193c0 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  m[i+1].pExpr->op
193d0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
193e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
193f0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
19400 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
19410 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
19420 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19430 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
19440 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29  to, 0, endLabel)
19450 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19460 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
19470 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  arse, 1);.      
19480 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
19490 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
194a0 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
194b0 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72        if( (nExpr
194c0 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
194d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
194e0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
194f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19500 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
19510 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d  pEList->a[nExpr-
19520 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
19530 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19540 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
19550 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Parse, 1);.     
19560 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19580 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
19590 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
195a0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
195b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
195c0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
195d0 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  >0 .           |
195e0 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  | pParse->iCache
195f0 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76  Level==iCacheLev
19600 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  el );.      sqli
19610 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
19620 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  bel(v, endLabel)
19630 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19640 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
19650 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
19660 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
19670 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  SE: {.      asse
19680 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  rt( pExpr->affin
19690 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  ity==OE_Rollback
196a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
196b0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
196c0 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20  =OE_Abort.      
196d0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
196e0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c  ffinity==OE_Fail
196f0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
19700 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
19710 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20  OE_Ignore.      
19720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
19730 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
19740 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
19750 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
19760 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
19770 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49              "RAI
19780 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  SE() may only be
19790 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74   used within a t
197a0 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29  rigger-program")
197b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
197c0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
197d0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
197e0 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20  inity==OE_Abort 
197f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19800 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
19810 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
19820 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
19830 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
19840 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
19850 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
19860 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
19870 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
19880 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19890 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20  Op4(.           
198a0 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c   v, OP_Halt, SQL
198b0 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72  ITE_OK, OE_Ignor
198c0 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  e, 0, pExpr->u.z
198d0 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20  Token,0);.      
198e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
198f0 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
19900 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c  aint(pParse, SQL
19910 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
19920 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20  RIGGER,.        
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19940 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
19950 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e  inity, pExpr->u.
19960 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20  zToken, 0, 0);. 
19970 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72       }..      br
19980 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
19990 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  f.  }.  sqlite3R
199a0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
199b0 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
199c0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
199d0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
199e0 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65   regFree2);.  re
199f0 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f  turn inReg;.}../
19a00 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20  *.** Factor out 
19a10 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20  the code of the 
19a20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
19a30 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69   to initializati
19a40 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  on time..*/.void
19a50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19a60 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20  AtInit(.  Parse 
19a70 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
19a80 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
19a90 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
19aa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
19ab0 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20  ression to code 
19ac0 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e  when the VDBE in
19ad0 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69  itializes */.  i
19ae0 6e 74 20 72 65 67 44 65 73 74 2c 20 20 20 20 20  nt regDest,     
19af0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61   /* Store the va
19b00 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
19b10 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 75  ster */.  u8 reu
19b20 73 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20 54  sable       /* T
19b30 72 75 65 20 69 66 20 74 68 69 73 20 65 78 70 72  rue if this expr
19b40 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61 62  ession is reusab
19b50 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  le */.){.  ExprL
19b60 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  ist *p;.  assert
19b70 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
19b80 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d  pParse) );.  p =
19b90 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
19ba0 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 73  xpr;.  pExpr = s
19bb0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
19bc0 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
19bd0 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   0);.  p = sqlit
19be0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
19bf0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70  (pParse, p, pExp
19c00 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  r);.  if( p ){. 
19c10 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
19c20 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
19c30 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  = &p->a[p->nExpr
19c40 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  -1];.     pItem-
19c50 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
19c60 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20 20   = regDest;.    
19c70 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
19c80 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20 7d   = reusable;.  }
19c90 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  .  pParse->pCons
19ca0 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  tExpr = p;.}../*
19cb0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19cc0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  e to evaluate an
19cd0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
19ce0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
19cf0 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69  s.** into a regi
19d00 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ster.  Return th
19d10 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
19d20 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75  r where the resu
19d30 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  lts.** are store
19d40 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
19d50 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
19d60 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
19d70 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61   that can be dea
19d80 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65  llocated,.** the
19d90 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62  n write its numb
19da0 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20  er into *pReg.  
19db0 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
19dc0 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a  gister is not.**
19dd0 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68   a temporary, th
19de0 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20  en set *pReg to 
19df0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  zero..**.** If p
19e00 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61  Expr is a consta
19e10 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
19e20 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65  utine might gene
19e30 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64  rate this.** cod
19e40 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65  e to fill the re
19e50 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e  gister in the in
19e60 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63  itialization sec
19e70 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56  tion of the.** V
19e80 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20  DBE program, in 
19e90 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20  order to factor 
19ea0 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76  it out of the ev
19eb0 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a  aluation loop..*
19ec0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
19ed0 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20  rCodeTemp(Parse 
19ee0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
19ef0 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29  Expr, int *pReg)
19f00 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45  {.  int r2;.  pE
19f10 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
19f20 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78  rSkipCollate(pEx
19f30 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74  pr);.  if( Const
19f40 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
19f50 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  .   && pExpr->op
19f60 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20  !=TK_REGISTER.  
19f70 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
19f80 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
19f90 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20  (pExpr).  ){.   
19fa0 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 70   ExprList *p = p
19fb0 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
19fc0 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  r;.    int i;.  
19fd0 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20    *pReg  = 0;.  
19fe0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
19ff0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1a000 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1a010 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d      for(pItem=p-
1a020 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20  >a, i=p->nExpr; 
1a030 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d  i>0; pItem++, i-
1a040 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -){.        if( 
1a050 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
1a060 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
1a070 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
1a080 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20  pr,pExpr,-1)==0 
1a090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1a0a0 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f  urn pItem->u.iCo
1a0b0 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20  nstExprReg;.    
1a0c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a0d0 20 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b 70    }.    r2 = ++p
1a0e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1a0f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a100 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
1a110 45 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20 20  Expr, r2, 1);.  
1a120 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
1a130 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
1a140 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1a150 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1a160 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1a170 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
1a180 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31  ;.    if( r2==r1
1a190 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20   ){.      *pReg 
1a1a0 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = r1;.    }else{
1a1b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1a1c0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1a1d0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
1a1e0 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  *pReg = 0;.    }
1a1f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
1a200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1a210 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1a220 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
1a230 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
1a240 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
1a250 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
1a260 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
1a270 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
1a280 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
1a290 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
1a2a0 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  arget..*/.int sq
1a2b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
1a2c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1a2d0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
1a2e0 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52  rget){.  int inR
1a2f0 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  eg;..  assert( t
1a300 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
1a310 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
1a320 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26  );.  if( pExpr &
1a330 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  & pExpr->op==TK_
1a340 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
1a350 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a360 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
1a370 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d   OP_Copy, pExpr-
1a380 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29  >iTable, target)
1a390 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1a3a0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
1a3b0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1a3c0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1a3d0 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  et);.    assert(
1a3e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c   pParse->pVdbe |
1a3f0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
1a400 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1a410 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
1a420 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
1a430 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Vdbe ){.      sq
1a440 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a450 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1a460 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
1a470 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20  target);.    }. 
1a480 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61 72 67   }.  return targ
1a490 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  et;.}../*.** Gen
1a4a0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1a4b0 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69 76  evalutes the giv
1a4c0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
1a4d0 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c  d puts the resul
1a4e0 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  t.** in register
1a4f0 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   target..**.** A
1a500 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  lso make a copy 
1a510 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1a520 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  n results into a
1a530 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72  nother "cache" r
1a540 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d  egister.** and m
1a550 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73  odify the expres
1a560 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65  sion so that the
1a570 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
1a580 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74   evaluated,.** t
1a590 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
1a5a0 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65  opy of the cache
1a5b0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
1a5c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1a5d0 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73   used for expres
1a5e0 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  sions that are u
1a5f0 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  sed multiple .**
1a600 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72   times.  They ar
1a610 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  e evaluated once
1a620 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73   and the results
1a630 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1a640 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64  on.** are reused
1a650 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a660 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65  ExprCodeAndCache
1a670 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a680 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1a690 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
1a6a0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1a6b0 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67  dbe;.  int inReg
1a6c0 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  ;.  inReg = sqli
1a6d0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1a6e0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1a6f0 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61  t);.  assert( ta
1a700 72 67 65 74 3e 30 20 29 3b 0a 20 20 2f 2a 20 54  rget>0 );.  /* T
1a710 68 65 20 6f 6e 6c 79 20 70 6c 61 63 65 2c 20 6f  he only place, o
1a720 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 72  ther than this r
1a730 6f 75 74 69 6e 65 2c 20 77 68 65 72 65 20 65 78  outine, where ex
1a740 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65  pressions can be
1a750 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 74 65 64 20  .  ** converted 
1a760 74 6f 20 54 4b 5f 52 45 47 49 53 54 45 52 20 69  to TK_REGISTER i
1a770 73 20 69 6e 74 65 72 6e 61 6c 20 73 75 62 65 78  s internal subex
1a780 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 42 45 54  pressions in BET
1a790 57 45 45 4e 20 61 6e 64 0a 20 20 2a 2a 20 43 41  WEEN and.  ** CA
1a7a0 53 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4e  SE operators.  N
1a7b0 65 69 74 68 65 72 20 65 76 65 72 20 63 61 6c 6c  either ever call
1a7c0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  s this routine. 
1a7d0 20 41 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   And this routin
1a7e0 65 0a 20 20 2a 2a 20 69 73 20 6e 65 76 65 72 20  e.  ** is never 
1a7f0 63 61 6c 6c 65 64 20 74 77 69 63 65 20 6f 6e 20  called twice on 
1a800 74 68 65 20 73 61 6d 65 20 65 78 70 72 65 73 73  the same express
1a810 69 6f 6e 2e 20 20 48 65 6e 63 65 20 69 74 20 69  ion.  Hence it i
1a820 73 20 69 6d 70 6f 73 73 69 62 6c 65 0a 20 20 2a  s impossible.  *
1a830 2a 20 66 6f 72 20 74 68 65 20 69 6e 70 75 74 20  * for the input 
1a840 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1a850 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  to already be a 
1a860 72 65 67 69 73 74 65 72 2e 20 20 4e 65 76 65 72  register.  Never
1a870 74 68 65 6c 65 73 73 2c 0a 20 20 2a 2a 20 69 74  theless,.  ** it
1a880 20 73 65 65 6d 73 20 70 72 75 64 65 6e 74 20 74   seems prudent t
1a890 6f 20 6b 65 65 70 20 74 68 65 20 41 4c 57 41 59  o keep the ALWAY
1a8a0 53 28 29 20 69 6e 20 63 61 73 65 20 74 68 65 20  S() in case the 
1a8b0 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
1a8c0 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 77 69 74  .  ** change wit
1a8d0 68 20 66 75 74 75 72 65 20 6d 6f 64 69 66 69 63  h future modific
1a8e0 61 74 69 6f 6e 73 20 6f 72 20 65 6e 68 61 6e 63  ations or enhanc
1a8f0 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
1a900 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 6f   ALWAYS(pExpr->o
1a910 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20  p!=TK_REGISTER) 
1a920 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65  ){  .    int iMe
1a930 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b  m;.    iMem = ++
1a940 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1a950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a960 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
1a970 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  inReg, iMem);.  
1a980 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
1a990 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 20  (pExpr, iMem);. 
1a9a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65   }.  return inRe
1a9b0 67 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  g;.}..#if define
1a9c0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1a9d0 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a  TREE_EXPLAIN)./*
1a9e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
1a9f0 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78  uman-readable ex
1aa00 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20  planation of an 
1aa10 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
1aa20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1aa30 45 78 70 6c 61 69 6e 45 78 70 72 28 56 64 62 65  ExplainExpr(Vdbe
1aa40 20 2a 70 4f 75 74 2c 20 45 78 70 72 20 2a 70 45   *pOut, Expr *pE
1aa50 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 3b 20  xpr){.  int op; 
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa70 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
1aa80 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
1aa90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 69   const char *zBi
1aaa0 6e 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 42 69  nOp = 0;   /* Bi
1aab0 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f  nary operator */
1aac0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1aad0 55 6e 69 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20  UniOp = 0;   /* 
1aae0 55 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a  Unary operator *
1aaf0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
1ab00 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f   ){.    op = TK_
1ab10 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
1ab20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f     op = pExpr->o
1ab30 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  p;.  }.  switch(
1ab40 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1ab50 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b  TK_AGG_COLUMN: {
1ab60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ab70 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1ab80 2c 20 22 41 47 47 7b 25 64 3a 25 64 7d 22 2c 0a  , "AGG{%d:%d}",.
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1aba0 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
1abb0 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1abc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1abd0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
1abe0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
1abf0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29  Expr->iTable<0 )
1ac00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1ac10 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
1ac20 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b  hen coding check
1ac30 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
1ac40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ac50 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1ac60 74 2c 20 22 43 4f 4c 55 4d 4e 28 25 64 29 22 2c  t, "COLUMN(%d)",
1ac70 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
1ac80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ac90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1aca0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1acb0 2c 20 22 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20  , "{%d:%d}",.   
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acd0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1ace0 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  >iTable, pExpr->
1acf0 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1ad00 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1ad10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ad20 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
1ad30 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
1ad40 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
1ad50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ad60 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1ad70 28 70 4f 75 74 2c 20 22 25 64 22 2c 20 70 45 78  (pOut, "%d", pEx
1ad80 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20  pr->u.iValue);. 
1ad90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ada0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1adb0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1adc0 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %s", pExpr->u.zT
1add0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oken);.      }. 
1ade0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1adf0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1ae00 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1ae10 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
1ae20 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1ae30 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1ae40 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 22 2c 20  intf(pOut,"%s", 
1ae50 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1ae60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ae70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1ae80 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
1ae90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1aea0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1aeb0 74 2c 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75  t,"%Q", pExpr->u
1aec0 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1aed0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1aee0 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
1aef0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1af00 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1af10 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20  ,"NULL");.      
1af20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1af30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1af40 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
1af50 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
1af60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1af70 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1af80 74 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75  t,"%s", pExpr->u
1af90 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1afa0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1afb0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
1afc0 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
1afd0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1afe0 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 56 41 52  Printf(pOut,"VAR
1aff0 49 41 42 4c 45 28 25 73 2c 25 64 29 22 2c 0a 20  IABLE(%s,%d)",. 
1b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b010 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1b020 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78 70 72  >u.zToken, pExpr
1b030 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1b040 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b050 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
1b060 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
1b070 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1b080 66 28 70 4f 75 74 2c 22 52 45 47 49 53 54 45 52  f(pOut,"REGISTER
1b090 28 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 54  (%d)", pExpr->iT
1b0a0 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  able);.      bre
1b0b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1b0c0 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20  se TK_AS: {.    
1b0d0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b0e0 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1b0f0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
1b100 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1b110 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b120 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
1b130 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
1b140 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
1b150 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
1b160 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
1b170 6e 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  n) */.      cons
1b180 74 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 22  t char *zAff = "
1b190 75 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77 69 74  unk";.      swit
1b1a0 63 68 28 20 73 71 6c 69 74 65 33 41 66 66 69 6e  ch( sqlite3Affin
1b1b0 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75  ityType(pExpr->u
1b1c0 2e 7a 54 6f 6b 65 6e 2c 20 30 29 20 29 7b 0a 20  .zToken, 0) ){. 
1b1d0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1b1e0 54 45 5f 41 46 46 5f 54 45 58 54 3a 20 20 20 20  TE_AFF_TEXT:    
1b1f0 7a 41 66 66 20 3d 20 22 54 45 58 54 22 3b 20 20  zAff = "TEXT";  
1b200 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1b210 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
1b220 46 5f 4e 4f 4e 45 3a 20 20 20 20 7a 41 66 66 20  F_NONE:    zAff 
1b230 3d 20 22 4e 4f 4e 45 22 3b 20 20 20 20 20 62 72  = "NONE";     br
1b240 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
1b250 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  e SQLITE_AFF_NUM
1b260 45 52 49 43 3a 20 7a 41 66 66 20 3d 20 22 4e 55  ERIC: zAff = "NU
1b270 4d 45 52 49 43 22 3b 20 20 62 72 65 61 6b 3b 0a  MERIC";  break;.
1b280 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1b290 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a  ITE_AFF_INTEGER:
1b2a0 20 7a 41 66 66 20 3d 20 22 49 4e 54 45 47 45 52   zAff = "INTEGER
1b2b0 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
1b2c0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1b2d0 46 46 5f 52 45 41 4c 3a 20 20 20 20 7a 41 66 66  FF_REAL:    zAff
1b2e0 20 3d 20 22 52 45 41 4c 22 3b 20 20 20 20 20 62   = "REAL";     b
1b2f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1b300 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b310 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1b320 43 41 53 54 2d 25 73 28 22 2c 20 7a 41 66 66 29  CAST-%s(", zAff)
1b330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b340 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1b350 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1b360 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b370 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1b380 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65   ")");.      bre
1b390 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1b3a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1b3b0 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
1b3c0 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 42 69   TK_LT:      zBi
1b3d0 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20  nOp = "LT";     
1b3e0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1b3f0 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69 6e  TK_LE:      zBin
1b400 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 62  Op = "LE";     b
1b410 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b420 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_GT:      zBinO
1b430 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20 62 72  p = "GT";     br
1b440 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1b450 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _GE:      zBinOp
1b460 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62 72 65   = "GE";     bre
1b470 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1b480 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  NE:      zBinOp 
1b490 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72 65 61  = "NE";     brea
1b4a0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
1b4b0 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  Q:      zBinOp =
1b4c0 20 22 45 51 22 3b 20 20 20 20 20 62 72 65 61 6b   "EQ";     break
1b4d0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
1b4e0 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
1b4f0 22 49 53 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "IS";     break;
1b500 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1b510 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  OT:   zBinOp = "
1b520 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ISNOT";  break;.
1b530 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1b540 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41       zBinOp = "A
1b550 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ND";    break;. 
1b560 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20     case TK_OR:  
1b570 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4f 52      zBinOp = "OR
1b580 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1b590 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20    case TK_PLUS: 
1b5a0 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 44 44     zBinOp = "ADD
1b5b0 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1b5c0 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20   case TK_STAR:  
1b5d0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55 4c 22    zBinOp = "MUL"
1b5e0 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1b5f0 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20  case TK_MINUS:  
1b600 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42 22 3b   zBinOp = "SUB";
1b610 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1b620 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20  ase TK_REM:     
1b630 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22 3b 20  zBinOp = "REM"; 
1b640 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1b650 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a  se TK_BITAND:  z
1b660 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e 44 22  BinOp = "BITAND"
1b670 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
1b680 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 42  e TK_BITOR:   zB
1b690 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20  inOp = "BITOR"; 
1b6a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1b6b0 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 42 69   TK_SLASH:   zBi
1b6c0 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20  nOp = "DIV";    
1b6d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1b6e0 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69 6e  TK_LSHIFT:  zBin
1b6f0 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 62  Op = "LSHIFT"; b
1b700 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b710 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f  K_RSHIFT:  zBinO
1b720 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20 62 72  p = "RSHIFT"; br
1b730 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1b740 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e 4f 70  _CONCAT:  zBinOp
1b750 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62 72 65   = "CONCAT"; bre
1b760 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  ak;..    case TK
1b770 5f 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f 70  _UMINUS:  zUniOp
1b780 20 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62 72 65   = "UMINUS"; bre
1b790 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1b7a0 55 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70 20  UPLUS:   zUniOp 
1b7b0 3d 20 22 55 50 4c 55 53 22 3b 20 20 62 72 65 61  = "UPLUS";  brea
1b7c0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
1b7d0 49 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20 3d  ITNOT:  zUniOp =
1b7e0 20 22 42 49 54 4e 4f 54 22 3b 20 62 72 65 61 6b   "BITNOT"; break
1b7f0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
1b800 54 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d 20  T:     zUniOp = 
1b810 22 4e 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b  "NOT";    break;
1b820 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1b830 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22  ULL:  zUniOp = "
1b840 49 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a  ISNULL"; break;.
1b850 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1b860 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22 4e  ULL: zUniOp = "N
1b870 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a  OTNULL"; break;.
1b880 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1b890 4c 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  LATE: {.      sq
1b8a0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1b8b0 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c  (pOut, pExpr->pL
1b8c0 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
1b8d0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b8e0 28 70 4f 75 74 2c 22 2e 43 4f 4c 4c 41 54 45 28  (pOut,".COLLATE(
1b8f0 25 73 29 22 2c 70 45 78 70 72 2d 3e 75 2e 7a 54  %s)",pExpr->u.zT
1b900 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
1b910 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
1b920 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
1b930 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
1b940 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
1b950 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
1b960 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
1b970 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
1b980 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
1b990 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1b9a0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
1b9b0 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
1b9c0 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a       pFarg = 0;.
1b9d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b9e0 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78       pFarg = pEx
1b9f0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
1ba00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f     }.      if( o
1ba10 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
1ba20 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ON ){.        sq
1ba30 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1ba40 74 66 28 70 4f 75 74 2c 20 22 41 47 47 5f 46 55  tf(pOut, "AGG_FU
1ba50 4e 43 54 49 4f 4e 25 64 3a 25 73 28 22 2c 0a 20  NCTION%d:%s(",. 
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1ba80 72 2d 3e 6f 70 32 2c 20 70 45 78 70 72 2d 3e 75  r->op2, pExpr->u
1ba90 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1baa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1bab0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1bac0 6e 74 66 28 70 4f 75 74 2c 20 22 46 55 4e 43 54  ntf(pOut, "FUNCT
1bad0 49 4f 4e 3a 25 73 28 22 2c 20 70 45 78 70 72 2d  ION:%s(", pExpr-
1bae0 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1baf0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
1bb00 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  arg ){.        s
1bb10 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1bb20 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 46 61 72  rList(pOut, pFar
1bb30 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1bb40 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1bb50 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22  Printf(pOut, ")"
1bb60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1bb70 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1bb80 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1bb90 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
1bba0 58 49 53 54 53 3a 20 7b 0a 20 20 20 20 20 20 73  XISTS: {.      s
1bbb0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1bbc0 6e 74 66 28 70 4f 75 74 2c 20 22 45 58 49 53 54  ntf(pOut, "EXIST
1bbd0 53 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  S(");.      sqli
1bbe0 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
1bbf0 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e  (pOut, pExpr->x.
1bc00 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
1bc10 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1bc20 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a  intf(pOut,")");.
1bc30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bc40 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
1bc50 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73  ELECT: {.      s
1bc60 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1bc70 6e 74 66 28 70 4f 75 74 2c 20 22 28 22 29 3b 0a  ntf(pOut, "(");.
1bc80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bc90 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c  lainSelect(pOut,
1bca0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1bcb0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1bcc0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1bcd0 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20  Out, ")");.     
1bce0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1bcf0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
1bd00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bd10 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1bd20 20 22 49 4e 28 22 29 3b 0a 20 20 20 20 20 20 73   "IN(");.      s
1bd30 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1bd40 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
1bd50 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
1bd60 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1bd70 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  f(pOut, ",");.  
1bd80 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1bd90 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1bda0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1bdb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1bdc0 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75  xplainSelect(pOu
1bdd0 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
1bde0 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ect);.      }els
1bdf0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1be00 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
1be10 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78  t(pOut, pExpr->x
1be20 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  .pList);.      }
1be30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1be40 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1be50 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72  , ")");.      br
1be60 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1be70 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1be80 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
1be90 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    /*.    **    x
1bea0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
1beb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1bec0 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
1bed0 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t to.    **.    
1bee0 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
1bef0 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <=z.    **.    *
1bf00 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * X is stored in
1bf10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
1bf20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65     ** Y is store
1bf30 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
1bf40 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20  t->a[0].pExpr.. 
1bf50 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65     ** Z is store
1bf60 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
1bf70 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20  t->a[1].pExpr.. 
1bf80 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
1bf90 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
1bfa0 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45     Expr *pX = pE
1bfb0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
1bfc0 20 20 45 78 70 72 20 2a 70 59 20 3d 20 70 45 78    Expr *pY = pEx
1bfd0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
1bfe0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45  ].pExpr;.      E
1bff0 78 70 72 20 2a 70 5a 20 3d 20 70 45 78 70 72 2d  xpr *pZ = pExpr-
1c000 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
1c010 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
1c020 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1c030 28 70 4f 75 74 2c 20 22 42 45 54 57 45 45 4e 28  (pOut, "BETWEEN(
1c040 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1c050 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1c060 74 2c 20 70 58 29 3b 0a 20 20 20 20 20 20 73 71  t, pX);.      sq
1c070 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1c080 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20  tf(pOut, ",");. 
1c090 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c0a0 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 59  ainExpr(pOut, pY
1c0b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c0c0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1c0d0 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
1c0e0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1c0f0 70 72 28 70 4f 75 74 2c 20 70 5a 29 3b 0a 20 20  pr(pOut, pZ);.  
1c100 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c110 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1c120 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  )");.      break
1c130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c140 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20   TK_TRIGGER: {. 
1c150 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
1c160 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47  pcode is TK_TRIG
1c170 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78  GER, then the ex
1c180 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65  pression is a re
1c190 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a  ference.      **
1c1a0 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   to a column in 
1c1b0 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64  the new.* or old
1c1c0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73  .* pseudo-tables
1c1d0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20   available to.  
1c1e0 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70      ** trigger p
1c1f0 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73  rograms. In this
1c200 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c   case Expr.iTabl
1c210 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f  e is set to 1 fo
1c220 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  r the.      ** n
1c230 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
1c240 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20  e, or 0 for the 
1c250 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
1c260 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  le. Expr.iColumn
1c270 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
1c280 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f   to the column o
1c290 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  f the pseudo-tab
1c2a0 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74  le to read, or t
1c2b0 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a  o -1 to.      **
1c2c0 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   read the rowid 
1c2d0 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  field..      */.
1c2e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c2f0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c300 20 22 25 73 28 25 64 29 22 2c 20 0a 20 20 20 20   "%s(%d)", .    
1c310 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
1c320 62 6c 65 20 3f 20 22 4e 45 57 22 20 3a 20 22 4f  ble ? "NEW" : "O
1c330 4c 44 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  LD", pExpr->iCol
1c340 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  umn);.      brea
1c350 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1c360 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20  e TK_CASE: {.   
1c370 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c380 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43  nPrintf(pOut, "C
1c390 41 53 45 28 22 29 3b 0a 20 20 20 20 20 20 73 71  ASE(");.      sq
1c3a0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1c3b0 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c  (pOut, pExpr->pL
1c3c0 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
1c3d0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1c3e0 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  (pOut, ",");.   
1c3f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c400 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20  nExprList(pOut, 
1c410 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
1c420 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c430 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1c440 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
1c450 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53      case TK_RAIS
1c460 45 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  E: {.      const
1c470 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 22   char *zType = "
1c480 75 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77 69 74  unk";.      swit
1c490 63 68 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  ch( pExpr->affin
1c4a0 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ity ){.        c
1c4b0 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a  ase OE_Rollback:
1c4c0 20 20 20 7a 54 79 70 65 20 3d 20 22 72 6f 6c 6c     zType = "roll
1c4d0 62 61 63 6b 22 3b 20 20 62 72 65 61 6b 3b 0a 20  back";  break;. 
1c4e0 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 41         case OE_A
1c4f0 62 6f 72 74 3a 20 20 20 20 20 20 7a 54 79 70 65  bort:      zType
1c500 20 3d 20 22 61 62 6f 72 74 22 3b 20 20 20 20 20   = "abort";     
1c510 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
1c520 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20  ase OE_Fail:    
1c530 20 20 20 7a 54 79 70 65 20 3d 20 22 66 61 69 6c     zType = "fail
1c540 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
1c550 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49         case OE_I
1c560 67 6e 6f 72 65 3a 20 20 20 20 20 7a 54 79 70 65  gnore:     zType
1c570 20 3d 20 22 69 67 6e 6f 72 65 22 3b 20 20 20 20   = "ignore";    
1c580 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1c590 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c5a0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1c5b0 22 52 41 49 53 45 2d 25 73 28 25 73 29 22 2c 20  "RAISE-%s(%s)", 
1c5c0 7a 54 79 70 65 2c 20 70 45 78 70 72 2d 3e 75 2e  zType, pExpr->u.
1c5d0 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
1c5e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1c5f0 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42 69  if.  }.  if( zBi
1c600 6e 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nOp ){.    sqlit
1c610 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1c620 70 4f 75 74 2c 22 25 73 28 22 2c 20 7a 42 69 6e  pOut,"%s(", zBin
1c630 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
1c640 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1c650 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1c660 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1c670 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1c680 2c 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ,");.    sqlite3
1c690 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1c6a0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
1c6b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1c6c0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c6d0 22 29 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ")");.  }else if
1c6e0 28 20 7a 55 6e 69 4f 70 20 29 7b 0a 20 20 20 20  ( zUniOp ){.    
1c6f0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1c700 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 28 22 2c  intf(pOut,"%s(",
1c710 20 7a 55 6e 69 4f 70 29 3b 0a 20 20 20 20 73 71   zUniOp);.    sq
1c720 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1c730 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c  (pOut, pExpr->pL
1c740 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
1c750 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1c760 4f 75 74 2c 22 29 22 29 3b 0a 20 20 7d 0a 7d 0a  Out,")");.  }.}.
1c770 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1c780 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1c790 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f  TREE_EXPLAIN) */
1c7a0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1c7b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
1c7c0 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20  _EXPLAIN)./*.** 
1c7d0 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e  Generate a human
1c7e0 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e  -readable explan
1c7f0 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72  ation of an expr
1c800 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
1c810 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c  void sqlite3Expl
1c820 61 69 6e 45 78 70 72 4c 69 73 74 28 56 64 62 65  ainExprList(Vdbe
1c830 20 2a 70 4f 75 74 2c 20 45 78 70 72 4c 69 73 74   *pOut, ExprList
1c840 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
1c850 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1c860 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  0 || pList->nExp
1c870 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
1c880 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1c890 28 70 4f 75 74 2c 20 22 28 65 6d 70 74 79 2d 6c  (pOut, "(empty-l
1c8a0 69 73 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75  ist)");.    retu
1c8b0 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
1c8c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  pList->nExpr==1 
1c8d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1c8e0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1c8f0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
1c900 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1c910 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1c920 75 73 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 66  ush(pOut);.    f
1c930 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1c940 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1c950 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c960 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1c970 69 74 65 6d 5b 25 64 5d 20 3d 20 22 2c 20 69 29  item[%d] = ", i)
1c980 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1c990 78 70 6c 61 69 6e 50 75 73 68 28 70 4f 75 74 29  xplainPush(pOut)
1c9a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1c9b0 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1c9c0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1c9d0 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
1c9e0 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 4f 75  e3ExplainPop(pOu
1c9f0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  t);.      if( pL
1ca00 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1ca10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ca20 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1ca30 70 4f 75 74 2c 20 22 20 41 53 20 25 73 22 2c 20  pOut, " AS %s", 
1ca40 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1ca50 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1ca60 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
1ca70 5d 2e 62 53 70 61 6e 49 73 54 61 62 20 29 7b 0a  ].bSpanIsTab ){.
1ca80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ca90 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1caa0 74 2c 20 22 20 28 25 73 29 22 2c 20 70 4c 69 73  t, " (%s)", pLis
1cab0 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
1cac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1cad0 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ( i<pList->nExpr
1cae0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  -1 ){.        sq
1caf0 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
1cb00 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Out);.      }.  
1cb10 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
1cb20 78 70 6c 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b  xplainPop(pOut);
1cb30 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
1cb40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
1cb50 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1cb60 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
1cb70 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
1cb80 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
1cb90 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
1cba0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
1cbb0 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
1cbc0 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
1cbd0 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
1cbe0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1cbf0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1cc00 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a  ts evaluated..**
1cc10 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
1cc20 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65  CEL_DUP flag pre
1cc30 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65  vents the argume
1cc40 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  nts from being.*
1cc50 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f  * filled using O
1cc60 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70  P_SCopy.  OP_Cop
1cc70 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69  y must be used i
1cc80 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstead..**.** Th
1cc90 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  e SQLITE_ECEL_FA
1cca0 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c  CTOR argument al
1ccb0 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72  lows constant ar
1ccc0 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a  guments to be.**
1ccd0 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e   factored out in
1cce0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
1ccf0 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  n code..*/.int s
1cd00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
1cd10 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
1cd20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
1cd30 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1cd40 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1cd50 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65  List,   /* The e
1cd60 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
1cd70 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1cd80 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20  int target,     
1cd90 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
1cda0 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a  rite results */.
1cdb0 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20 20    u8 flags      
1cdc0 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45       /* SQLITE_E
1cdd0 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29  CEL_* flags */.)
1cde0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
1cdf0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1ce00 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 75  .  int i, n;.  u
1ce10 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67  8 copyOp = (flag
1ce20 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
1ce30 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a  DUP) ? OP_Copy :
1ce40 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 61 73 73   OP_SCopy;.  ass
1ce50 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
1ce60 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1ce70 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
1ce80 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
1ce90 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67  0 );  /* Never g
1cea0 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68  ets this far oth
1ceb0 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20  erwise */.  n = 
1cec0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
1ced0 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72  if( !ConstFactor
1cee0 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61  Ok(pParse) ) fla
1cef0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43  gs &= ~SQLITE_EC
1cf00 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72  EL_FACTOR;.  for
1cf10 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
1cf20 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20   i=0; i<n; i++, 
1cf30 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pItem++){.    Ex
1cf40 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65  pr *pExpr = pIte
1cf50 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  m->pExpr;.    if
1cf60 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
1cf70 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d  E_ECEL_FACTOR)!=
1cf80 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  0 && sqlite3Expr
1cf90 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
1cfa0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1cfb0 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
1cfc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1cfd0 74 61 72 67 65 74 2b 69 2c 20 30 29 3b 0a 20 20  target+i, 0);.  
1cfe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1cff0 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  nt inReg = sqlit
1d000 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1d010 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1d020 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
1d030 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
1d040 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20  et+i ){.        
1d050 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
1d060 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70       Vdbe *v = p
1d070 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1d080 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70        if( copyOp
1d090 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
1d0a0 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74     && (pOp=sqlit
1d0b0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d  e3VdbeGetOp(v, -
1d0c0 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  1))->opcode==OP_
1d0d0 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26  Copy.         &&
1d0e0 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33   pOp->p1+pOp->p3
1d0f0 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20  +1==inReg.      
1d100 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f     && pOp->p2+pO
1d110 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b  p->p3+1==target+
1d120 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  i.        ){.   
1d130 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b         pOp->p3++
1d140 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1d150 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1d160 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d170 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74  copyOp, inReg, t
1d180 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
1d190 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1d1a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
1d1b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1d1c0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42  ate code for a B
1d1d0 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e  ETWEEN operator.
1d1e0 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57  .**.**    x BETW
1d1f0 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a  EEN y AND z.**.*
1d200 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65  * The above is e
1d210 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a  quivalent to .**
1d220 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20  .**    x>=y AND 
1d230 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20  x<=z.**.** Code 
1d240 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69  it as such, taki
1d250 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68  ng care to do th
1d260 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72  e common subexpr
1d270 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 65 6d 65 6e  ession.** elemen
1d280 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a  tation of x..*/.
1d290 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
1d2a0 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50  CodeBetween(.  P
1d2b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1d2c0 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
1d2d0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
1d2e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
1d2f0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
1d300 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78  * The BETWEEN ex
1d310 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
1d320 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
1d330 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
1d340 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
1d350 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49  n */.  int jumpI
1d360 66 54 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b 65  fTrue,   /* Take
1d370 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
1d380 20 42 45 54 57 45 45 4e 20 69 73 20 74 72 75 65   BETWEEN is true
1d390 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
1d3a0 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20  Null    /* Take 
1d3b0 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
1d3c0 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20  BETWEEN is NULL 
1d3d0 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70  */.){.  Expr exp
1d3e0 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65  rAnd;     /* The
1d3f0 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e   AND operator in
1d400 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20    x>=y AND x<=z 
1d410 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c   */.  Expr compL
1d420 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20  eft;    /* The  
1d430 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x>=y  term */.  
1d440 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20  Expr compRight; 
1d450 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20    /* The  x<=z  
1d460 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65  term */.  Expr e
1d470 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54  xprX;       /* T
1d480 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73  he  x  subexpres
1d490 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sion */.  int re
1d4a0 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54  gFree1 = 0; /* T
1d4b0 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
1d4c0 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  ister */..  asse
1d4d0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1d4e0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1d4f0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65  IsSelect) );.  e
1d500 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70  xprX = *pExpr->p
1d510 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e  Left;.  exprAnd.
1d520 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65  op = TK_AND;.  e
1d530 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26  xprAnd.pLeft = &
1d540 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  compLeft;.  expr
1d550 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f  And.pRight = &co
1d560 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c  mpRight;.  compL
1d570 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a  eft.op = TK_GE;.
1d580 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74    compLeft.pLeft
1d590 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d   = &exprX;.  com
1d5a0 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70  pLeft.pRight = p
1d5b0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
1d5c0 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d  [0].pExpr;.  com
1d5d0 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c  pRight.op = TK_L
1d5e0 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  E;.  compRight.p
1d5f0 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
1d600 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68   compRight.pRigh
1d610 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
1d620 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
1d630 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
1d640 28 26 65 78 70 72 58 2c 20 73 71 6c 69 74 65 33  (&exprX, sqlite3
1d650 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1d660 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65  rse, &exprX, &re
1d670 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20  gFree1));.  if( 
1d680 6a 75 6d 70 49 66 54 72 75 65 20 29 7b 0a 20 20  jumpIfTrue ){.  
1d690 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1d6a0 72 75 65 28 70 50 61 72 73 65 2c 20 26 65 78 70  rue(pParse, &exp
1d6b0 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70  rAnd, dest, jump
1d6c0 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  IfNull);.  }else
1d6d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1d6e0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1d6f0 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
1d700 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1d710 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
1d720 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1d730 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20  , regFree1);..  
1d740 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61  /* Ensure adequa
1d750 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65  te test coverage
1d760 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
1d770 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1d780 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1d790 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
1d7a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1d7b0 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
1d7c0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1d7d0 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
1d7e0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d7f0 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1d800 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1d810 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
1d820 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1d830 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
1d840 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1d850 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
1d860 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1d870 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1d880 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
1d890 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1d8a0 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
1d8b0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
1d8c0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
1d8d0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1d8e0 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1d8f0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1d900 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1d910 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1d920 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
1d930 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
1d940 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f  Free1!=0 );.}../
1d950 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1d960 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
1d970 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
1d980 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
1d990 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
1d9a0 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
1d9b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1d9c0 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
1d9d0 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
1d9e0 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
1d9f0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1da00 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
1da10 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
1da20 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
1da30 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
1da40 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
1da50 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
1da60 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
1da70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53  IfNull flag is S
1da80 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1da90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64  ..**.** This cod
1daa0 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
1dab0 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61   fact that certa
1dac0 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  in token values 
1dad0 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61  (ex: TK_EQ).** a
1dae0 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f  re the same as o
1daf0 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78  pcode values (ex
1db00 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d  : OP_Eq) that im
1db10 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72  plement the corr
1db20 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65  esponding.** ope
1db30 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c  ration.  Special
1db40 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62   comments in vdb
1db50 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70  e.c and the mkop
1db60 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
1db70 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20   in.** the make 
1db80 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68  process cause th
1db90 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c  ese values to al
1dba0 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20  ign.  Assert()s 
1dbb0 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62  in the code.** b
1dbc0 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74  elow verify that
1dbd0 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65   the numbers are
1dbe0 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74   aligned correct
1dbf0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
1dc00 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61  te3ExprIfTrue(Pa
1dc10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1dc20 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
1dc30 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
1dc40 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
1dc50 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1dc60 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
1dc70 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
1dc80 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
1dc90 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
1dca0 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
1dcb0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
1dcc0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
1dcd0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1dce0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
1dcf0 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b  0) )     return;
1dd00 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f    /* Existence o
1dd10 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
1dd20 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
1dd30 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
1dd40 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
1dd50 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  No way this can 
1dd60 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d  happen */.  op =
1dd70 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
1dd80 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
1dd90 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
1dda0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
1ddb0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1ddc0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
1ddd0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1dde0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1ddf0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1de00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1de10 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
1de20 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
1de30 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
1de40 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1de50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1de60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1de70 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
1de80 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
1de90 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1dea0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1deb0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1dec0 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d2);.      sqlit
1ded0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1dee0 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Parse, 1);.     
1def0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1df00 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
1df10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1df20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1df30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1df40 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1df50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1df60 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1df70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1df80 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1df90 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1dfa0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1dfb0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1dfc0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1dfd0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1dfe0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1dff0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
1e000 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e010 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1e020 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1e030 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1e040 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1e050 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1e060 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e070 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1e080 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1e090 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1e0a0 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1e0b0 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1e0c0 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1e0d0 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1e0e0 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1e0f0 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1e100 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
1e110 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
1e120 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
1e130 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
1e140 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
1e150 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
1e160 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
1e170 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e180 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
1e190 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e1a0 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
1e1b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e1c0 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
1e1d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e1e0 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
1e1f0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1e200 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
1e210 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
1e220 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1e230 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
1e240 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e250 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
1e260 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1e270 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1e280 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1e290 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e2a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e2b0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1e2c0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1e2d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e2e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1e2f0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1e300 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1e310 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1e320 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1e330 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1e350 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
1e360 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1e370 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1e380 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1e390 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1e3a0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1e3b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e3c0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1e3d0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
1e3e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e3f0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1e400 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e410 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
1e420 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1e430 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e440 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e450 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1e460 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1e470 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e480 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1e490 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1e4a0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
1e4b0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
1e4c0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f   TK_NE;.      co
1e4d0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1e4e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1e4f0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1e500 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1e510 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1e520 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  t, SQLITE_NULLEQ
1e530 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e540 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1e550 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e560 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1e570 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e580 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e590 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1e5a0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1e5b0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e5c0 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
1e5d0 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
1e5e0 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
1e5f0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
1e600 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1e610 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
1e620 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e630 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
1e640 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1e650 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e660 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e670 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1e680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e690 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
1e6a0 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
1e6b0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1e6c0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1e6d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e6e0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
1e6f0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1e700 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1e710 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
1e720 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
1e730 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1e740 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  1, jumpIfNull);.
1e750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e760 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1e770 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1e780 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
1e790 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
1e7a0 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
1e7b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1e7c0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
1e7d0 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
1e7e0 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
1e7f0 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
1e800 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e810 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
1e820 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
1e830 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
1e840 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e850 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1e860 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
1e870 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1e880 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
1e890 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62  fFalse);.      b
1e8a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1e8b0 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
1e8c0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72  {.      if( expr
1e8d0 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
1e8e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
1e8f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e900 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
1e910 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
1e920 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
1e930 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
1e940 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20         /* No-op 
1e950 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
1e960 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1e970 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e980 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1e990 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1e9a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e9b0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
1e9c0 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
1e9d0 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
1e9e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1e9f0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1ea00 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1ea10 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1ea20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1ea30 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
1ea40 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1ea50 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1ea60 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
1ea70 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1ea80 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
1ea90 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
1eaa0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1eab0 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
1eac0 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
1ead0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
1eae0 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
1eaf0 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
1eb00 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
1eb10 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
1eb20 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
1eb30 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
1eb40 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
1eb50 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
1eb60 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
1eb70 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
1eb80 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
1eb90 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
1eba0 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
1ebb0 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
1ebc0 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
1ebd0 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
1ebe0 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
1ebf0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1ec00 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
1ec10 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1ec20 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
1ec30 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
1ec40 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1ec50 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1ec60 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
1ec70 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
1ec80 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
1ec90 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
1eca0 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
1ecb0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
1ecc0 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
1ecd0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
1ece0 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
1ecf0 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74  return; /* Exist
1ed00 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
1ed10 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
1ed20 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
1ed30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20   )    return;.. 
1ed40 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
1ed50 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
1ed60 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
1ed70 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
1ed80 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
1ed90 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
1eda0 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
1edb0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
1edc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
1edd0 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
1ede0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
1edf0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
1ee00 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
1ee10 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
1ee20 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
1ee30 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
1ee40 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1ee60 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
1ee70 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
1ee80 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
1ee90 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
1eea0 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
1eeb0 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
1eec0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
1eed0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
1eee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1eef0 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
1ef00 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
1ef10 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
1ef20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
1ef30 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
1ef40 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
1ef50 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
1ef60 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
1ef70 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
1ef80 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
1ef90 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
1efa0 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
1efb0 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
1efc0 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
1efd0 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
1efe0 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
1eff0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
1f000 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
1f010 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
1f020 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
1f030 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
1f040 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
1f050 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
1f060 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
1f070 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1f080 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
1f090 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
1f0a0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f0b0 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
1f0c0 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
1f0d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1f0e0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
1f0f0 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
1f100 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1f110 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
1f120 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
1f130 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1f140 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
1f150 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1f160 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
1f170 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
1f180 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f190 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
1f1a0 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
1f1b0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1f1c0 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
1f1d0 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
1f1e0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
1f1f0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
1f200 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f210 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f230 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1f240 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f250 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1f260 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f270 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1f280 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1f290 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1f2a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f2b0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
1f2c0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1f2d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f2e0 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
1f2f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f300 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
1f310 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
1f320 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
1f330 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1f340 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f350 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f360 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1f370 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1f380 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
1f390 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
1f3a0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1f3b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f3c0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1f3d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f3e0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1f3f0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1f400 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1f410 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1f420 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1f430 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
1f440 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f450 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
1f460 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f470 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1f480 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
1f490 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1f4a0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1f4b0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1f4c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f4d0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1f4e0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1f4f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f500 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1f510 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1f520 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1f530 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1f540 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1f550 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1f560 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f570 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20  p==TK_LT );.    
1f580 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f590 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_LE );.      t
1f5a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f5b0 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
1f5c0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20  case( op==TK_GE 
1f5d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f5e0 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a  e( op==TK_EQ );.
1f5f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f600 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20  op==TK_NE );.   
1f610 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f620 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f630 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f640 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f650 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f660 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1f670 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1f680 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f690 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1f6a0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1f6b0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1f6c0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1f6d0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1f6e0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1f700 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
1f710 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74  IfNull);.      t
1f720 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f730 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1f740 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1f750 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1f760 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f770 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1f780 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
1f790 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f7a0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1f7b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f7c0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1f7d0 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
1f7e0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f7f0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f800 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f810 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f820 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1f830 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f840 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f850 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1f860 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e     op = (pExpr->
1f870 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
1f880 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20  NE : TK_EQ;.    
1f890 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1f8a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1f8b0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1f8c0 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1f8d0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1f8e0 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55   dest, SQLITE_NU
1f8f0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
1f900 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f910 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1f920 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1f930 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1f940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f950 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1f960 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1f970 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1f980 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
1f990 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1f9a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
1f9b0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
1f9c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f9d0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1f9e0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1f9f0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
1fa00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1fa10 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
1fa20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fa30 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1fa40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fa50 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
1fa60 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
1fa70 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1fa80 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1fa90 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
1faa0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1fab0 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66 4e  dest, 0, jumpIfN
1fac0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1fad0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1fae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1faf0 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
1fb00 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
1fb10 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a  ( jumpIfNull ){.
1fb20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1fb30 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
1fb40 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
1fb50 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
1fb60 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
1fb70 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
1fb80 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1fb90 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
1fba0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
1fbb0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1fbc0 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  st, destIfNull);
1fbd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fbe0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1fbf0 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
1fc00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1fc10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1fc20 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
1fc30 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72  {.      if( expr
1fc40 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70  AlwaysFalse(pExp
1fc50 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
1fc60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1fc70 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
1fc80 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
1fc90 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
1fca0 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
1fcb0 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20         /* no-op 
1fcc0 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
1fcd0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1fce0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1fcf0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1fd00 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1fd10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1fd20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
1fd30 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
1fd40 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
1fd50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1fd60 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1fd70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fd80 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1fd90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1fda0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1fdb0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1fdc0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1fdd0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
1fde0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1fdf0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1fe00 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ee2);.}../*.** D
1fe10 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
1fe20 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
1fe30 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
1fe40 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
1fe50 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
1fe60 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20   are completely 
1fe70 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75  identical.  Retu
1fe80 72 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66  rn 1 if they dif
1fe90 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61  fer only.** by a
1fea0 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
1feb0 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76  r at the top lev
1fec0 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66  el.  Return 2 if
1fed0 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
1fee0 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20  rences.** other 
1fef0 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76  than the top-lev
1ff00 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  el COLLATE opera
1ff10 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  tor..**.** If an
1ff20 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20  y subelement of 
1ff30 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62  pB has Expr.iTab
1ff40 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74  le==(-1) then it
1ff50 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
1ff60 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  o compare equal 
1ff70 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  to an equivalent
1ff80 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77   element in pA w
1ff90 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  ith Expr.iTable=
1ffa0 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  =iTab..**.** The
1ffb0 20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62   pA side might b
1ffc0 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53  e using TK_REGIS
1ffd0 54 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73  TER.  If that is
1ffe0 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42   the case and pB
1fff0 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67   is.** not using
20000 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74   TK_REGISTER but
20010 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71   is otherwise eq
20020 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73  uivalent, then s
20030 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  till return 0..*
20040 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74  *.** Sometimes t
20050 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
20060 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69   return 2 even i
20070 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
20080 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
20090 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
200a0 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
200b0 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
200c0 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
200d0 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
200e0 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62  turn 2 just to b
200f0 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74  e safe.  So if t
20100 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
20110 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79  eturns 2, then y
20120 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  ou do not really
20130 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69   know for certai
20140 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  n if the two.** 
20150 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
20160 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69  the same.  But i
20170 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72  f you get a 0 or
20180 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20   1 return, then 
20190 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75  you.** can be su
201a0 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
201b0 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
201c0 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20    In the places 
201d0 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  where.** this ro
201e0 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69  utine is used, i
201f0 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20  t does not hurt 
20200 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20  to get an extra 
20210 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74  2 - that.** just
20220 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
20230 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73   some slightly s
20240 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74  lower code.  But
20250 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e   returning.** an
20260 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20   incorrect 0 or 
20270 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  1 could lead to 
20280 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a  a malfunction..*
20290 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
202a0 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
202b0 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
202c0 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f   iTab){.  u32 co
202d0 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69  mbinedFlags;.  i
202e0 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
202f0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
20300 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a  pB==pA ? 0 : 2;.
20310 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c    }.  combinedFl
20320 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20  ags = pA->flags 
20330 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  | pB->flags;.  i
20340 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
20350 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
20360 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66  {.    if( (pA->f
20370 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45  lags&pB->flags&E
20380 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26  P_IntValue)!=0 &
20390 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d  & pA->u.iValue==
203a0 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a  pB->u.iValue ){.
203b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
203c0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
203d0 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
203e0 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a  ->op!=pB->op ){.
203f0 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d      if( pA->op==
20400 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
20410 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
20420 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20  (pA->pLeft, pB, 
20430 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
20440 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
20450 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d  .    if( pB->op=
20460 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73  =TK_COLLATE && s
20470 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
20480 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  e(pA, pB->pLeft,
20490 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20   iTab)<2 ){.    
204a0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
204b0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
204c0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
204d0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41  !=TK_COLUMN && A
204e0 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54 4b  LWAYS(pA->op!=TK
204f0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20  _AGG_COLUMN) && 
20500 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a  pA->u.zToken ){.
20510 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
20520 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
20530 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a  u.zToken)!=0 ){.
20540 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d        return pA-
20550 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
20560 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20  ? 1 : 2;.    }. 
20570 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c   }.  if( (pA->fl
20580 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
20590 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26  t)!=(pB->flags &
205a0 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20   EP_Distinct) ) 
205b0 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
205c0 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64  ALWAYS((combined
205d0 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e  Flags & EP_Token
205e0 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20  Only)==0) ){.   
205f0 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
20600 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
20610 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  t ) return 2;.  
20620 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
20630 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
20640 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69  ft, pB->pLeft, i
20650 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
20660 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
20670 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
20680 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67  pRight, pB->pRig
20690 68 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  ht, iTab) ) retu
206a0 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 2;.    if( sq
206b0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
206c0 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74  pare(pA->x.pList
206d0 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  , pB->x.pList, i
206e0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
206f0 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28  .    if( ALWAYS(
20700 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
20710 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29   EP_Reduced)==0)
20720 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
20730 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
20740 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
20750 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  2;.      if( pA-
20760 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
20770 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28  ble .       && (
20780 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62  pA->iTable!=iTab
20790 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54   || NEVER(pB->iT
207a0 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75  able>=0)) ) retu
207b0 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
207c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
207d0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
207e0 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
207f0 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
20800 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
20810 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a  al and .** non-z
20820 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66  ero if they diff
20830 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
20840 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
20850 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
20860 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
20870 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
20880 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
20890 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
208a0 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
208b0 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
208c0 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
208d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
208e0 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
208f0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
20900 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
20910 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
20920 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
20930 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
20940 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
20950 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
20960 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
20970 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
20980 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
20990 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
209a0 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
209b0 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
209c0 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
209d0 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
209e0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
209f0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
20a00 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
20a10 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
20a20 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
20a30 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
20a40 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
20a50 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
20a60 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
20a70 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
20a80 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
20a90 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74  0 && pB==0 ) ret
20aa0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d  urn 0;.  if( pA=
20ab0 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65  =0 || pB==0 ) re
20ac0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41  turn 1;.  if( pA
20ad0 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78  ->nExpr!=pB->nEx
20ae0 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pr ) return 1;. 
20af0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
20b00 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
20b10 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
20b20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pA->a[i].pExpr;.
20b30 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
20b40 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pB->a[i].pExp
20b50 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61  r;.    if( pA->a
20b60 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70  [i].sortOrder!=p
20b70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  B->a[i].sortOrde
20b80 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
20b90 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
20ba0 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c  rCompare(pExprA,
20bb0 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20 29   pExprB, iTab) )
20bc0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
20bd0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
20be0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
20bf0 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20  if we can prove 
20c00 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77  the pE2 will alw
20c10 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70  ays be true if p
20c20 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20  E1 is.** true.  
20c30 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
20c40 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65  we cannot comple
20c50 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20  te the proof or 
20c60 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20  if pE2 might.** 
20c70 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70  be false.  Examp
20c80 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  les:.**.**     p
20c90 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70  E1: x==5       p
20ca0 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
20cb0 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
20cc0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e  e.**     pE1: x>
20cd0 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  0        pE2: x=
20ce0 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
20cf0 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
20d00 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20      pE1: x=21   
20d10 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52      pE2: x=21 OR
20d20 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74   y=43     Result
20d30 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
20d40 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45  1: x!=123     pE
20d50 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
20d60 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
20d70 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
20d80 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49  ?1      pE2: x I
20d90 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
20da0 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
20db0 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c    pE1: x IS NULL
20dc0 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
20dd0 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
20de0 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31  false.**     pE1
20df0 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32  : x IS ?2    pE2
20e00 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
20e10 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65     Reuslt: false
20e20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70  .**.** When comp
20e30 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20  aring TK_COLUMN 
20e40 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45  nodes between pE
20e50 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45  1 and pE2, if pE
20e60 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54  2 has.** Expr.iT
20e70 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75  able<0 then assu
20e80 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65  me a table numbe
20e90 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e  r given by iTab.
20ea0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64  .**.** When in d
20eb0 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c  oubt, return fal
20ec0 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74  se.  Returning t
20ed0 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61  rue might give a
20ee0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
20ef0 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65  improvement.  Re
20f00 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69  turning false mi
20f10 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66  ght cause a perf
20f20 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
20f30 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c  n, but.** it wil
20f40 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68  l always give th
20f50 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
20f60 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c   and is hence al
20f70 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e  ways safe..*/.in
20f80 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  t sqlite3ExprImp
20f90 6c 69 65 73 45 78 70 72 28 45 78 70 72 20 2a 70  liesExpr(Expr *p
20fa0 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69  E1, Expr *pE2, i
20fb0 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20  nt iTab){.  if( 
20fc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
20fd0 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61  re(pE1, pE2, iTa
20fe0 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  b)==0 ){.    ret
20ff0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
21000 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a   pE2->op==TK_OR.
21010 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78     && (sqlite3Ex
21020 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
21030 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  1, pE2->pLeft, i
21040 54 61 62 29 0a 20 20 20 20 20 20 20 20 20 20 20  Tab).           
21050 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
21060 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c  ImpliesExpr(pE1,
21070 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54   pE2->pRight, iT
21080 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72  ab) ).  ){.    r
21090 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
210a0 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e  f( pE2->op==TK_N
210b0 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c  OTNULL.   && sql
210c0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
210d0 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d  pE1->pLeft, pE2-
210e0 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30  >pLeft, iTab)==0
210f0 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f 70 21  .   && (pE1->op!
21100 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45  =TK_ISNULL && pE
21110 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20  1->op!=TK_IS).  
21120 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
21130 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
21140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
21150 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
21160 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
21170 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
21180 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74  tree walker.** t
21190 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63  o count referenc
211a0 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75  es to table colu
211b0 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d  mns in the argum
211c0 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61  ents of an .** a
211d0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
211e0 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  n, in order to i
211f0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  mplement the.** 
21200 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54  sqlite3FunctionT
21210 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65  hisSrc() routine
21220 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43  ..*/.struct SrcC
21230 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74  ount {.  SrcList
21240 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65   *pSrc;   /* One
21250 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d   particular FROM
21260 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73   clause in a nes
21270 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ted query */.  i
21280 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20  nt nThis;       
21290 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
212a0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
212b0 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a  ns in pSrcList *
212c0 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20  /.  int nOther; 
212d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
212e0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
212f0 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72  columns in other
21300 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f   FROM clauses */
21310 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  .};../*.** Count
21320 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
21330 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
21340 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  umns..*/.static 
21350 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74  int exprSrcCount
21360 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
21370 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
21380 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29    /* The NEVER()
21390 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74   on the second t
213a0 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73  erm is because s
213b0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
213c0 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a  esThisSrc().  **
213d0 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65   is always calle
213e0 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  d before sqlite3
213f0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
21400 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74  gates() and so t
21410 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d  he.  ** TK_COLUM
21420 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  Ns have not yet 
21430 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69  been converted i
21440 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
21450 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69  N.  If.  ** sqli
21460 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
21470 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64  hisSrc() is used
21480 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20   differently in 
21490 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a  the future, the.
214a0 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c    ** NEVER() wil
214b0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d  l need to be rem
214c0 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70  oved. */.  if( p
214d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
214e0 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78  UMN || NEVER(pEx
214f0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
21500 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e  OLUMN) ){.    in
21510 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
21520 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57  SrcCount *p = pW
21530 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75  alker->u.pSrcCou
21540 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  nt;.    SrcList 
21550 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
21560 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
21570 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
21580 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
21590 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d  r->iTable==pSrc-
215a0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
215b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
215c0 20 69 66 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72   if( i<pSrc->nSr
215d0 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54  c ){.      p->nT
215e0 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  his++;.    }else
215f0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65  {.      p->nOthe
21600 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  r++;.    }.  }. 
21610 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
21620 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  inue;.}../*.** D
21630 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20  etermine if any 
21640 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  of the arguments
21650 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46 75   to the pExpr Fu
21660 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  nction reference
21670 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52  .** pSrcList.  R
21680 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
21690 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74  ey do.  Also ret
216a0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
216b0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
216c0 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20  no arguments or 
216d0 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e  has only constan
216e0 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65  t arguments.  Re
216f0 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45  turn false if pE
21700 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  xpr.** reference
21710 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f  s columns but no
21720 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62  t columns of tab
21730 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72  les found in pSr
21740 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cList..*/.int sq
21750 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
21760 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a 70  sThisSrc(Expr *p
21770 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70  Expr, SrcList *p
21780 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b  SrcList){.  Walk
21790 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53  er w;.  struct S
217a0 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61  rcCount cnt;.  a
217b0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
217c0 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
217d0 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  N );.  memset(&w
217e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
217f0 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
21800 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e  ck = exprSrcCoun
21810 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75  t;.  w.u.pSrcCou
21820 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74  nt = &cnt;.  cnt
21830 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74  .pSrc = pSrcList
21840 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20  ;.  cnt.nThis = 
21850 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20  0;.  cnt.nOther 
21860 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  = 0;.  sqlite3Wa
21870 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70  lkExprList(&w, p
21880 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
21890 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68    return cnt.nTh
218a0 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68  is>0 || cnt.nOth
218b0 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  er==0;.}../*.** 
218c0 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
218d0 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
218e0 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
218f0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
21900 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
21910 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
21920 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
21930 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
21940 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
21950 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
21960 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  umn(sqlite3 *db,
21970 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
21980 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
21990 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74  fo->aCol = sqlit
219a0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
219b0 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  .       db,.    
219c0 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a     pInfo->aCol,.
219d0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
219e0 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20  nfo->aCol[0]),. 
219f0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
21a00 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69  olumn,.       &i
21a10 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
21a20 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
21a30 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
21a40 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
21a50 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
21a60 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
21a70 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
21a80 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
21a90 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
21aa0 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
21ab0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
21ac0 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
21ad0 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
21ae0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
21af0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
21b00 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
21b10 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
21b20 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
21b30 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
21b40 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
21b50 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
21b60 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
21b70 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69  nFunc,.       &i
21b80 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
21b90 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
21ba0 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72  his is the xExpr
21bb0 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74  Callback for a t
21bc0 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20  ree walker.  It 
21bd0 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d  is used to.** im
21be0 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45  plement sqlite3E
21bf0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
21c00 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
21c10 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
21c20 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
21c30 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
21c40 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
21c50 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
21c60 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a  gregate(Walker *
21c70 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
21c80 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
21c90 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
21ca0 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
21cb0 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
21cc0 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
21cd0 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
21ce0 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
21cf0 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
21d00 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
21d10 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20  NC->pAggInfo;.. 
21d20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
21d30 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
21d40 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
21d50 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
21d60 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
21d70 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
21d80 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
21d90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21da0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
21db0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  LUMN );.      /*
21dc0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
21dd0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
21de0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
21df0 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
21e00 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
21e10 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
21e20 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
21e30 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c  if( ALWAYS(pSrcL
21e40 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
21e50 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
21e60 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
21e70 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
21e80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
21e90 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
21ea0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
21eb0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
21ec0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
21ed0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  l;.          ass
21ee0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
21ef0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
21f00 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
21f10 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
21f20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
21f30 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
21f40 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
21f50 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
21f60 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
21f70 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
21f80 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
21f90 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
21fa0 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
21fb0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
21fc0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
21fd0 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
21fe0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
21ff0 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
22000 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
22010 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
22020 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
22030 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
22040 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
22050 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
22060 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
22070 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
22080 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
22090 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
220a0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
220b0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
220c0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
220d0 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
220e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
220f0 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
22100 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22120 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
22130 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22150 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
22160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22180 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
22190 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
221a0 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
221b0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
221c0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
221d0 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
221e0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
221f0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
22200 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
22210 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
22220 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
22230 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
22240 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
22250 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
22260 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
22270 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
22280 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
22290 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
222a0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
222b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
222c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
222d0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
222e0 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
222f0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
22300 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
22310 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
22320 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
22330 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
22340 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
22350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
22360 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
22370 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
22380 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
22390 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
223a0 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
223b0 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
223c0 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
223d0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
223e0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
223f0 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
22400 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
22410 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
22420 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
22430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22440 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
22450 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
22460 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
22470 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22490 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
224a0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
224d0 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
224e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
224f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
22500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22510 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22520 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22530 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
22540 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
22550 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
22560 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
22570 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
22580 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
22590 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
225a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
225b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
225c0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
225d0 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
225e0 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
225f0 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
22600 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
22610 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
22620 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
22630 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
22640 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
22650 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
22660 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
22670 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
22680 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
22690 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
226a0 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
226b0 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
226c0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
226d0 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
226e0 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
226f0 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
22700 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
22710 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
22720 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
22730 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
22740 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20  TK_AGG_COLUMN;. 
22750 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
22760 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b  ->iAgg = (i16)k;
22770 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
22780 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
22790 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
227a0 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
227b0 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
227c0 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
227d0 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
227e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
227f0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
22800 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
22810 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
22820 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e   {.      if( (pN
22830 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
22840 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20  InAggFunc)==0.  
22850 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d       && pWalker-
22860 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45  >walkerDepth==pE
22870 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29  xpr->op2.      )
22880 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
22890 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78  ck to see if pEx
228a0 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  pr is a duplicat
228b0 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67  e of another agg
228c0 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20  regate .        
228d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ** function that
228e0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
228f0 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75  he pAggInfo stru
22900 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f  cture.        */
22910 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
22920 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49  AggInfo_func *pI
22930 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  tem = pAggInfo->
22940 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66  aFunc;.        f
22950 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
22960 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
22970 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
22980 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
22990 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d  xprCompare(pItem
229a0 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20  ->pExpr, pExpr, 
229b0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
229c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
229d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
229e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
229f0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  >=pAggInfo->nFun
22a00 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
22a10 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69  * pExpr is origi
22a20 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77  nal.  Make a new
22a30 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e   entry in pAggIn
22a40 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20  fo->aFunc[].    
22a50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22a60 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
22a70 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
22a80 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67         i = addAg
22a90 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65  gInfoFunc(pParse
22aa0 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b  ->db, pAggInfo);
22ab0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
22ac0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
22ad0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
22ae0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
22af0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
22b00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
22b10 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66  pItem = &pAggInf
22b20 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20  o->aFunc[i];.   
22b30 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
22b40 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
22b50 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
22b60 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
22b70 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
22b80 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
22b90 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
22ba0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
22bb0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
22bc0 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20   pItem->pFunc = 
22bd0 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
22be0 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c00 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b     pExpr->u.zTok
22c10 65 6e 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  en, sqlite3Strle
22c20 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  n30(pExpr->u.zTo
22c30 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ken),.          
22c40 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
22c50 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  x.pList ? pExpr-
22c60 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
22c70 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
22c80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
22c90 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
22ca0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
22cb0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
22cc0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
22cd0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
22ce0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
22d00 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
22d10 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
22d20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
22d30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22d40 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
22d50 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
22d60 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
22d70 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
22d80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
22d90 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
22da0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
22db0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
22dc0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
22dd0 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
22de0 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
22df0 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
22e00 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
22e10 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20  gg = (i16)i;.   
22e20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
22e30 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
22e40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
22e50 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
22e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22e70 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
22e80 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
22e90 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22ea0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
22eb0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
22ec0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
22ed0 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
22ee0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
22ef0 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
22f00 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c 6b  _PARAMETER(pWalk
22f10 65 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  er);.  UNUSED_PA
22f20 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29  RAMETER(pSelect)
22f30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
22f40 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
22f50 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45  * Analyze the pE
22f60 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  xpr expression l
22f70 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
22f80 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
22f90 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
22fa0 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
22fb0 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67 67   be added to Agg
22fc0 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
22fd0 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a   pNC->pAggInfo.*
22fe0 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64  * points to.  Ad
22ff0 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
23000 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65   are made on the
23010 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
23020 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e  as.** necessary.
23030 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
23040 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
23050 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
23060 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
23070 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79  as been.** analy
23080 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65  zed by sqlite3Re
23090 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
230a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
230b0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
230c0 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65  egates(NameConte
230d0 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70  xt *pNC, Expr *p
230e0 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
230f0 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
23100 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
23110 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
23120 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
23130 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ate;.  w.xSelect
23140 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
23150 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
23160 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20  lect;.  w.u.pNC 
23170 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28  = pNC;.  assert(
23180 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
23190 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  0 );.  sqlite3Wa
231a0 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
231b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
231c0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
231d0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
231e0 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
231f0 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
23200 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
23210 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
23220 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
23230 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
23240 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
23250 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
23260 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
23270 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
23280 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
23290 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
232a0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
232b0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
232c0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
232d0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
232e0 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
232f0 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
23300 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
23310 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
23320 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
23330 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
23340 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
23350 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
23360 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
23370 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67  a single new reg
23380 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f  ister for use to
23390 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72   hold some inter
233a0 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a  mediate result..
233b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
233c0 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
233d0 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
233e0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d  Parse->nTempReg=
233f0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
23400 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
23410 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
23420 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
23430 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
23440 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  g];.}../*.** Dea
23450 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
23460 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c  er, making avail
23470 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66  able for reuse f
23480 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
23490 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20   purpose..**.** 
234a0 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73  If a register is
234b0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
234c0 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c   used by the col
234d0 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a  umn cache, then.
234e0 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74 69  ** the dallocati
234f0 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75  on is deferred u
23500 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20  ntil the column 
23510 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20  cache line that 
23520 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69  uses.** the regi
23530 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61  ster becomes sta
23540 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
23550 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
23560 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
23570 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66   int iReg){.  if
23580 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65  ( iReg && pParse
23590 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
235a0 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
235b0 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e  mpReg) ){.    in
235c0 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
235d0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
235e0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
235f0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
23600 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
23610 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
23620 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65        if( p->iRe
23630 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
23640 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
23650 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
23660 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
23670 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65  .    pParse->aTe
23680 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
23690 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67  empReg++] = iReg
236a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
236b0 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c  llocate or deall
236c0 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66  ocate a block of
236d0 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76   nReg consecutiv
236e0 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69  e registers.*/.i
236f0 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
23700 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
23710 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
23720 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
23730 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67   = pParse->iRang
23740 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72  eReg;.  n = pPar
23750 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20  se->nRangeReg;. 
23760 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a   if( nReg<=n ){.
23770 20 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65      assert( !use
23780 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
23790 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29  Parse, i, i+n-1)
237a0 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
237b0 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65  iRangeReg += nRe
237c0 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  g;.    pParse->n
237d0 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67  RangeReg -= nReg
237e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
237f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
23800 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
23810 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d  Mem += nReg;.  }
23820 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76  .  return i;.}.v
23830 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
23840 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  seTempRange(Pars
23850 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
23860 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
23870 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
23880 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
23890 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20   iReg, nReg);.  
238a0 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d  if( nReg>pParse-
238b0 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20  >nRangeReg ){.  
238c0 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
238d0 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  Reg = nReg;.    
238e0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
238f0 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  g = iReg;.  }.}.
23900 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20  ./*.** Mark all 
23910 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
23920 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61  ers as being una
23930 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
23940 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
23950 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
23960 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
23970 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  se){.  pParse->n
23980 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70  TempReg = 0;.  p
23990 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
239a0 20 3d 20 30 3b 0a 7d 0a                           = 0;.}.