/ Hex Artifact Content
Login

Artifact 3180b6332072b263f845592e72e92971af562ab0:


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 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
3ed0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  an expression mu
3ee0: 73 74 20 62 65 20 46 41 4c 53 45 20 69 6e 20 61  st be FALSE in a
3ef0: 6c 6c 20 63 61 73 65 73 20 61 6e 64 20 30 20 69  ll cases and 0 i
3f00: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
3f10: 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 74 72 75  ion might be tru
3f20: 65 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  e.  This is an o
3f30: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66  ptimization.  If
3f40: 20 69 73 20 4f 4b 20 74 6f 0a 2a 2a 20 72 65 74   is OK to.** ret
3f50: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
3f60: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
3f70: 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61  n really is alwa
3f80: 79 73 20 66 61 6c 73 65 20 28 61 20 0a 2a 2a 20  ys false (a .** 
3f90: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e  false negative).
3fa0: 20 20 42 75 74 20 69 74 20 69 73 20 61 20 62 75    But it is a bu
3fb0: 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66  g to return 1 if
3fc0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
3fd0: 2a 2a 20 6d 69 67 68 74 20 62 65 20 74 72 75 65  ** might be true
3fe0: 20 69 6e 20 73 6f 6d 65 20 72 61 72 65 20 63 69   in some rare ci
3ff0: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
4000: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
4010: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
4020: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
4030: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
4040: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
4050: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
4060: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
4070: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
4080: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
4090: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
40a0: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
40b0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
40c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
40d0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45  xprAlwaysFalse(E
40e0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76  xpr *p){.  int v
40f0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72   = 0;.  if( Expr
4100: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
4110: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
4120: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
4130: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
4140: 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74  ger(p, &v) ) ret
4150: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
4160: 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  v==0;.}../*.** J
4170: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
4180: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
4190: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
41a0: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
41b0: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
41c0: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
41d0: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
41e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
41f0: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
4200: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
4210: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
4220: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
4230: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
4240: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
4250: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
4260: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
4270: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
4280: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
4290: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
42a0: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
42b0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
42c0: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
42d0: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
42e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
42f0: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
4300: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
4310: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
4320: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70  .  }else if( exp
4330: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
4340: 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79  ft) || exprAlway
4350: 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29  sFalse(pRight) )
4360: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4370: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
4380: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4390: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
43a0: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
43b0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
43c0: 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
43d0: 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
43e0: 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d  kens[0], 0);.  }
43f0: 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a  else{.    Expr *
4400: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
4410: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41  prAlloc(db, TK_A
4420: 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ND, 0, 0);.    s
4430: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
4440: 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65  Subtrees(db, pNe
4450: 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  w, pLeft, pRight
4460: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e  );.    return pN
4470: 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ew;.  }.}../*.**
4480: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
4490: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
44a0: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
44b0: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
44c0: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
44d0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
44e0: 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
44f0: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
4500: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
4510: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
4520: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
4530: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4540: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
4550: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
4560: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
4570: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
4580: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
4590: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
45a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
45b0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
45c0: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
45d0: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
45e0: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
45f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4600: 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  .  pNew->x.pList
4610: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65   = pList;.  asse
4620: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
4630: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
4640: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71  sSelect) );.  sq
4650: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
4660: 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  ht(pParse, pNew)
4670: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
4680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
4690: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
46a0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
46b0: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
46c0: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
46d0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
46e0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
46f0: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
4700: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
4710: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
4720: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
4730: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
4740: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
4750: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
4760: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
4770: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
4780: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
4790: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
47a0: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
47b0: 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20  too be to avoid 
47c0: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
47d0: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
47e0: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
47f0: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
4800: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
4810: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
4820: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
4830: 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20  ":aaa", "@aaa", 
4840: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
4850: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
4860: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
4870: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
4880: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
4890: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
48a0: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
48b0: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
48c0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
48d0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61  he next sequenia
48e0: 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  l variable numbe
48f0: 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64  r is.** assigned
4900: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4910: 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75  3ExprAssignVarNu
4920: 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  mber(Parse *pPar
4930: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
4940: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
4950: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
4960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a  const char *z;..
4970: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
4980: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4990: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
49a0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
49b0: 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63 65  tValue|EP_Reduce
49c0: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  d|EP_TokenOnly) 
49d0: 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e  );.  z = pExpr->
49e0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65  u.zToken;.  asse
49f0: 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73  rt( z!=0 );.  as
4a00: 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b  sert( z[0]!=0 );
4a10: 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29  .  if( z[1]==0 )
4a20: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
4a30: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
4a40: 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e  ".  Assign the n
4a50: 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ext variable num
4a60: 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ber */.    asser
4a70: 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a  t( z[0]=='?' );.
4a80: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
4a90: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70  mn = (ynVar)(++p
4aa0: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
4ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61 72  }else{.    ynVar
4ac0: 20 78 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20   x = 0;.    u32 
4ad0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
4ae0: 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  n30(z);.    if( 
4af0: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  z[0]=='?' ){.   
4b00: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
4b10: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
4b20: 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e  ".  Convert "nnn
4b30: 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  " to an integer 
4b40: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  and.      ** use
4b50: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
4b60: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
4b70: 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20      i64 i;.     
4b80: 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71   int bOk = 0==sq
4b90: 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31  lite3Atoi64(&z[1
4ba0: 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49  ], &i, n-1, SQLI
4bb0: 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
4bc0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
4bd0: 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20   x = (ynVar)i;. 
4be0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4bf0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
4c00: 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20  tcase( i==1 );. 
4c10: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4c20: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
4c30: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4c40: 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a  LE_NUMBER]-1 );.
4c50: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4c60: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
4c70: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4c80: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20  BLE_NUMBER] );. 
4c90: 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20       if( bOk==0 
4ca0: 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e  || i<1 || i>db->
4cb0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
4cc0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
4cd0: 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  BER] ){.        
4ce0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4cf0: 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c  pParse, "variabl
4d00: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65  e number must be
4d10: 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20   between ?1 and 
4d20: 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?%d",.          
4d30: 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c    db->aLimit[SQL
4d40: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4d50: 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20  LE_NUMBER]);.   
4d60: 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 20       x = 0;.    
4d70: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
4d80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
4d90: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4da0: 6e 56 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a 20  nVar = (int)i;. 
4db0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
4dc0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
4dd0: 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22  ards like ":aaa"
4de0: 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61  , "$aaa" or "@aa
4df0: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
4e00: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
4e10: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
4e20: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
4e30: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4e40: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
4e50: 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68   name.      ** h
4e60: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
4e70: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
4e80: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
4e90: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
4ea0: 2f 0a 20 20 20 20 20 20 79 6e 56 61 72 20 69 3b  /.      ynVar i;
4eb0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4ec0: 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b  i<pParse->nzVar;
4ed0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
4ee0: 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  f( pParse->azVar
4ef0: 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 70 50  [i] && strcmp(pP
4f00: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c 7a  arse->azVar[i],z
4f10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4f20: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
4f30: 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 2b   = x = (ynVar)i+
4f40: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
4f50: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
4f60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4f70: 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70 72  x==0 ) x = pExpr
4f80: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56  ->iColumn = (ynV
4f90: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
4fa0: 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ar);.    }.    i
4fb0: 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( x>0 ){.      
4fc0: 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e 7a  if( x>pParse->nz
4fd0: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Var ){.        c
4fe0: 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20 20  har **a;.       
4ff0: 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65   a = sqlite3DbRe
5000: 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73 65  alloc(db, pParse
5010: 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65 6f  ->azVar, x*sizeo
5020: 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  f(a[0]));.      
5030: 20 20 69 66 28 20 61 3d 3d 30 20 29 20 72 65 74    if( a==0 ) ret
5040: 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f 72 20 72  urn;  /* Error r
5050: 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68 20  eported through 
5060: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5070: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 61 72   */.        pPar
5080: 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a 20  se->azVar = a;. 
5090: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61         memset(&a
50a0: 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d 2c  [pParse->nzVar],
50b0: 20 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e 6e   0, (x-pParse->n
50c0: 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b 30  zVar)*sizeof(a[0
50d0: 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ]));.        pPa
50e0: 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b 0a  rse->nzVar = x;.
50f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5100: 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20 70  ( z[0]!='?' || p
5110: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31  Parse->azVar[x-1
5120: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
5130: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5140: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  , pParse->azVar[
5150: 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  x-1]);.        p
5160: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31  Parse->azVar[x-1
5170: 5d 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  ] = sqlite3DbStr
5180: 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b 0a  NDup(db, z, n);.
5190: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
51a0: 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  } .  if( !pParse
51b0: 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73 65  ->nErr && pParse
51c0: 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69  ->nVar>db->aLimi
51d0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
51e0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
51f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5200: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5210: 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72  too many SQL var
5220: 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a  iables");.  }.}.
5230: 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65  ./*.** Recursive
5240: 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70  ly delete an exp
5250: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
5260: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
5270: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
5280: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
5290: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
52a0: 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  rn;.  /* Sanity 
52b0: 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68  check: Assert th
52c0: 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20  at the IntValue 
52d0: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  is non-negative 
52e0: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
52f0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
5300: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5310: 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d  _IntValue) || p-
5320: 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  >u.iValue>=0 );.
5330: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
5340: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
5350: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 2f  enOnly) ){.    /
5360: 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69  * The Expr.x uni
5370: 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  on is never used
5380: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
5390: 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74  e as Expr.pRight
53a0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
53b0: 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  p->x.pList==0 ||
53c0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
53d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
53e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
53f0: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
5400: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
5410: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  p->pRight);.    
5420: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
5430: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
5440: 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62 46  en) ) sqlite3DbF
5450: 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f  ree(db, p->u.zTo
5460: 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ken);.    if( Ex
5470: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5480: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
5490: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
54a0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
54b0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
54c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
54d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
54e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
54f0: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
5500: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
5510: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74  roperty(p, EP_St
5520: 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c  atic) ){.    sql
5530: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5540: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5550: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5560: 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63  r of bytes alloc
5570: 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70  ated for the exp
5580: 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72  ression structur
5590: 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  e .** passed as 
55a0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
55b0: 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  nt. This is alwa
55c0: 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46  ys one of EXPR_F
55d0: 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52  ULLSIZE,.** EXPR
55e0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20  _REDUCEDSIZE or 
55f0: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
5600: 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ZE..*/.static in
5610: 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  t exprStructSize
5620: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
5630: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
5640: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
5650: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
5660: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20  TOKENONLYSIZE;. 
5670: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
5680: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
5690: 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ed) ) return EXP
56a0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20  R_REDUCEDSIZE;. 
56b0: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c   return EXPR_FUL
56c0: 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSIZE;.}../*.** 
56d0: 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53 69  The dupedExpr*Si
56e0: 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61  ze() routines ea
56f0: 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ch return the nu
5700: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
5710: 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f  quired.** to sto
5720: 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  re a copy of an 
5730: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78  expression or ex
5740: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
5750: 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a  They differ in.*
5760: 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68  * how much of th
5770: 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75 72  e tree is measur
5780: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75  ed..**.**     du
5790: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
57a0: 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20  e()     Size of 
57b0: 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73 74  only the Expr st
57c0: 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20  ructure .**     
57d0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
57e0: 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f  e()       Size o
57f0: 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20 66  f Expr + space f
5800: 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20  or token.**     
5810: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29 20  dupedExprSize() 
5820: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2b            Expr +
5830: 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65   token + subtree
5840: 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a   components.**.*
5850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
58a0: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53 74   The dupedExprSt
58b0: 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74  ructSize() funct
58c0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20  ion returns two 
58d0: 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67  values OR-ed tog
58e0: 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20  ether:  .** (1) 
58f0: 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72  the space requir
5900: 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66  ed for a copy of
5910: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
5920: 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a  ure only and .**
5930: 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78 20   (2) the EP_xxx 
5940: 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63  flags that indic
5950: 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74 72  ate what the str
5960: 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75  ucture size shou
5970: 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65  ld be..** The re
5980: 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61  turn values is a
5990: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  lways one of:.**
59a0: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55  .**      EXPR_FU
59b0: 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45  LLSIZE.**      E
59c0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
59d0: 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a    | EP_Reduced.*
59e0: 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45  *      EXPR_TOKE
59f0: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
5a00: 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54  okenOnly.**.** T
5a10: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73  he size of the s
5a20: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
5a30: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
5a40: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
5a50: 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75  e.** of this rou
5a60: 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e  tine with 0xfff.
5a70: 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20    The flags can 
5a80: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
5a90: 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  ing the.** retur
5aa0: 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f  n value with EP_
5ab0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
5ac0: 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  Only..**.** Note
5ad0: 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67 73   that with flags
5ae0: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
5af0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20  , this routines 
5b00: 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69  works on full-si
5b10: 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64  ze.** (unreduced
5b20: 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61  ) Expr objects a
5b30: 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e  s they or origin
5b40: 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64  ally constructed
5b50: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a   by the parser..
5b60: 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65 73  ** During expres
5b70: 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65  sion analysis, e
5b80: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
5b90: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
5ba0: 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c   moved into.** l
5bb0: 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74 65  ater parts of te
5bc0: 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  h Expr object an
5bd0: 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66  d that extra inf
5be0: 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67  ormation might g
5bf0: 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66  et chopped.** of
5c00: 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  f if the express
5c10: 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20  ion is reduced. 
5c20: 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
5c30: 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  it does not work
5c40: 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45 58   to.** make a EX
5c50: 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70  PRDUP_REDUCE cop
5c60: 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65  y of a reduced e
5c70: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69  xpression.  It i
5c80: 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20  s only legal.** 
5c90: 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73  to reduce a pris
5ca0: 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tine expression 
5cb0: 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61  tree from the pa
5cc0: 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65  rser.  The imple
5cd0: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mentation.** of 
5ce0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
5cf0: 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75  ize() contain mu
5d00: 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20  ltiple assert() 
5d10: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
5d20: 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e  attempt.** to en
5d30: 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74  force this const
5d40: 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  raint..*/.static
5d50: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74   int dupedExprSt
5d60: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
5d70: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
5d80: 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73  int nSize;.  ass
5d90: 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52  ert( flags==EXPR
5da0: 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c  DUP_REDUCE || fl
5db0: 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c  ags==0 ); /* Onl
5dc0: 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65  y one flag value
5dd0: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73   allowed */.  as
5de0: 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53  sert( EXPR_FULLS
5df0: 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20  IZE<=0xfff );.  
5e00: 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26  assert( (0xfff &
5e10: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
5e20: 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29  TokenOnly))==0 )
5e30: 3b 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c 61 67  ;.  if( 0==(flag
5e40: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
5e50: 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  ) ){.    nSize =
5e60: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
5e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
5e80: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
5e90: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
5ea0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
5eb0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
5ec0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5ed0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
5ee0: 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74  ) ); .    assert
5ef0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5f00: 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65  ty(p, EP_MemToke
5f10: 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
5f20: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5f30: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
5f40: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  e) );.    if( p-
5f50: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70  >pLeft || p->x.p
5f60: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
5f70: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
5f80: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
5f90: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
5fa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
5fb0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
5fc0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
5fd0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
5fe0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20   EP_TokenOnly;. 
5ff0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6000: 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nSize;.}../*.*
6010: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6020: 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63  returns the spac
6030: 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69  e in bytes requi
6040: 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  red to store the
6050: 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65   copy .** of the
6060: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
6070: 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  and a copy of th
6080: 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  e Expr.u.zToken 
6090: 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a  string (if that.
60a0: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66  ** string is def
60b0: 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ined.).*/.static
60c0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f   int dupedExprNo
60d0: 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  deSize(Expr *p, 
60e0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
60f0: 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45  t nByte = dupedE
6100: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
6110: 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b   flags) & 0xfff;
6120: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
6130: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
6140: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
6150: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42  zToken ){.    nB
6160: 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
6170: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
6180: 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74  en)+1;.  }.  ret
6190: 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  urn ROUND8(nByte
61a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
61b0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
61c0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
61d0: 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c  to create a dupl
61e0: 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a  icate of the .**
61f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
6200: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
6210: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65  argument. The se
6220: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
6230: 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61   a.** mask conta
6240: 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58  ining EXPRDUP_XX
6250: 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  X flags..**.** T
6260: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
6270: 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65  d includes space
6280: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70   to create a cop
6290: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
62a0: 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61  ruct.** itself a
62b0: 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65  nd the buffer re
62c0: 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70  ferred to by Exp
62d0: 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61  r.u.zToken, if a
62e0: 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ny..**.** If the
62f0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
6300: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
6310: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
6320: 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20  ue includes .** 
6330: 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61  space to duplica
6340: 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65  te all Expr node
6350: 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f  s in the tree fo
6360: 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65  rmed by Expr.pLe
6370: 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e  ft .** and Expr.
6380: 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73  pRight variables
6390: 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e   (but not for an
63a0: 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69  y structures poi
63b0: 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64  nted to or .** d
63c0: 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68  escended from th
63d0: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f  e Expr.x.pList o
63e0: 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  r Expr.x.pSelect
63f0: 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a   variables)..*/.
6400: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
6410: 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ExprSize(Expr *p
6420: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
6430: 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  int nByte = 0;. 
6440: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42   if( p ){.    nB
6450: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e  yte = dupedExprN
6460: 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  odeSize(p, flags
6470: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
6480: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  &EXPRDUP_REDUCE 
6490: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
64a0: 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  = dupedExprSize(
64b0: 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29  p->pLeft, flags)
64c0: 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65   + dupedExprSize
64d0: 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67  (p->pRight, flag
64e0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  s);.    }.  }.  
64f0: 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a  return nByte;.}.
6500: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6510: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
6520: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  to sqlite3ExprDu
6530: 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  p(), except that
6540: 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a   if pzBuffer .**
6550: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
6560: 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61  n *pzBuffer is a
6570: 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20  ssumed to point 
6580: 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67  to a buffer larg
6590: 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20  e enough .** to 
65a0: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  store the copy o
65b0: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20  f expression p, 
65c0: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d  the copies of p-
65d0: 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66  >u.zToken.** (if
65e0: 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e   applicable), an
65f0: 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  d the copies of 
6600: 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64  the p->pLeft and
6610: 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65   p->pRight expre
6620: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e  ssions,.** if an
6630: 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  y. Before return
6640: 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69  ing, *pzBuffer i
6650: 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  s set to the fir
6660: 73 74 20 62 79 74 65 20 70 61 73 73 65 64 20 74  st byte passed t
6670: 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66  he.** portion of
6680: 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69   the buffer copi
6690: 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20  ed into by this 
66a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
66b0: 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75  tic Expr *exprDu
66c0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
66d0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
66e0: 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72  s, u8 **pzBuffer
66f0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20  ){.  Expr *pNew 
6700: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
6710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
6720: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
6730: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
6740: 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75 63  onst int isReduc
6750: 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50 52  ed = (flags&EXPR
6760: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
6770: 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20 20   u8 *zAlloc;.   
6780: 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 20   u32 staticFlag 
6790: 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  = 0;..    assert
67a0: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
67b0: 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a 20   isReduced );.. 
67c0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
67d0: 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   where to write 
67e0: 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72  the new Expr str
67f0: 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69  ucture. */.    i
6800: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
6810: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70       zAlloc = *p
6820: 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 73  zBuffer;.      s
6830: 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53  taticFlag = EP_S
6840: 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73 65  tatic;.    }else
6850: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6860: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6870: 52 61 77 28 64 62 2c 20 64 75 70 65 64 45 78 70  Raw(db, dupedExp
6880: 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 29  rSize(p, flags))
6890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
68a0: 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f   = (Expr *)zAllo
68b0: 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77  c;..    if( pNew
68c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   ){.      /* Set
68d0: 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65   nNewSize to the
68e0: 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20   size allocated 
68f0: 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72  for the structur
6900: 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20  e pointed to.   
6910: 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54     ** by pNew. T
6920: 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58  his is either EX
6930: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50  PR_FULLSIZE, EXP
6940: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
6950: 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f 54  .      ** EXPR_T
6960: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54  OKENONLYSIZE. nT
6970: 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
6980: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
6990: 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20  es consumed.    
69a0: 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79    ** by the copy
69b0: 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f   of the p->u.zTo
69c0: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61  ken string (if a
69d0: 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ny)..      */.  
69e0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
69f0: 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d  ed nStructSize =
6a00: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
6a10: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
6a20: 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
6a30: 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75  nNewSize = nStru
6a40: 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a  ctSize & 0xfff;.
6a50: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e        int nToken
6a60: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70  ;.      if( !Exp
6a70: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6a80: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
6a90: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
6aa0: 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20         nToken = 
6ab0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6ac0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31  p->u.zToken) + 1
6ad0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6ae0: 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20         nToken = 
6af0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
6b00: 20 69 66 28 20 69 73 52 65 64 75 63 65 64 20 29   if( isReduced )
6b10: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6b20: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6b30: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
6b40: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ==0 );.        m
6b50: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
6b60: 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20   nNewSize);.    
6b70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6b80: 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78 70   int nSize = exp
6b90: 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a  rStructSize(p);.
6ba0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
6bb0: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29  Alloc, p, nSize)
6bc0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
6bd0: 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c  (&zAlloc[nSize],
6be0: 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   0, EXPR_FULLSIZ
6bf0: 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  E-nSize);.      
6c00: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  }..      /* Set 
6c10: 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20  the EP_Reduced, 
6c20: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e  EP_TokenOnly, an
6c30: 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67  d EP_Static flag
6c40: 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  s appropriately.
6c50: 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
6c60: 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65  flags &= ~(EP_Re
6c70: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
6c80: 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f  ly|EP_Static|EP_
6c90: 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  MemToken);.     
6ca0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
6cb0: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45  nStructSize & (E
6cc0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
6cd0: 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70  enOnly);.      p
6ce0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74  New->flags |= st
6cf0: 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20  aticFlag;..     
6d00: 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e   /* Copy the p->
6d10: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c  u.zToken string,
6d20: 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
6d30: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a    if( nToken ){.
6d40: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
6d50: 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a  oken = pNew->u.z
6d60: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
6d70: 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d  zAlloc[nNewSize]
6d80: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
6d90: 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54  (zToken, p->u.zT
6da0: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
6db0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
6dc0: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
6dd0: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45  pNew->flags) & E
6de0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6df0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
6e00: 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70  in the pNew->x.p
6e10: 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e  Select or pNew->
6e20: 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20  x.pList member. 
6e30: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  */.        if( E
6e40: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6e50: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
6e60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
6e70: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73  w->x.pSelect = s
6e80: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
6e90: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
6ea0: 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20  , isReduced);.  
6eb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6ec0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
6ed0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
6ee0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
6ef0: 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64 75  >x.pList, isRedu
6f00: 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ced);.        }.
6f10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
6f20: 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e  * Fill in pNew->
6f30: 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e  pLeft and pNew->
6f40: 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20  pRight. */.     
6f50: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
6f60: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
6f70: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
6f80: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ly) ){.        z
6f90: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
6fa0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
6fb0: 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ags);.        if
6fc0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6fd0: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
6fe0: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
6ff0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 65   pNew->pLeft = e
7000: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
7010: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
7020: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20  UCE, &zAlloc);. 
7030: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
7040: 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70 28  Right = exprDup(
7050: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45  db, p->pRight, E
7060: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
7070: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
7080: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
7090: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  zBuffer ){.     
70a0: 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d       *pzBuffer =
70b0: 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20   zAlloc;.       
70c0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
70d0: 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78 70          if( !Exp
70e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
70f0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
7100: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
7110: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
7120: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
7130: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
7140: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
7150: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7160: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
7170: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
7180: 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20       }..    }.  
7190: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
71a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
71b0: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
71c0: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
71d0: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
71e0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
71f0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
7200: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
7210: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
7220: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
7230: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
7240: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
7250: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
7260: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
7270: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
7280: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
7290: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
72a0: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
72b0: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
72c0: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
72d0: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
72e0: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
72f0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
7300: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
7310: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
7320: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
7330: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
7340: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
7350: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
7360: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
7370: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
7380: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
7390: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
73a0: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
73b0: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
73c0: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
73d0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
73e0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
73f0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
7400: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  ..** If the EXPR
7410: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
7420: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
7430: 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
7440: 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e  ned is a.** trun
7450: 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  cated version of
7460: 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20   the usual Expr 
7470: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
7480: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
7490: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
74a0: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
74b0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
74c0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
74d0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
74e0: 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  3ExprDup(sqlite3
74f0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
7500: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74  nt flags){.  ret
7510: 75 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20  urn exprDup(db, 
7520: 70 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a  p, flags, 0);.}.
7530: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
7540: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
7550: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
7560: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
7570: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
7580: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
7590: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
75a0: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
75b0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
75c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
75d0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
75e0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
75f0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
7600: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7610: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7620: 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a  ->iECursor = 0;.
7630: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
7640: 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20  i = p->nExpr;.  
7650: 69 66 28 20 28 66 6c 61 67 73 20 26 20 45 58 50  if( (flags & EXP
7660: 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20  RDUP_REDUCE)==0 
7670: 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e  ) for(i=1; i<p->
7680: 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20  nExpr; i+=i){}. 
7690: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
76a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
76b0: 6f 63 52 61 77 28 64 62 2c 20 20 69 2a 73 69 7a  ocRaw(db,  i*siz
76c0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
76d0: 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29    if( pItem==0 )
76e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
76f0: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
7700: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7710: 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70   .  pOldItem = p
7720: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ->a;.  for(i=0; 
7730: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  i<p->nExpr; i++,
7740: 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74   pItem++, pOldIt
7750: 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
7760: 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  *pOldExpr = pOld
7770: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
7780: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
7790: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
77a0: 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61  b, pOldExpr, fla
77b0: 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  gs);.    pItem->
77c0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
77d0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
77e0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
77f0: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
7800: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7810: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7820: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
7830: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
7840: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
7850: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  r;.    pItem->do
7860: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
7870: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  m->bSpanIsTab = 
7880: 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49  pOldItem->bSpanI
7890: 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d  sTab;.    pItem-
78a0: 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 70  >iOrderByCol = p
78b0: 4f 6c 64 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42  OldItem->iOrderB
78c0: 79 43 6f 6c 3b 0a 20 20 20 20 70 49 74 65 6d 2d  yCol;.    pItem-
78d0: 3e 69 41 6c 69 61 73 20 3d 20 70 4f 6c 64 49 74  >iAlias = pOldIt
78e0: 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a 20 20 7d 0a  em->iAlias;.  }.
78f0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7900: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ../*.** If curso
7910: 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69  rs, triggers, vi
7920: 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
7930: 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74  es are all omitt
7940: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62  ed from.** the b
7950: 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20  uild, then none 
7960: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
7970: 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70   routines, excep
7980: 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65  t for .** sqlite
7990: 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61  3SelectDup(), ca
79a0: 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c  n be called. sql
79b0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20  ite3SelectDup() 
79c0: 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  is sometimes.** 
79d0: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55  called with a NU
79e0: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
79f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
7a00: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
7a10: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
7a20: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
7a30: 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  \. || !defined(S
7a40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7a50: 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71  ERY).SrcList *sq
7a60: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
7a70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
7a80: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
7a90: 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  gs){.  SrcList *
7aa0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
7ab0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
7ac0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7ad0: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
7ae0: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
7af0: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
7b00: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
7b10: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
7b20: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
7b30: 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65  locRaw(db, nByte
7b40: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7b50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7b60: 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65  pNew->nSrc = pNe
7b70: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
7b80: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
7b90: 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  i<p->nSrc; i++){
7ba0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
7bb0: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
7bc0: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
7bd0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
7be0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
7bf0: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
7c00: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
7c10: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
7c20: 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65  Schema = pOldIte
7c30: 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  m->pSchema;.    
7c40: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
7c50: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
7c60: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7c70: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
7c80: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
7c90: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7ca0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7cb0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7cc0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
7cd0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7ce0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7cf0: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
7d00: 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ewItem->jointype
7d10: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69   = pOldItem->joi
7d20: 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49  ntype;.    pNewI
7d30: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
7d40: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
7d50: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7d60: 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f  addrFillSub = pO
7d70: 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ldItem->addrFill
7d80: 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Sub;.    pNewIte
7d90: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70  m->regReturn = p
7da0: 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  OldItem->regRetu
7db0: 72 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  rn;.    pNewItem
7dc0: 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d  ->isCorrelated =
7dd0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72   pOldItem->isCor
7de0: 72 65 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65  related;.    pNe
7df0: 77 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  wItem->viaCorout
7e00: 69 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ine = pOldItem->
7e10: 76 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a 20 20  viaCoroutine;.  
7e20: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64    pNewItem->zInd
7e30: 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ex = sqlite3DbSt
7e40: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7e50: 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20  m->zIndex);.    
7e60: 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64  pNewItem->notInd
7e70: 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  exed = pOldItem-
7e80: 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20  >notIndexed;.   
7e90: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65   pNewItem->pInde
7ea0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49  x = pOldItem->pI
7eb0: 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d  ndex;.    pTab =
7ec0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
7ed0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
7ee0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
7ef0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
7f00: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
7f10: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
7f20: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
7f30: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
7f40: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
7f50: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
7f60: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
7f70: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
7f80: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
7f90: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7fa0: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
7fb0: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
7fc0: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
7fd0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
7fe0: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
7ff0: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
8000: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
8010: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
8020: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
8030: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
8040: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
8050: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  w;.  int i;.  if
8060: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
8070: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
8080: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8090: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
80a0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
80b0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
80c0: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
80d0: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
80e0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
80f0: 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69  aw(db, p->nId*si
8100: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
8110: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
8120: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8130: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
8140: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
8150: 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68    }.  /* Note th
8160: 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73  at because the s
8170: 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  ize of the alloc
8180: 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d  ation for p->a[]
8190: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63   is not.  ** nec
81a0: 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72  essarily a power
81b0: 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33   of two, sqlite3
81c0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d  IdListAppend() m
81d0: 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ay not be called
81e0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70  .  ** on the dup
81f0: 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62  licate created b
8200: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
8210: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8220: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
8230: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
8240: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
8250: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
8260: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
8270: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
8280: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
8290: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
82a0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
82b0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
82c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
82d0: 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64  Item->idx = pOld
82e0: 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20  Item->idx;.  }. 
82f0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
8300: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
8310: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
8320: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c   *db, Select *p,
8330: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
8340: 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50  elect *pNew, *pP
8350: 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30  rior;.  if( p==0
8360: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8370: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
8380: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
8390: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
83a0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
83b0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  n 0;.  pNew->pEL
83c0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
83d0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
83e0: 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a  pEList, flags);.
83f0: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
8400: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
8410: 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c  (db, p->pSrc, fl
8420: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  ags);.  pNew->pW
8430: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
8440: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
8450: 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ere, flags);.  p
8460: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
8470: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8480: 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  up(db, p->pGroup
8490: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  By, flags);.  pN
84a0: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
84b0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
84c0: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
84d0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  gs);.  pNew->pOr
84e0: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
84f0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
8500: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67  ->pOrderBy, flag
8510: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  s);.  pNew->op =
8520: 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e   p->op;.  pNew->
8530: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20  pPrior = pPrior 
8540: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
8550: 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  up(db, p->pPrior
8560: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
8570: 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d  pPrior ) pPrior-
8580: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
8590: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
85a0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
85b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
85c0: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  p(db, p->pLimit,
85d0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
85e0: 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74  >pOffset = sqlit
85f0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
8600: 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29  >pOffset, flags)
8610: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
8620: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f   = 0;.  pNew->iO
8630: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65  ffset = 0;.  pNe
8640: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  w->selFlags = p-
8650: 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f  >selFlags & ~SF_
8660: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
8670: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
8680: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61  t = 0;.  pNew->a
8690: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
86a0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
86b0: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
86c0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
86d0: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
86e0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
86f0: 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a  }.#else.Select *
8700: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
8710: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
8720: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  lect *p, int fla
8730: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  gs){.  assert( p
8740: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
8750: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  0;.}.#endif.../*
8760: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
8770: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
8780: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
8790: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
87a0: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
87b0: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
87c0: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
87d0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
87e0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
87f0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
8800: 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65  curs, the entire
8810: 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20 61   list is freed a
8820: 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  nd.** NULL is re
8830: 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d  turned.  If non-
8840: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
8850: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
8860: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20  ranteed.** that 
8870: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61  the new entry wa
8880: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  s successfully a
8890: 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72  ppended..*/.Expr
88a0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
88b0: 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  rListAppend(.  P
88c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
88d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
88e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
88f0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8900: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
8910: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
8920: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
8930: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
8940: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r             /*
8950: 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   Expression to b
8960: 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68  e appended. Migh
8970: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
8980: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8990: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
89a0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
89b0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
89c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
89d0: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  , sizeof(ExprLis
89e0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
89f0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
8a00: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
8a10: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
8a20: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8a30: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
8a40: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
8a50: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d     if( pList->a=
8a60: 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
8a70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
8a80: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70  List->nExpr & (p
8a90: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d  List->nExpr-1))=
8aa0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
8ab0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8ac0: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
8ad0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
8ae0: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33  .    a = sqlite3
8af0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
8b00: 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
8b10: 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c  Expr*2*sizeof(pL
8b20: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
8b30: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
8b40: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
8b50: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
8b60: 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73  >a = a;.  }.  as
8b70: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
8b80: 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a  0 );.  if( 1 ){.
8b90: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
8ba0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
8bb0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
8bc0: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
8bd0: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
8be0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
8bf0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
8c00: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
8c10: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
8c20: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
8c30: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
8c40: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
8c50: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
8c60: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
8c70: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
8c80: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
8c90: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
8ca0: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
8cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
8cc0: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
8cd0: 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66  zName element of
8ce0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8cf0: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
8d00: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
8d10: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
8d20: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
8d30: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
8d40: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
8d50: 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76  pName should nev
8d60: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
8d70: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
8d80: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
8d90: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
8da0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
8db0: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
8dc0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
8dd0: 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72  stSetName(.  Par
8de0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8df0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
8e00: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8e10: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
8e20: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
8e30: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
8e40: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   span. */.  Toke
8e50: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
8e60: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62      /* Name to b
8e70: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
8e80: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
8e90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
8ea0: 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74  cause the name t
8eb0: 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f  o be dequoted */
8ec0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  .){.  assert( pL
8ed0: 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ist!=0 || pParse
8ee0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8ef0: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
8f00: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
8f10: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
8f20: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
8f30: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
8f40: 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  r>0 );.    pItem
8f50: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
8f60: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
8f70: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
8f80: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20  >zName==0 );.   
8f90: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
8fa0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
8fb0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
8fc0: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
8fd0: 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74  ;.    if( dequot
8fe0: 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  e && pItem->zNam
8ff0: 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f  e ) sqlite3Dequo
9000: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
9010: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
9020: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
9030: 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e  a[].zSpan elemen
9040: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
9050: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
9060: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
9070: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
9080: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
9090: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
90a0: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
90b0: 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64  But pSpan should
90c0: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
90d0: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
90e0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
90f0: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
9100: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
9110: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
9120: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
9130: 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20  prListSetSpan(. 
9140: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9150: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9160: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9170: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9180: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
9190: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
91a0: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
91b0: 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20  ExprSpan *pSpan 
91c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
91d0: 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20  pan to be added 
91e0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
91f0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
9210: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
9220: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
9230: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
9240: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9250: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
9260: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
9270: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
9280: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
9290: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  xpr>0 );.    ass
92a0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
92b0: 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e  ailed || pItem->
92c0: 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45  pExpr==pSpan->pE
92d0: 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  xpr );.    sqlit
92e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
92f0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
9300: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
9310: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
9320: 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e  db, (char*)pSpan
9330: 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20  ->zStart,.      
9340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
9360: 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20  nt)(pSpan->zEnd 
9370: 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29  - pSpan->zStart)
9380: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9390: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
93a0: 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f  n list pEList co
93b0: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
93c0: 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73   iLimit elements
93d0: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
93e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
93f0: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
9400: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
9410: 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72  eckLength(.  Par
9420: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
9430: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a  prList *pEList,.
9440: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
9450: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d  bject.){.  int m
9460: 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  x = pParse->db->
9470: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
9480: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74  MIT_COLUMN];.  t
9490: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
94a0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
94b0: 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61  ==mx );.  testca
94c0: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
94d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b  List->nExpr==mx+
94e0: 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  1 );.  if( pELis
94f0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
9500: 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c  pr>mx ){.    sql
9510: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9520: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
9530: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
9540: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
9550: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
9560: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
9570: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  n list..*/.void 
9580: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
9590: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
95a0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
95b0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
95c0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
95d0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
95e0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
95f0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
9600: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70  pList->a!=0 || p
9610: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29  List->nExpr==0 )
9620: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
9630: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
9640: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
9650: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
9660: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9670: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78  e(db, pItem->pEx
9680: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
9690: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
96a0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
96b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
96c0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
96d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
96e0: 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
96f0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
9700: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
9710: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  ./*.** These rou
9720: 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72  tines are Walker
9730: 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61 6c   callbacks.  Wal
9740: 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70 6f  ker.u.pi is a po
9750: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69  inter.** to an i
9760: 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65 20 72  nteger.  These r
9770: 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68 65 63  outines are chec
9780: 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  king an expressi
9790: 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20  on to see.** if 
97a0: 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  it is a constant
97b0: 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e 75  .  Set *Walker.u
97c0: 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68 65 20  .pi to 0 if the 
97d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
97e0: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a   not constant..*
97f0: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
9800: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
9810: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
9820: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
9830: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
9840: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9850: 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  t().**     sqlit
9860: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
9870: 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20 20  NotJoin().**    
9880: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9890: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
98a0: 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  ().**.*/.static 
98b0: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
98c0: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
98d0: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
98e0: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
98f0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20 33  Walker->u.i is 3
9900: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
9910: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9920: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
9930: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
9940: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
9950: 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69   a join disquali
9960: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
9970: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
9980: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
9990: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
99a0: 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  ( pWalker->u.i==
99b0: 33 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  3 && ExprHasProp
99c0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
99d0: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
99e0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
99f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
9a00: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73  _Abort;.  }..  s
9a10: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
9a20: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
9a30: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
9a40: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
9a50: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
9a60: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
9a70: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c  .    ** and pWal
9a80: 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20  ker->u.i==2 */. 
9a90: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
9aa0: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
9ab0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29  Walker->u.i==2 )
9ac0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
9ad0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
9ae0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
9af0: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
9b00: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
9b10: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
9b20: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
9b30: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
9b40: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9b50: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
9b60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
9b70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
9b80: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
9b90: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
9ba0: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
9bb0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
9bc0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9bd0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
9be0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75        pWalker->u
9bf0: 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  .i = 0;.      re
9c00: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
9c10: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
9c20: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9c30: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
9c40: 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  T ); /* selectNo
9c50: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
9c60: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
9c70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
9c80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
9c90: 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  TS ); /* selectN
9ca0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
9cb0: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
9cc0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
9cd0: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
9ce0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
9cf0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  tNodeIsConstant(
9d00: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
9d10: 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
9d20: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
9d30: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
9d40: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d    pWalker->u.i =
9d50: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
9d60: 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63  _Abort;.}.static
9d70: 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
9d80: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
9d90: 69 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65  itFlag){.  Walke
9da0: 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
9db0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
9dc0: 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46  .  w.u.i = initF
9dd0: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
9de0: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
9df0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
9e00: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
9e10: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
9e20: 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74  onstant;.  sqlit
9e30: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
9e40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e  );.  return w.u.
9e50: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  i;.}../*.** Walk
9e60: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
9e70: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
9e80: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9e90: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
9ea0: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
9eb0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
9ec0: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
9ed0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
9ee0: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
9ef0: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
9f00: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
9f10: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
9f20: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
9f30: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
9f40: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
9f50: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
9f60: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
9f70: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
9f80: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
9f90: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
9fa0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
9fb0: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 1);.}../*.** W
9fc0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9fd0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9fe0: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9ff0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
a000: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
a010: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
a020: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
a030: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
a040: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
a050: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
a060: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
a070: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
a080: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
a090: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
a0a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
a0b0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
a0c0: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
a0d0: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
a0e0: 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 3);.}../*
a0f0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
a100: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
a110: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
a120: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
a130: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
a140: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
a150: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
a160: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
a170: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
a180: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
a190: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
a1a0: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
a1b0: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
a1c0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
a1d0: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
a1e0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
a1f0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
a200: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
a210: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
a220: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
a230: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
a240: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
a250: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
a260: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
a270: 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d  IsConst(p, 2);.}
a280: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
a290: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
a2a0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
a2b0: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
a2c0: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
a2d0: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
a2e0: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
a2f0: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
a300: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
a310: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
a320: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
a330: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
a340: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
a350: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
a360: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
a370: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
a380: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
a390: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
a3a0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
a3b0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
a3c0: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
a3d0: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
a3e0: 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  rc = 0;..  /* If
a3f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
a400: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
a410: 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
a420: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
a430: 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
a440: 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
a450: 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
a460: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
a470: 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
a480: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
a490: 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
a4a0: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
a4b0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
a4c0: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
a4d0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
a4e0: 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
a4f0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
a500: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
a510: 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
a520: 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
a530: 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
a540: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
a550: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
a560: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a570: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
a580: 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
a590: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a5a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a5b0: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
a5c0: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
a5d0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
a5e0: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
a5f0: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
a600: 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
a610: 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
a620: 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
a630: 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
a640: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
a650: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a660: 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
a670: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
a680: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
a690: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
a6a0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
a6b0: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
a6c0: 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
a6d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
a6e0: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
a6f0: 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
a700: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
a710: 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
a720: 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
a730: 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
a740: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
a750: 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
a760: 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
a770: 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
a780: 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
a790: 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
a7a0: 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
a7b0: 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
a7c0: 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
a7d0: 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
a7e0: 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
a7f0: 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
a800: 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
a810: 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
a820: 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
a830: 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
a840: 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
a850: 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
a860: 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
a870: 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
a880: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
a890: 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
a8a0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
a8b0: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
a8c0: 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
a8d0: 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
a8e0: 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
a8f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
a900: 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
a910: 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
a920: 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
a930: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
a940: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
a950: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
a960: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
a970: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
a980: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
a990: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
a9a0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
a9b0: 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
a9c0: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
a9d0: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
a9e0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  :.    case TK_BL
a9f0: 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
aa00: 20 30 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   0;.    default:
aa10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
aa20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
aa30: 6e 65 72 61 74 65 20 61 6e 20 4f 50 5f 49 73 4e  nerate an OP_IsN
aa40: 75 6c 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ull instruction 
aa50: 74 68 61 74 20 74 65 73 74 73 20 72 65 67 69 73  that tests regis
aa60: 74 65 72 20 69 52 65 67 20 61 6e 64 20 6a 75 6d  ter iReg and jum
aa70: 70 73 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 69 6f  ps.** to locatio
aa80: 6e 20 69 44 65 73 74 20 69 66 20 74 68 65 20 76  n iDest if the v
aa90: 61 6c 75 65 20 69 6e 20 69 52 65 67 20 69 73 20  alue in iReg is 
aaa0: 4e 55 4c 4c 2e 20 20 54 68 65 20 76 61 6c 75 65  NULL.  The value
aab0: 20 69 6e 20 69 52 65 67 20 0a 2a 2a 20 77 61 73   in iReg .** was
aac0: 20 63 6f 6d 70 75 74 65 64 20 62 79 20 70 45 78   computed by pEx
aad0: 70 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 6c  pr.  If we can l
aae0: 6f 6f 6b 20 61 74 20 70 45 78 70 72 20 61 74 20  ook at pExpr at 
aaf0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e 64  compile-time and
ab00: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 74 68  .** determine th
ab10: 61 74 20 69 74 20 63 61 6e 20 6e 65 76 65 72 20  at it can never 
ab20: 67 65 6e 65 72 61 74 65 20 61 20 4e 55 4c 4c 2c  generate a NULL,
ab30: 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 49 73 4e   then the OP_IsN
ab40: 75 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  ull operation.**
ab50: 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e   can be omitted.
ab60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ab70: 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
ab80: 6d 70 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  mp(.  Vdbe *v,  
ab90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
aba0: 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
abb0: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  truction */.  co
abc0: 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72 2c  nst Expr *pExpr,
abd0: 20 20 2f 2a 20 4f 6e 6c 79 20 67 65 6e 65 72 61    /* Only genera
abe0: 74 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 66 20  te OP_IsNull if 
abf0: 74 68 69 73 20 65 78 70 72 20 63 61 6e 20 62 65  this expr can be
ac00: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69   NULL */.  int i
ac10: 52 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Reg,           /
ac20: 2a 20 54 65 73 74 20 74 68 65 20 76 61 6c 75 65  * Test the value
ac30: 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
ac40: 72 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r for NULL */.  
ac50: 69 6e 74 20 69 44 65 73 74 20 20 20 20 20 20 20  int iDest       
ac60: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
ac70: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
ac80: 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 66   null */.){.  if
ac90: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
aca0: 42 65 4e 75 6c 6c 28 70 45 78 70 72 29 20 29 7b  BeNull(pExpr) ){
acb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
acc0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
acd0: 75 6c 6c 2c 20 69 52 65 67 2c 20 69 44 65 73 74  ull, iReg, iDest
ace0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
acf0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
ad00: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
ad10: 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
ad20: 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
ad30: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
ad40: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
ad50: 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
ad60: 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
ad70: 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
ad80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ad90: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
ada0: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
adb0: 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
adc0: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
add0: 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
ade0: 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
adf0: 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
ae00: 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
ae10: 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
ae20: 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
ae30: 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
ae40: 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
ae50: 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
ae60: 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
ae70: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
ae80: 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
ae90: 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
aea0: 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
aeb0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72 65  TE_AFF_NONE ) re
aec0: 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
aed0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
aee0: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
aef0: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
af00: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
af10: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
af20: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
af30: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
af40: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
af50: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
af60: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
af70: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
af80: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
af90: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
afa0: 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
afb0: 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
afc0: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
afd0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
afe0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
aff0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
b000: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
b010: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
b020: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
b030: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
b040: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
b050: 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
b060: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
b070: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
b080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b090: 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
b0a0: 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
b0b0: 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
b0c0: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
b0d0: 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
b0e0: 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
b0f0: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
b100: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
b110: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
b120: 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
b130: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
b140: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
b150: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
b160: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
b170: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
b180: 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
b190: 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
b1a0: 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
b1b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
b1c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
b1d0: 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
b1e0: 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
b1f0: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
b200: 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
b210: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
b220: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
b230: 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
b240: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
b250: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b260: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b270: 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65  e if we are able
b280: 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72 61   to the IN opera
b290: 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  tor optimization
b2a0: 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20 6f   on a.** query o
b2b0: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
b2c0: 20 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c         x IN (SEL
b2d0: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57  ECT ...).**.** W
b2e0: 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 2e  here the SELECT.
b2f0: 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73 20  .. clause is as 
b300: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
b310: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
b320: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a  is.** routine..*
b330: 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74 20  *.** The Select 
b340: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 69 6e  object passed in
b350: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
b360: 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64 20 61  n preprocessed a
b370: 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73 20  nd no.** errors 
b380: 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e  have been found.
b390: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
b3a0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b3b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 43 61  .static int isCa
b3c0: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
b3d0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
b3e0: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45  cList *pSrc;.  E
b3f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
b400: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
b410: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
b420: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
b430: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68           /* righ
b440: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49  t-hand side of I
b450: 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  N is SELECT */. 
b460: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
b470: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
b480: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61          /* Not a
b490: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
b4a0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
b4b0: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
b4c0: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
b4d0: 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  e) ){.    testca
b4e0: 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
b4f0: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
b500: 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
b510: 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
b520: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
b530: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
b540: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
b550: 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
b560: 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74  egate );.    ret
b570: 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53  urn 0; /* No DIS
b580: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e  TINCT keyword an
b590: 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  d no aggregate f
b5a0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a  unctions */.  }.
b5b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
b5c0: 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20  oupBy==0 );     
b5d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
b5e0: 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
b5f0: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  se */.  if( p->p
b600: 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
b610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b620: 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63  * Has no LIMIT c
b630: 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lause */.  asser
b640: 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
b650: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
b660: 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65    /* No LIMIT me
b670: 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f  ans no OFFSET */
b680: 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
b690: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
b6a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
b6b0: 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
b6c0: 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   */.  pSrc = p->
b6d0: 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
b6e0: 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSrc!=0 );.  if(
b6f0: 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
b700: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
b710: 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65      /* Single te
b720: 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  rm in FROM claus
b730: 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  e */.  if( pSrc-
b740: 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20  >a[0].pSelect ) 
b750: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
b760: 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73   FROM is not a s
b770: 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20  ubquery or view 
b780: 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  */.  pTab = pSrc
b790: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69  ->a[0].pTab;.  i
b7a0: 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30  f( NEVER(pTab==0
b7b0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
b7c0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
b7d0: 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20  elect==0 );     
b7e0: 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
b7f0: 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76  lause is not a v
b800: 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  iew */.  if( IsV
b810: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
b820: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
b830: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e  /* FROM clause n
b840: 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
b850: 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  le */.  pEList =
b860: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
b870: 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
b880: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
b890: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75       /* One colu
b8a0: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
b8b0: 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70 45   set */.  if( pE
b8c0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
b8d0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
b8e0: 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52  ) return 0; /* R
b8f0: 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d  esult is a colum
b900: 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b  n */.  return 1;
b910: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
b920: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b930: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  Y */../*.** Code
b940: 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   an OP_Once inst
b950: 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f  ruction and allo
b960: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69  cate space for i
b970: 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20  ts flag. Return 
b980: 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  the .** address 
b990: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
b9a0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  uction..*/.int s
b9b0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50  qlite3CodeOnce(P
b9c0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
b9d0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
b9e0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
b9f0: 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75  );      /* Virtu
ba00: 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
ba10: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75   coded */.  retu
ba20: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
ba30: 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c  dOp1(v, OP_Once,
ba40: 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b   pParse->nOnce++
ba50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
ba60: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
ba70: 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
ba80: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
ba90: 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  N (...) operator
baa0: 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61  ..** The pX para
bab0: 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70  meter is the exp
bac0: 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52  ression on the R
bad0: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
bae0: 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20  rator, which.** 
baf0: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
bb00: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
bb10: 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75  sions or a subqu
bb20: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ery..**.** The j
bb30: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
bb40: 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ne is to find or
bb50: 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
bb60: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e   object that can
bb70: 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68  .** be used eith
bb80: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
bb90: 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65  embership in the
bba0: 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69   RHS set or to i
bbb0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a  terate through.*
bbc0: 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  * all members of
bbd0: 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b   the RHS set, sk
bbe0: 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
bbf0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f  s..**.** A curso
bc00: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  r is opened on t
bc10: 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
bc20: 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6f 66   that the RHS of
bc30: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
bc40: 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62  .** and pX->iTab
bc50: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  le is set to the
bc60: 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
bc70: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
bc80: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
bc90: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
bca0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62   indicates the b
bcb0: 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66  -tree type, as f
bcc0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
bcd0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20  IN_INDEX_ROWID  
bce0: 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
bcf0: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
bd00: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
bd10: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
bd20: 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20  NDEX_ASC  - The 
bd30: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
bd40: 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e  d on an ascendin
bd50: 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
bd60: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
bd70: 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77  C - The cursor w
bd80: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
bd90: 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  escending index.
bda0: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
bdb0: 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65 20  PH        - The 
bdc0: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
bdd0: 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79  d on a specially
bde0: 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65          populate
be10: 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  d epheremal tabl
be20: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  e..**.** An exis
be30: 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
be40: 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
be50: 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
be60: 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
be70: 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
be80: 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
be90: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
bea0: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  OM <table>.**.**
beb0: 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
bec0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
bed0: 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f  s a list or a mo
bee0: 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75  re complex subqu
bef0: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20  ery, then.** an 
bf00: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
bf10: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
bf20: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
bf30: 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e  the RHS and then
bf40: 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d  .** pX->iTable m
bf50: 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
bf60: 74 68 65 20 65 70 68 65 72 6d 65 72 61 6c 20 74  the ephermeral t
bf70: 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  able instead of 
bf80: 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74  an.** existing t
bf90: 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  able.  .**.** If
bfa0: 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20   the prNotFound 
bfb0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
bfc0: 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  then the b-tree 
bfd0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
bfe0: 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
bff0: 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  gh the set membe
c000: 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61 6e 79  rs, skipping any
c010: 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49 6e 20   duplicates. In 
c020: 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20  this case an.** 
c030: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
c040: 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c  must be used unl
c050: 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
c060: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61   <column> is gua
c070: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
c080: 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
c090: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
c0a0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
c0b0: 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20 68  Y KEY or it.** h
c0c0: 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73  as a UNIQUE cons
c0d0: 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51 55 45  traint or UNIQUE
c0e0: 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66   index..**.** If
c0f0: 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20   the prNotFound 
c100: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
c110: 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74   0, then the b-t
c120: 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
c130: 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65   .** for fast se
c140: 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
c150: 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ts. In this case
c160: 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   an epheremal ta
c170: 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20  ble must .** be 
c180: 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c  used unless <col
c190: 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47  umn> is an INTEG
c1a0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ER PRIMARY KEY o
c1b0: 72 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a  r an index can .
c1c0: 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68  ** be found with
c1d0: 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73   <column> as its
c1e0: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
c1f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  n..**.** When th
c200: 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e  e b-tree is bein
c210: 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65  g used for membe
c220: 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65  rship tests, the
c230: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
c240: 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 6b 6e  n.** needs to kn
c250: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
c260: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
c270: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c 20  contains an SQL 
c280: 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65 20 69  NULL .** value i
c290: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 72 72 65  n order to corre
c2a0: 63 74 6c 79 20 65 76 61 6c 75 61 74 65 20 65 78  ctly evaluate ex
c2b0: 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20 22  pressions like "
c2c0: 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a  X IN (Y, Z)"..**
c2d0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
c2e0: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
c2f0: 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e   (...) might con
c300: 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75  tain a NULL valu
c310: 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c  e at.** runtime,
c320: 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72   then a register
c330: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
c340: 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  d the register n
c350: 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a  umber written.**
c360: 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e   to *prNotFound.
c370: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
c380: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
c390: 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61  (...) contains a
c3a0: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  .** NULL value, 
c3b0: 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  then *prNotFound
c3c0: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
c3d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
c3e0: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
c3f0: 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
c400: 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
c410: 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65  *prNotFound, the
c420: 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69 61 6c  n.** its initial
c430: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20   value is NULL. 
c440: 20 49 66 20 74 68 65 20 28 2e 2e 2e 29 20 64 6f   If the (...) do
c450: 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e 20 63 6f  es not remain co
c460: 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 74 68  nstant.** for th
c470: 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20 74 68  e duration of th
c480: 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20 74 68  e query (i.e. th
c490: 65 20 53 45 4c 45 43 54 20 77 69 74 68 69 6e 20  e SELECT within 
c4a0: 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20 69 73 20  the (...).** is 
c4b0: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
c4c0: 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 65 20  query) then the 
c4d0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 6c  value of the all
c4e0: 6f 63 61 74 65 64 20 72 65 67 69 73 74 65 72 20  ocated register 
c4f0: 69 73 0a 2a 2a 20 72 65 73 65 74 20 74 6f 20 4e  is.** reset to N
c500: 55 4c 4c 20 65 61 63 68 20 74 69 6d 65 20 74 68  ULL each time th
c510: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 72 65  e subquery is re
c520: 72 75 6e 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  run. This allows
c530: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74   the.** caller t
c540: 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64 65 20  o use vdbe code 
c550: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
c560: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
c570: 2a 2a 20 20 20 69 66 28 20 72 65 67 69 73 74 65  **   if( registe
c580: 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20  r==NULL ){.**   
c590: 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65    has_null = <te
c5a0: 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63  st if data struc
c5b0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75  ture contains nu
c5c0: 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67 69 73  ll>.**     regis
c5d0: 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a  ter = 1.**   }.*
c5e0: 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  *.** in order to
c5f0: 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67 20 74   avoid running t
c600: 68 65 20 3c 74 65 73 74 20 69 66 20 64 61 74 61  he <test if data
c610: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
c620: 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73  ins null>.** tes
c630: 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  t more often tha
c640: 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  n is necessary..
c650: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c660: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
c670: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49  int sqlite3FindI
c680: 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  nIndex(Parse *pP
c690: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20  arse, Expr *pX, 
c6a0: 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29  int *prNotFound)
c6b0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
c6e0: 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
c6f0: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
c700: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
c710: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
c730: 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
c740: 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
c750: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
c760: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
c770: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
c780: 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
c790: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
c7a0: 65 55 6e 69 71 75 65 20 3d 20 28 70 72 4e 6f 74  eUnique = (prNot
c7b0: 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a 20  Found==0);   /* 
c7c0: 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
c7d0: 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
c7e0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
c7f0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
c800: 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
c810: 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
c820: 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
c830: 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
c840: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
c850: 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69  to see if an exi
c860: 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
c870: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
c880: 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79   to.  ** satisfy
c890: 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
c8a0: 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20  s is preferable 
c8b0: 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  to generating a 
c8c0: 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65  new .  ** epheme
c8d0: 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ral table..  */.
c8e0: 20 20 70 20 3d 20 28 45 78 70 72 48 61 73 50 72    p = (ExprHasPr
c8f0: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
c900: 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78  sSelect) ? pX->x
c910: 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20  .pSelect : 0);. 
c920: 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 72   if( ALWAYS(pPar
c930: 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20  se->nErr==0) && 
c940: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
c950: 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71  Opt(p) ){.    sq
c960: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c970: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
c980: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
c990: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
c9a0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
c9d0: 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
c9e0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20     Expr *pExpr; 
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
ca10: 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e  ression <column>
ca20: 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 43 6f 6c   */.    i16 iCol
ca30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca50: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
ca60: 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20  n <column> */.  
ca70: 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20    i16 iDb;      
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
caa0: 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61  base idx for pTa
cab0: 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  b */..    assert
cac0: 28 20 70 20 29 3b 20 20 20 20 20 20 20 20 20 20  ( p );          
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cae0: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
caf0: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
cb00: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
cb10: 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
cb20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
cb30: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
cb40: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
cb50: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
cb60: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ( p->pEList->a[0
cb70: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a  ].pExpr!=0 ); /*
cb80: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
cb90: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
cba0: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
cbb0: 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20  ( p->pSrc!=0 ); 
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cbd0: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
cbe0: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
cbf0: 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d  p) */.    pTab =
cc00: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
cc10: 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20 3d  Tab;.    pExpr =
cc20: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
cc30: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c  .pExpr;.    iCol
cc40: 20 3d 20 28 69 31 36 29 70 45 78 70 72 2d 3e 69   = (i16)pExpr->i
cc50: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20  Column;.   .    
cc60: 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 56 65  /* Code an OP_Ve
cc70: 72 69 66 79 43 6f 6f 6b 69 65 20 61 6e 64 20 4f  rifyCookie and O
cc80: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
cc90: 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
cca0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
ccb0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
ccc0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
ccd0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
cce0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
ccf0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
cd00: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
cd10: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
cd20: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
cd30: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
cd40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
cd50: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
cd60: 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e  m two places. In
cd70: 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20   both cases the 
cd80: 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  vdbe.    ** has 
cd90: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
cda0: 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d  ocated. So assum
cdb0: 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  e sqlite3GetVdbe
cdc0: 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20  () is always.   
cdd0: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68   ** successful h
cde0: 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
cdf0: 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69  assert(v);.    i
ce00: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
ce10: 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 0a 20     int iAddr;.. 
ce20: 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c       iAddr = sql
ce30: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
ce40: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  rse);..      sql
ce50: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
ce60: 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
ce70: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
ce80: 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
ce90: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
cea0: 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D;..      sqlite
ceb0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
cec0: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
ced0: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
cee0: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cf00: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
cf10: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ble */..      /*
cf20: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
cf30: 65 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20  equence used by 
cf40: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
cf50: 49 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74  If an index is t
cf60: 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73  o.      ** be us
cf70: 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
cf80: 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20   temp-table, it 
cf90: 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20  must be ordered 
cfa0: 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20  according.      
cfb0: 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61  ** to this colla
cfc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20  tion sequence.  
cfd0: 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
cfe0: 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33   *pReq = sqlite3
cff0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
d000: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
d010: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a  >pLeft, pExpr);.
d020: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
d030: 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
d040: 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
d050: 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  sed to perform t
d060: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  he .      ** com
d070: 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
d080: 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
d090: 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ity of the colum
d0a0: 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69  n. If.      ** i
d0b0: 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20  t is not, it is 
d0c0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
d0d0: 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20  use any index.. 
d0e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
d0f0: 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
d100: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
d110: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d  nityOk(pX, pTab-
d120: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69  >aCol[iCol].affi
d130: 6e 69 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f  nity);..      fo
d140: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
d150: 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
d160: 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74  pe==0 && affinit
d170: 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d  y_ok; pIdx=pIdx-
d180: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
d190: 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f   if( (pIdx->aiCo
d1a0: 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20  lumn[0]==iCol). 
d1b0: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
d1c0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
d1d0: 2c 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d  , ENC(db), pIdx-
d1e0: 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d  >azColl[0], 0)==
d1f0: 70 52 65 71 0a 20 20 20 20 20 20 20 20 20 26 26  pReq.         &&
d200: 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20   (!mustBeUnique 
d210: 7c 7c 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  || (pIdx->nKeyCo
d220: 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e  l==1 && pIdx->on
d230: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29  Error!=OE_None))
d240: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
d250: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b        int iAddr;
d260: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
d270: 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20  *pKey;.  .      
d280: 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72      pKey = (char
d290: 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   *)sqlite3IndexK
d2a0: 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
d2b0: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
d2c0: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  iAddr = sqlite3C
d2d0: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
d2e0: 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  .  .          sq
d2f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
d300: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
d310: 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  iTab, pIdx->tnum
d320: 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45        pKey,P4_KE
d350: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
d360: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
d370: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
d380: 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
d390: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
d3a0: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
d3b0: 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58  DESC == IN_INDEX
d3c0: 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a  _INDEX_ASC+1 );.
d3d0: 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
d3e0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
d3f0: 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f  _ASC + pIdx->aSo
d400: 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20 20 20  rtOrder[0];..   
d410: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d420: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
d430: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
d440: 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26  if( prNotFound &
d450: 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  & !pTab->aCol[iC
d460: 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20  ol].notNull ){. 
d470: 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 4e 6f             *prNo
d480: 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73  tFound = ++pPars
d490: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
d4a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d4b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
d4c0: 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e  l, 0, *prNotFoun
d4d0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
d4e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d4f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
d500: 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( eType==0 ){. 
d510: 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20     /* Could not 
d520: 66 6f 75 6e 64 20 61 6e 20 65 78 69 73 74 69 6e  found an existin
d530: 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
d540: 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52   to use as the R
d550: 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a  HS b-tree..    *
d560: 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74  * We will have t
d570: 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70  o generate an ep
d580: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
d590: 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20   do the job..   
d5a0: 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65   */.    u32 save
d5b0: 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
d5c0: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
d5d0: 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61  ;.    int rMayHa
d5e0: 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  veNull = 0;.    
d5f0: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
d600: 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 70 72  _EPH;.    if( pr
d610: 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20  NotFound ){.    
d620: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
d630: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b  rMayHaveNull = +
d640: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
d650: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d660: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
d670: 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e  l, 0, *prNotFoun
d680: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
d690: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
d6a0: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
d6b0: 70 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  p>0 );.      pPa
d6c0: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
d6d0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
d6e0: 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  X->pLeft->iColum
d6f0: 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50  n<0 && !ExprHasP
d700: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
d710: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
d720: 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
d730: 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20  INDEX_ROWID;.   
d740: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
d750: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
d760: 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20  ect(pParse, pX, 
d770: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54  rMayHaveNull, eT
d780: 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
d790: 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65  WID);.    pParse
d7a0: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73  ->nQueryLoop = s
d7b0: 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
d7c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d    }else{.    pX-
d7d0: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
d7e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79    }.  return eTy
d7f0: 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  pe;.}.#endif../*
d800: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
d810: 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62  e for scalar sub
d820: 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20  queries used as 
d830: 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65  a subquery expre
d840: 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a  ssion, EXISTS,.*
d850: 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  * or IN operator
d860: 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  s.  Examples:.**
d870: 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20  .**     (SELECT 
d880: 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20  a FROM b)       
d890: 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a     -- subquery.*
d8a0: 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45  *     EXISTS (SE
d8b0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
d8c0: 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75   -- EXISTS subqu
d8d0: 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ery.**     x IN 
d8e0: 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
d8f0: 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
d900: 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
d910: 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
d920: 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
d930: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
d940: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
d950: 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
d960: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
d970: 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
d980: 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65  rameter describe
d990: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
d9a0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
d9b0: 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f  he IN.** operato
d9c0: 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a  r or subquery..*
d9d0: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
d9e0: 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e  r isRowid is non
d9f0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72  -zero, then expr
da00: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
da10: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
da20: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
da30: 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20  "<rowid> IN (?, 
da40: 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72  ?, ?)", where <r
da50: 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72  owid> is a refer
da60: 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20  ence.** to some 
da70: 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75  integer key colu
da80: 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d  mn of a table B-
da90: 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Tree. In this ca
daa0: 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e  se, use an.** in
dab0: 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73  tkey B-Tree to s
dac0: 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
dad0: 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69  IN(...) values i
dae0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
daf0: 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20  ual.** (slower) 
db00: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
db10: 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a  keys B-Tree..**.
db20: 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75  ** If rMayHaveNu
db30: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
db40: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
db50: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  the operation is
db60: 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61   an IN.** (not a
db70: 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
db80: 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  S) and that the 
db90: 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  RHS might contai
dba0: 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72  ns NULLs..** Fur
dbb0: 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e  thermore, the IN
dbc0: 20 69 73 20 69 6e 20 61 20 57 48 45 52 45 20 63   is in a WHERE c
dbd0: 6c 61 75 73 65 20 61 6e 64 20 74 68 61 74 20 77  lause and that w
dbe0: 65 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a  e really want.**
dbf0: 20 74 6f 20 69 74 65 72 61 74 65 20 6f 76 65 72   to iterate over
dc00: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
dc10: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f  IN operator in o
dc20: 72 64 65 72 20 74 6f 20 71 75 69 63 6b 6c 79 20  rder to quickly 
dc30: 6c 6f 63 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f  locate.** all co
dc40: 72 72 65 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20  rresponding LHS 
dc50: 65 6c 65 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74  elements.  All t
dc60: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
dc70: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a   is initialize.*
dc80: 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67  * the register g
dc90: 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65  iven by rMayHave
dca0: 4e 75 6c 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43  Null to NULL.  C
dcb0: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  alling routines 
dcc0: 77 69 6c 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72  will take.** car
dcd0: 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68  e of changing th
dce0: 69 73 20 72 65 67 69 73 74 65 72 20 76 61 6c 75  is register valu
dcf0: 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e to non-NULL if
dd00: 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c   the RHS is NULL
dd10: 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -free..**.** If 
dd20: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20  rMayHaveNull is 
dd30: 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
dd40: 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65   that the subque
dd50: 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ry is being used
dd60: 0a 2a 2a 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  .** for membersh
dd70: 69 70 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e  ip testing only.
dd80: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
dd90: 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
dda0: 20 61 6e 79 0a 2a 2a 20 72 65 67 69 73 74 65 72   any.** register
ddb0: 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  s to indicate th
ddc0: 65 20 70 72 65 73 65 6e 63 65 20 6f 72 20 61 62  e presence or ab
ddd0: 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f  sence of NULLs o
dde0: 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a  n the RHS..**.**
ddf0: 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72   For a SELECT or
de00: 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
de10: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67  , return the reg
de20: 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
de30: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20   the.** result. 
de40: 20 46 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72   For IN operator
de50: 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  s or if an error
de60: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 72 65 74   occurs, the ret
de70: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 30 2e 0a  urn value is 0..
de80: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
de90: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
dea0: 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53  int sqlite3CodeS
deb0: 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73  ubselect(.  Pars
dec0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ded0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
dee0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
def0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
df00: 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53      /* The IN, S
df10: 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53  ELECT, or EXISTS
df20: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
df30: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  nt rMayHaveNull,
df40: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
df50: 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  er that records 
df60: 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78  whether NULLs ex
df70: 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20  ist in RHS */.  
df80: 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20  int isRowid     
df90: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
dfa0: 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70  ue, LHS of IN op
dfb0: 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69  erator is a rowi
dfc0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65  d */.){.  int te
dfd0: 73 74 41 64 64 72 20 3d 20 2d 31 3b 20 20 20 20  stAddr = -1;    
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
e000: 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
e010: 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20  int rReg = 0;   
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
e040: 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75  ter storing resu
e050: 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20  lting */.  Vdbe 
e060: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
e070: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
e080: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
e090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
e0a0: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
e0b0: 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  h(pParse);..  /*
e0c0: 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20   This code must 
e0d0: 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e  be run in its en
e0e0: 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d  tirety every tim
e0f0: 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
e100: 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  red.  ** if any 
e110: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
e120: 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20   is true:.  **. 
e130: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
e140: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
e150: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
e160: 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a  bquery.  **    *
e170: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
e180: 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72   side is an expr
e190: 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
e1a0: 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73  aining variables
e1b0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61  .  **    *  We a
e1c0: 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67  re inside a trig
e1d0: 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ger.  **.  ** If
e1e0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
e1f0: 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65  e are false, the
e200: 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69  n we can run thi
e210: 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65  s code just once
e220: 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72  .  ** save the r
e230: 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73  esults, and reus
e240: 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  e the same resul
e250: 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
e260: 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  invocations..  *
e270: 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  /.  if( !ExprHas
e280: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
e290: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b  EP_VarSelect) ){
e2a0: 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20  .    testAddr = 
e2b0: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
e2c0: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 23 69  pParse);.  }..#i
e2d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e2e0: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20  T_EXPLAIN.  if( 
e2f0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
e300: 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
e310: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
e320: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70  rintf(.        p
e330: 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43  Parse->db, "EXEC
e340: 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52  UTE %s%s SUBQUER
e350: 59 20 25 64 22 2c 20 74 65 73 74 41 64 64 72 3e  Y %d", testAddr>
e360: 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45  =0?"":"CORRELATE
e370: 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78  D ",.        pEx
e380: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c  pr->op==TK_IN?"L
e390: 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20 70  IST":"SCALAR", p
e3a0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
e3b0: 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  ctId.    );.    
e3c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e3d0: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
e3e0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
e3f0: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
e400: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
e410: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63  .#endif..  switc
e420: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
e430: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
e440: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
e450: 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
e460: 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
e470: 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  of the LHS of th
e480: 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  e IN */.      in
e490: 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
e4a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
e4b0: 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
e4c0: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
e4d0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  tion */.      Ex
e4e0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
e4f0: 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65  r->pLeft; /* the
e500: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
e510: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
e520: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
e530: 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  fo = 0;      /* 
e540: 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Key information 
e550: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d  */..      if( rM
e560: 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20  ayHaveNull ){.  
e570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e580: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
e590: 6c 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e  ll, 0, rMayHaveN
e5a0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ull);.      }.. 
e5b0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
e5c0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
e5d0: 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20  ity(pLeft);..   
e5e0: 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68     /* Whether th
e5f0: 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53  is is an 'x IN(S
e600: 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e  ELECT...)' or an
e610: 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74   'x IN(<exprlist
e620: 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  >)'.      ** exp
e630: 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61  ression it is ha
e640: 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77  ndled the same w
e650: 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61  ay.  An ephemera
e660: 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20  l table is .    
e670: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
e680: 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e   single-field in
e690: 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
e6a0: 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
e6b0: 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
e6c0: 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68  the SELECT or th
e6d0: 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
e6e0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
e6f0: 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
e700: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
e710: 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
e720: 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
e730: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
e740: 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
e750: 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
e760: 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
e770: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
e780: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
e790: 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
e7a0: 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
e7b0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
e7c0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
e7d0: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
e7e0: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
e7f0: 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
e800: 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
e810: 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
e820: 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
e830: 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
e840: 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
e850: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
e860: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
e870: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
e880: 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
e890: 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
e8a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
e8b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
e8c0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
e8d0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
e8e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e8f0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
e900: 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  l, pExpr->iTable
e910: 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20  , !isRowid);.   
e920: 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e     if( rMayHaveN
e930: 75 6c 6c 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  ull==0 ) sqlite3
e940: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
e950: 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
e960: 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
e970: 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a   = isRowid ? 0 :
e980: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
e990: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
e9a0: 20 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69   1, 1);..      i
e9b0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
e9c0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
e9d0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
e9e0: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
e9f0: 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
ea00: 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
ea10: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
ea20: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
ea30: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
ea40: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
ea50: 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
ea60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
ea70: 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
ea80: 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
ea90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
eaa0: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
eab0: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
eac0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20  st *pEList;..   
ead0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
eae0: 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
eaf0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
eb00: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
eb10: 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
eb20: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64  able);.        d
eb30: 65 73 74 2e 61 66 66 53 64 73 74 20 3d 20 28 75  est.affSdst = (u
eb40: 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  8)affinity;.    
eb50: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78      assert( (pEx
eb60: 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30  pr->iTable&0x000
eb70: 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69  0FFFF)==pExpr->i
eb80: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  Table );.       
eb90: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
eba0: 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  t->iLimit = 0;. 
ebb0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
ebc0: 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20   pKeyInfo==0 ); 
ebd0: 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d  /* Caused by OOM
ebe0: 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e   in sqlite3KeyIn
ebf0: 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20  foAlloc() */.   
ec00: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
ec10: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
ec20: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
ec30: 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
ec40: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
ec50: 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
ec60: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
ec70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ec80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ec90: 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
eca0: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
ecb0: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
ecc0: 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
ecd0: 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
ece0: 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
ecf0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
ed00: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
ed10: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
ed20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ed30: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
ed40: 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  ;.        pKeyIn
ed50: 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  fo->aColl[0] = s
ed60: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
ed70: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
ed80: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
ed90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
edd0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
ede0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
edf0: 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
ee00: 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
ee10: 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
ee20: 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
ee30: 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a  list).        **
ee40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  .        ** For 
ee50: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c  each expression,
ee60: 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20   build an index 
ee70: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61  key from the eva
ee80: 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  luation and.    
ee90: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
eea0: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
eeb0: 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72   table. If <expr
eec0: 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  > is a column, t
eed0: 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20  hen use.        
eee0: 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
eef0: 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
ef00: 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
ef10: 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
ef20: 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
ef30: 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d   column, use num
ef40: 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20  eric affinity.. 
ef50: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
ef60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
ef70: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
ef80: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
ef90: 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  t;.        struc
efa0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
efb0: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20  *pItem;.        
efc0: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
efd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
efe0: 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
eff0: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
f000: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
f010: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f020: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
f030: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  {.          pKey
f040: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d  Info->aColl[0] =
f050: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
f060: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
f070: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
f080: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
f090: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
f0a0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
f0b0: 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a   <exprlist>. */.
f0c0: 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
f0d0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
f0e0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
f0f0: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
f100: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
f110: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f120: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f130: 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20  Null, 0, r2);.  
f140: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73        for(i=pLis
f150: 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
f160: 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
f170: 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
f180: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
f190: 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  2 = pItem->pExpr
f1a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
f1b0: 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20  iValToIns;..    
f1c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f1d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
f1e0: 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
f1f0: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
f200: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73            ** dis
f210: 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68  able the test th
f220: 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
f230: 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65   above that make
f240: 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20  s sure.         
f250: 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
f260: 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
f270: 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
f280: 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
f290: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
f2a0: 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
f2b0: 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
f2c0: 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
f2d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
f2e0: 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e     if( testAddr>
f2f0: 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
f300: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
f310: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
f320: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f330: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74  geToNoop(v, test
f340: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
f350: 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 2d 31     testAddr = -1
f360: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
f370: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
f380: 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
f390: 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
f3a0: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
f3b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
f3c0: 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26     if( isRowid &
f3d0: 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
f3e0: 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61  nteger(pE2, &iVa
f3f0: 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20  lToIns) ){.     
f400: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f410: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
f420: 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d  nsertInt, pExpr-
f430: 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61  >iTable, r2, iVa
f440: 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20  lToIns);.       
f450: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f460: 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
f470: 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
f480: 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31  (pParse, pE2, r1
f490: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
f4a0: 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20  f( isRowid ){.  
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f4c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f4d0: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
f4e0: 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
f510: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
f520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
f530: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f540: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
f550: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
f560: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20  , r3);.         
f570: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f580: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f590: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
f5a0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20  MakeRecord, r3, 
f5b0: 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79  1, r2, &affinity
f5c0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
f5d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
f5e0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
f5f0: 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31  ge(pParse, r3, 1
f600: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f610: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f620: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
f630: 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
f640: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  e, r2);.        
f650: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f660: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
f670: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
f680: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
f690: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
f6a0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
f6b0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
f6c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f6d0: 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
f6e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f6f0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
f700: 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65  ddr, (void *)pKe
f710: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
f720: 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
f730: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f740: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
f750: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
f760: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
f770: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
f780: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
f790: 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c  has to be a scal
f7a0: 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65  ar SELECT.  Gene
f7b0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74  rate code to put
f7c0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61   the.      ** va
f7d0: 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65  lue of this sele
f7e0: 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63  ct in a memory c
f7f0: 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74  ell and record t
f800: 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  he number.      
f810: 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79  ** of the memory
f820: 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e   cell in iColumn
f830: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  .  If this is an
f840: 20 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20   EXISTS, write. 
f850: 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67       ** an integ
f860: 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73  er 0 (not exists
f870: 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 20  ) or 1 (exists) 
f880: 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65  into a memory ce
f890: 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ll.      ** and 
f8a0: 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f  record that memo
f8b0: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
f8c0: 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  mn..      */.   
f8d0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b     Select *pSel;
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
f900: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
f910: 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  encode */.      
f920: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
f950: 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74  deal with SELECt
f960: 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20   result */..    
f970: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
f980: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
f990: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f9a0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
f9b0: 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
f9c0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
f9d0: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c  >op==TK_EXISTS |
f9e0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
f9f0: 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20  SELECT );..     
fa00: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
fa10: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
fa20: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
fa30: 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45  .      pSel = pE
fa40: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
fa50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
fa60: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
fa70: 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e  t, 0, ++pParse->
fa80: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  nMem);.      if(
fa90: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
faa0: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  ELECT ){.       
fab0: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
fac0: 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73  T_Mem;.        s
fad0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fae0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
faf0: 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
fb00: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
fb10: 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62  nt((v, "Init sub
fb20: 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
fb30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fb40: 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
fb50: 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20   = SRT_Exists;. 
fb60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
fb70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
fb80: 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e  nteger, 0, dest.
fb90: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
fba0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
fbb0: 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72  , "Init EXISTS r
fbc0: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
fbd0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
fbe0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
fbf0: 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d  ->db, pSel->pLim
fc00: 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  it);.      pSel-
fc10: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
fc20: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
fc30: 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c  K_INTEGER, 0, 0,
fc40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f     &sqlite3IntTo
fc70: 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20  kens[1]);.      
fc80: 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pSel->iLimit = 0
fc90: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
fca0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
fcb0: 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29  , pSel, &dest) )
fcc0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
fcd0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
fce0: 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53    rReg = dest.iS
fcf0: 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70  DParm;.      Exp
fd00: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
fd10: 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
fd20: 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ce);.      break
fd30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
fd40: 66 28 20 74 65 73 74 41 64 64 72 3e 3d 30 20 29  f( testAddr>=0 )
fd50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fd60: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73  eJumpHere(v, tes
fd70: 74 41 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71  tAddr);.  }.  sq
fd80: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
fd90: 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 0a 20  p(pParse, 1);.. 
fda0: 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a   return rReg;.}.
fdb0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
fdc0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
fdd0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
fde0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
fdf0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
fe00: 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78  ode for an IN ex
fe10: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
fe20: 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
fe30: 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78  T ...).**      x
fe40: 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
fe50: 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  e, ...).**.** Th
fe60: 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
fe70: 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c   (LHS) is a scal
fe80: 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ar expression.  
fe90: 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
fea0: 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20  ide (RHS).** is 
feb0: 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
fec0: 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e   or more values.
fed0: 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
fee0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
fef0: 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69  LHS is.** contai
ff00: 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
ff10: 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f  HS.  The value o
ff20: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
ff30: 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c   is unknown (NUL
ff40: 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53  L).** if the LHS
ff50: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
ff60: 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  he LHS is not co
ff70: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
ff80: 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a  he RHS and the.*
ff90: 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f  * RHS contains o
ffa0: 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
ffb0: 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  values..**.** Th
ffc0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
ffd0: 61 74 65 73 20 63 6f 64 65 20 77 69 6c 6c 20 6a  ates code will j
ffe0: 75 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c  ump to destIfFal
fff0: 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  se if the LHS is
10000 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e   not .** contain
10010 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
10020 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55  S.  If due to NU
10030 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  LLs we cannot de
10040 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c  termine if the L
10050 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e  HS.** is contain
10060 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68  ed in the RHS th
10070 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49  en jump to destI
10080 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c  fNull.  If the L
10090 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a  HS is contained.
100a0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ** within the RH
100b0 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  S then fall thro
100c0 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ugh..*/.static v
100d0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
100e0 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a  odeIN(.  Parse *
100f0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
10100 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
10110 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
10120 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
10130 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
10140 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65   /* The IN expre
10150 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
10160 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20  estIfFalse,     
10170 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
10180 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
10190 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
101a0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
101b0 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a  Null        /* J
101c0 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
101d0 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e  results are unkn
101e0 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  own due to NULLs
101f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68   */.){.  int rRh
10200 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f  sHasNull = 0;  /
10210 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
10220 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63  is true if RHS c
10230 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
10240 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 61 66  ues */.  char af
10250 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 2f  finity;        /
10260 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66  * Comparison aff
10270 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a  inity to use */.
10280 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20    int eType;    
10290 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
102a0 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  of the RHS */.  
102b0 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20  int r1;         
102c0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
102d0 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20  ry use register 
102e0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
102f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
10300 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
10310 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
10320 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
10330 52 48 53 2e 20 20 20 41 66 74 65 72 20 74 68 69  RHS.   After thi
10340 73 20 73 74 65 70 2c 20 74 68 65 20 74 61 62 6c  s step, the tabl
10350 65 20 77 69 74 68 20 63 75 72 73 6f 72 0a 20 20  e with cursor.  
10360 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ** pExpr->iTable
10370 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74   will contains t
10380 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
10390 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 0a  ake up the RHS..
103a0 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73    */.  v = pPars
103b0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
103c0 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
103d0 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65    /* OOM detecte
103e0 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  d prior to this 
103f0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62  routine */.  Vdb
10400 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
10410 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22   "begin IN expr"
10420 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71  ));.  eType = sq
10430 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
10440 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
10450 26 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a  &rRhsHasNull);..
10460 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
10470 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
10480 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
10490 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
104a0 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ults.  ** of the
104b0 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66   expression. aff
104c0 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20  inityStr stores 
104d0 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
104e0 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a  suitable for.  *
104f0 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52  * P4 of OP_MakeR
10500 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66  ecord..  */.  af
10510 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69  finity = compari
10520 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
10530 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74  r);..  /* Code t
10540 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70  he LHS, the <exp
10550 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
10560 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a  IN (...)"..  */.
10570 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
10580 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
10590 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
105a0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
105b0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
105c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
105d0 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a  r->pLeft, r1);..
105e0 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20    /* If the LHS 
105f0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
10600 65 20 72 65 73 75 6c 74 20 69 73 20 65 69 74 68  e result is eith
10610 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c  er false or NULL
10620 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20   depending.  ** 
10630 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 20 52  on whether the R
10640 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72 20 6e  HS is empty or n
10650 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  ot, respectively
10660 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  ..  */.  if( des
10670 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
10680 61 6c 73 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53  alse ){.    /* S
10690 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20  hortcut for the 
106a0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
106b0 65 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64 20  e the false and 
106c0 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72  NULL outcomes ar
106d0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  e.    ** the sam
106e0 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
106f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10700 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65  P_IsNull, r1, de
10710 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c  stIfNull);.  }el
10720 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  se{.    int addr
10730 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
10740 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
10750 75 6c 6c 2c 20 72 31 29 3b 0a 20 20 20 20 73 71  ull, r1);.    sq
10760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10770 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45  v, OP_Rewind, pE
10780 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
10790 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 73  tIfFalse);.    s
107a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
107b0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
107c0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
107d0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
107e0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
107f0 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
10800 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
10810 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
10820 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53  is case, the RHS
10830 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66   is the ROWID of
10840 20 74 61 62 6c 65 20 62 2d 74 72 65 65 0a 20 20   table b-tree.  
10850 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
10860 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10870 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20  _MustBeInt, r1, 
10880 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
10890 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
108a0 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
108b0 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  sts, pExpr->iTab
108c0 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
108d0 20 72 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   r1);.  }else{. 
108e0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
108f0 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 61  se, the RHS is a
10900 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a  n index b-tree..
10910 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
10920 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
10930 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 31 2c  OP_Affinity, r1,
10940 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79   1, 0, &affinity
10950 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  , 1);..    /* If
10960 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73   the set members
10970 68 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20  hip test fails, 
10980 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
10990 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22  of the .    ** "
109a0 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72  x IN (...)" expr
109b0 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  ession must be e
109c0 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e  ither 0 or NULL.
109d0 20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20 20   If the set.    
109e0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e  ** contains no N
109f0 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e  ULL values, then
10a00 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30   the result is 0
10a10 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a 20 20  . If the set .  
10a20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e    ** contains on
10a30 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
10a40 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20  alues, then the 
10a50 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
10a60 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
10a70 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20  is also NULL..  
10a80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 52 68    */.    if( rRh
10a90 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20 64  sHasNull==0 || d
10aa0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
10ab0 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
10ac0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
10ad0 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f  uns if it is kno
10ae0 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  wn at compile ti
10af0 6d 65 20 74 68 61 74 20 74 68 65 20 52 48 53 0a  me that the RHS.
10b00 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20        ** cannot 
10b10 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c  contain NULL val
10b20 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ues. This happen
10b30 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a  s as the result.
10b40 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e        ** of a "N
10b50 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
10b60 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  int in the datab
10b70 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
10b80 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
10b90 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72 61 6e  so run this bran
10ba0 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20 65 71  ch if NULL is eq
10bb0 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53  uivalent to FALS
10bc0 45 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  E.      ** for t
10bd0 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 49  his particular I
10be0 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
10bf0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
10c00 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
10c10 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
10c20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
10c30 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c 20  estIfFalse, r1, 
10c40 31 29 3b 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1);..    }else{.
10c50 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
10c60 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48 53   branch, the RHS
10c70 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68 74   of the IN might
10c80 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20   contain a NULL 
10c90 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  and.      ** the
10ca0 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 4e   presence of a N
10cb0 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20 6d  ULL on the RHS m
10cc0 61 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e 63  akes a differenc
10cd0 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  e in the.      *
10ce0 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20  * outcome..     
10cf0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31   */.      int j1
10d00 2c 20 6a 32 2c 20 6a 33 3b 0a 0a 20 20 20 20 20  , j2, j3;..     
10d10 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   /* First check 
10d20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48  to see if the LH
10d30 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  S is contained i
10d40 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 73  n the RHS.  If s
10d50 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  o,.      ** then
10d60 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
10d70 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48   NULLs in the RH
10d80 53 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  S does not matte
10d90 72 2c 20 73 6f 20 6a 75 6d 70 0a 20 20 20 20 20  r, so jump.     
10da0 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20   ** over all of 
10db0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f  the code that fo
10dc0 6c 6c 6f 77 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  llows..      */.
10dd0 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
10de0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
10df0 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
10e00 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72  pr->iTable, 0, r
10e10 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  1, 1);..      /*
10e20 20 48 65 72 65 20 77 65 20 62 65 67 69 6e 20 67   Here we begin g
10e30 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74  enerating code t
10e40 68 61 74 20 72 75 6e 73 20 69 66 20 74 68 65 20  hat runs if the 
10e50 4c 48 53 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  LHS is not.     
10e60 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69   ** contained wi
10e70 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 47  thin the RHS.  G
10e80 65 6e 65 72 61 74 65 20 61 64 64 69 74 69 6f 6e  enerate addition
10e90 61 6c 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20  al code that.   
10ea0 20 20 20 2a 2a 20 74 65 73 74 73 20 74 68 65 20     ** tests the 
10eb0 52 48 53 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20  RHS for NULLs.  
10ec0 49 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61  If the RHS conta
10ed0 69 6e 73 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a  ins a NULL then.
10ee0 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f        ** jump to
10ef0 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66   destIfNull.  If
10f00 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4e 55   there are no NU
10f10 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 74  LLs in the RHS t
10f20 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d  hen.      ** jum
10f30 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65  p to destIfFalse
10f40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10f50 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
10f60 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
10f70 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75  tNull, rRhsHasNu
10f80 6c 6c 29 3b 0a 20 20 20 20 20 20 6a 33 20 3d 20  ll);.      j3 = 
10f90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10fa0 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
10fb0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10fc0 20 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c   0, rRhsHasNull,
10fd0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
10fe0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10ff0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
11000 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20  rRhsHasNull);.  
11010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
11020 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a  umpHere(v, j3);.
11030 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11040 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
11050 64 49 6d 6d 2c 20 72 52 68 73 48 61 73 4e 75 6c  dImm, rRhsHasNul
11060 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  l, 1);.      sql
11070 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11080 28 76 2c 20 6a 32 29 3b 0a 0a 20 20 20 20 20 20  (v, j2);..      
11090 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 61  /* Jump to the a
110a0 70 70 72 6f 70 72 69 61 74 65 20 74 61 72 67 65  ppropriate targe
110b0 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  t depending on w
110c0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20  hether or not.  
110d0 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 63      ** the RHS c
110e0 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 20  ontains a NULL. 
110f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
11100 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11110 76 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73 48 61  v, OP_If, rRhsHa
11120 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  sNull, destIfNul
11130 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
11140 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11150 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
11160 66 46 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20  fFalse);..      
11170 2f 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20  /* The OP_Found 
11180 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
11190 69 73 20 62 72 61 6e 63 68 20 6a 75 6d 70 73 20  is branch jumps 
111a0 68 65 72 65 20 77 68 65 6e 20 74 72 75 65 2c 20  here when true, 
111b0 0a 20 20 20 20 20 20 2a 2a 20 63 61 75 73 69 6e  .      ** causin
111c0 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e  g the overall IN
111d0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
111e0 75 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74  uation to fall t
111f0 68 72 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f  hrough..      */
11200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11210 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
11220 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
11230 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
11240 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
11250 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
11260 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
11270 31 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  1);.  VdbeCommen
11280 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78  t((v, "end IN ex
11290 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  pr"));.}.#endif 
112a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
112b0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
112c0 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38  * Duplicate an 8
112d0 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73  -byte value.*/.s
112e0 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70 38  tatic char *dup8
112f0 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63  bytes(Vdbe *v, c
11300 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a  onst char *in){.
11310 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71    char *out = sq
11320 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
11330 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
11340 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74  ), 8);.  if( out
11350 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f   ){.    memcpy(o
11360 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a  ut, in, 8);.  }.
11370 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a    return out;.}.
11380 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11390 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
113a0 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  INT./*.** Genera
113b0 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
113c0 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
113d0 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  the floating poi
113e0 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63  nt.** value desc
113f0 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d  ribed by z[0..n-
11400 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
11410 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iMem..**.** The
11420 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c   z[] string will
11430 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65   probably not be
11440 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
11450 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a  .  But the .** z
11460 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73  [n] character is
11470 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
11480 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  e something that
11490 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a   does not look.*
114a0 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69  * like the conti
114b0 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  nuation of the n
114c0 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
114d0 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56   void codeReal(V
114e0 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
114f0 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74  ar *z, int negat
11500 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  eFlag, int iMem)
11510 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a  {.  if( ALWAYS(z
11520 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62  !=0) ){.    doub
11530 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68  le value;.    ch
11540 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69  ar *zV;.    sqli
11550 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75  te3AtoF(z, &valu
11560 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
11570 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54  30(z), SQLITE_UT
11580 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  F8);.    assert(
11590 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76   !sqlite3IsNaN(v
115a0 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20  alue) ); /* The 
115b0 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72  new AtoF never r
115c0 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20  eturns NaN */.  
115d0 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67    if( negateFlag
115e0 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
115f0 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38  e;.    zV = dup8
11600 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
11610 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c  &value);.    sql
11620 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11630 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d  , OP_Real, 0, iM
11640 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45  em, 0, zV, P4_RE
11650 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  AL);.  }.}.#endi
11660 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  f.../*.** Genera
11670 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
11680 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
11690 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
116a0 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
116b0 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
116c0 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
116d0 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  .** Expr.u.zToke
116e0 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38  n is always UTF8
116f0 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e   and zero-termin
11700 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
11710 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72  void codeInteger
11720 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11730 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
11740 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d   negFlag, int iM
11750 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  em){.  Vdbe *v =
11760 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
11770 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
11780 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
11790 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
117a0 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b  pExpr->u.iValue;
117b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
117c0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67  0 );.    if( neg
117d0 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20  Flag ) i = -i;. 
117e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
117f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
11800 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
11810 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63  }else{.    int c
11820 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b  ;.    i64 value;
11830 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11840 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  *z = pExpr->u.zT
11850 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  oken;.    assert
11860 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20  ( z!=0 );.    c 
11870 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  = sqlite3Atoi64(
11880 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74  z, &value, sqlit
11890 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53  e3Strlen30(z), S
118a0 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
118b0 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d   if( c==0 || (c=
118c0 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29  =2 && negFlag) )
118d0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  {.      char *zV
118e0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46  ;.      if( negF
118f0 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63  lag ){ value = c
11900 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  ==2 ? SMALLEST_I
11910 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d  NT64 : -value; }
11920 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38  .      zV = dup8
11930 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
11940 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73  &value);.      s
11950 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11960 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
11970 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34   iMem, 0, zV, P4
11980 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
11990 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
119a0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
119b0 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
119c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
119d0 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
119e0 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
119f0 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
11a00 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20  ", z);.#else.   
11a10 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a     codeReal(v, z
11a20 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29  , negFlag, iMem)
11a30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
11a40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61   }.}../*.** Clea
11a50 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e  r a cache entry.
11a60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11a70 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
11a80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
11a90 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
11aa0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65  *p){.  if( p->te
11ab0 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28  mpReg ){.    if(
11ac0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
11ad0 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
11ae0 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
11af0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
11b00 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
11b10 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d  nTempReg++] = p-
11b20 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  >iReg;.    }.   
11b30 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
11b40 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  .  }.}.../*.** R
11b50 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c  ecord in the col
11b60 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20 61  umn cache that a
11b70 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75   particular colu
11b80 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72  mn from a.** par
11b90 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73  ticular table is
11ba0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72   stored in a par
11bb0 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72  ticular register
11bc0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11bd0 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
11be0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
11bf0 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f  nt iTab, int iCo
11c00 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  l, int iReg){.  
11c10 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e  int i;.  int min
11c20 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72  Lru;.  int idxLr
11c30 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  u;.  struct yCol
11c40 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73  Cache *p;..  ass
11c50 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20 20  ert( iReg>0 );  
11c60 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d 62  /* Register numb
11c70 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70  ers are always p
11c80 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73 73  ositive */.  ass
11c90 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26  ert( iCol>=-1 &&
11ca0 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20   iCol<32768 );  
11cb0 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e  /* Finite column
11cc0 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f   numbers */..  /
11cd0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c  * The SQLITE_Col
11ce0 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69  umnCache flag di
11cf0 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d  sables the colum
11d00 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69  n cache.  This i
11d10 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20  s used.  ** for 
11d20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74  testing only - t
11d30 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51  o verify that SQ
11d40 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73  Lite always gets
11d50 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72   the same answer
11d60 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77  .  ** with and w
11d70 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d  ithout the colum
11d80 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  n cache..  */.  
11d90 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
11da0 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d  Disabled(pParse-
11db0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75  >db, SQLITE_Colu
11dc0 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72  mnCache) ) retur
11dd0 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72  n;..  /* First r
11de0 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
11df0 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a  ing entry..  **.
11e00 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
11e10 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d  he way the colum
11e20 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65  n cache is curre
11e30 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72  ntly used, we ar
11e40 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a  e guaranteed.  *
11e50 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63  * that the objec
11e60 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72  t will never alr
11e70 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65  eady be in cache
11e80 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67  .  Verify this g
11e90 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23  uarantee..  */.#
11ea0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
11eb0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
11ec0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
11ed0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
11ee0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
11ef0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65    assert( p->iRe
11f00 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c  g==0 || p->iTabl
11f10 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43  e!=iTab || p->iC
11f20 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20  olumn!=iCol );. 
11f30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
11f40 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c  Find an empty sl
11f50 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69  ot and replace i
11f60 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  t */.  for(i=0, 
11f70 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
11f80 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
11f90 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
11fa0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
11fb0 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iReg==0 ){.     
11fc0 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
11fd0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
11fe0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c  ;.      p->iTabl
11ff0 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  e = iTab;.      
12000 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
12010 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  l;.      p->iReg
12020 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70   = iReg;.      p
12030 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
12040 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
12050 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
12060 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  +;.      return;
12070 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12080 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73   Replace the las
12090 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20  t recently used 
120a0 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78  */.  minLru = 0x
120b0 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c  7fffffff;.  idxL
120c0 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69  ru = -1;.  for(i
120d0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
120e0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
120f0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
12100 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
12110 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29   p->lru<minLru )
12120 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d  {.      idxLru =
12130 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75   i;.      minLru
12140 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d   = p->lru;.    }
12150 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59  .  }.  if( ALWAY
12160 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a  S(idxLru>=0) ){.
12170 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
12180 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72  >aColCache[idxLr
12190 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65  u];.    p->iLeve
121a0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
121b0 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e  heLevel;.    p->
121c0 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
121d0 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
121e0 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65  iCol;.    p->iRe
121f0 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d  g = iReg;.    p-
12200 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
12210 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
12220 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
12230 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
12240 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
12250 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73  e that registers
12260 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69   between iReg..i
12270 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62  Reg+nReg-1 are b
12280 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
12290 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72  ..** Purge the r
122a0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
122b0 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  s from the colum
122c0 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64  n cache..*/.void
122d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
122e0 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70  eRemove(Parse *p
122f0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
12300 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
12310 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74  t i;.  int iLast
12320 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d   = iReg + nReg -
12330 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   1;.  struct yCo
12340 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
12350 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
12360 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
12370 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
12380 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
12390 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
123a0 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20      if( r>=iReg 
123b0 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20  && r<=iLast ){. 
123c0 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
123d0 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
123e0 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
123f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
12400 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
12410 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
12420 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74  mn cache context
12430 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69  .  Any new entri
12440 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65  es added.** adde
12450 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d to the column 
12460 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
12470 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65   call are remove
12480 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  d when the.** co
12490 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20  rresponding pop 
124a0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
124b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
124c0 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
124d0 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69  se){.  pParse->i
124e0 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a  CacheLevel++;.}.
124f0 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72  ./*.** Remove fr
12500 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
12510 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  che any entries 
12520 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20  that were added 
12530 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65  since the.** the
12540 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75 73 68   previous N Push
12550 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 6e   operations.  In
12560 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
12570 73 74 6f 72 65 20 74 68 65 20 63 61 63 68 65 0a  store the cache.
12580 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  ** to the state 
12590 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75 73 68  it was in N Push
125a0 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20  es ago..*/.void 
125b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
125c0 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
125d0 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  e, int N){.  int
125e0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
125f0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73  lCache *p;.  ass
12600 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61 73  ert( N>0 );.  as
12610 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43  sert( pParse->iC
12620 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a  acheLevel>=N );.
12630 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
12640 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f  Level -= N;.  fo
12650 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
12660 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
12670 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
12680 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
12690 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70  if( p->iReg && p
126a0 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d  ->iLevel>pParse-
126b0 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a  >iCacheLevel ){.
126c0 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
126d0 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
126e0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
126f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
12700 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63  ../*.** When a c
12710 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  ached column is 
12720 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72  reused, make sur
12730 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73  e that its regis
12740 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e  ter is.** no lon
12750 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73  ger available as
12760 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72   a temp register
12770 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a  .  ticket #3879:
12780 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72    that same.** r
12790 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65  egister might be
127a0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e   in the cache in
127b0 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
127c0 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a  , so be sure to.
127d0 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e  ** get them all.
127e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
127f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12800 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73  PinRegister(Pars
12810 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
12820 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
12830 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
12840 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
12850 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
12860 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
12870 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
12880 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
12890 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
128a0 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
128b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
128c0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
128d0 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74   code to extract
128e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
128f0 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
12900 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a   of a table..*/.
12910 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
12920 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
12930 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c  able(.  Vdbe *v,
12940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
12950 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  DBE under constr
12960 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c  uction */.  Tabl
12970 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54  e *pTab,    /* T
12980 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
12990 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f  ing the value */
129a0 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
129b0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
129c0 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
129d0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
129e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
129f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65   the column to e
12a00 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20  xtract */.  int 
12a10 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45  regOut      /* E
12a20 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 64  xtract the valud
12a30 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
12a40 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ter */.){.  if( 
12a50 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d  iCol<0 || iCol==
12a60 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
12a70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12a80 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
12a90 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75  , iTabCur, regOu
12aa0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
12ab0 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74   int op = IsVirt
12ac0 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56  ual(pTab) ? OP_V
12ad0 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75  Column : OP_Colu
12ae0 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  mn;.    sqlite3V
12af0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
12b00 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20   iTabCur, iCol, 
12b10 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69  regOut);.  }.  i
12b20 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
12b30 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44    sqlite3ColumnD
12b40 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20  efault(v, pTab, 
12b50 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  iCol, regOut);. 
12b60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
12b70 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
12b80 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20  ill extract the 
12b90 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
12ba0 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20  n from.** table 
12bb0 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74  pTab and store t
12bc0 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
12bd0 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  in a register.  
12be0 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20  An effort.** is 
12bf0 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  made to store th
12c00 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
12c10 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2c  n register iReg,
12c20 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a 20   but this is.** 
12c30 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e 20  not guaranteed. 
12c40 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
12c50 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
12c60 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
12c70 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
12c80 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  be an open curso
12c90 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61  r to pTab in iTa
12ca0 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ble when this ro
12cb0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
12cc0 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c  ed.  If iColumn<
12cd0 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67  0 then code is g
12ce0 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78  enerated that ex
12cf0 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64  tracts the rowid
12d00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12d10 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
12d20 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
12d30 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
12d40 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
12d50 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
12d60 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
12d70 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
12d80 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
12d90 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
12da0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
12db0 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
12dc0 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
12dd0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
12de0 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
12df0 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
12e00 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
12e10 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
12e20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
12e30 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
12e40 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20   u8 p5          
12e50 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f    /* P5 value fo
12e60 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29  r OP_Column */.)
12e70 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
12e80 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
12e90 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
12ea0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
12eb0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
12ec0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
12ed0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
12ee0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
12ef0 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20    if( p->iReg>0 
12f00 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  && p->iTable==iT
12f10 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  able && p->iColu
12f20 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  mn==iColumn ){. 
12f30 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
12f40 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
12f50 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
12f60 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69  ExprCachePinRegi
12f70 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e  ster(pParse, p->
12f80 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74  iReg);.      ret
12f90 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  urn p->iReg;.   
12fa0 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72   }.  }  .  asser
12fb0 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c  t( v!=0 );.  sql
12fc0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
12fd0 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
12fe0 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43  pTab, iTable, iC
12ff0 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
13000 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71  if( p5 ){.    sq
13010 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
13020 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73  5(v, p5);.  }els
13030 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65  e{   .    sqlite
13040 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
13050 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20  pParse, iTable, 
13060 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
13070 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
13080 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  g;.}../*.** Clea
13090 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63  r all column cac
130a0 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76  he entries..*/.v
130b0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
130c0 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20  acheClear(Parse 
130d0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
130e0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
130f0 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72  Cache *p;..  for
13100 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
13110 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
13120 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
13130 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
13140 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20  f( p->iReg ){.  
13150 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
13160 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
13170 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
13180 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
13190 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
131a0 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66   fact that an af
131b0 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61  finity change ha
131c0 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43  s occurred on iC
131d0 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  ount.** register
131e0 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
131f0 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20  iStart..*/.void 
13200 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
13210 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50  AffinityChange(P
13220 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
13230 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43  t iStart, int iC
13240 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  ount){.  sqlite3
13250 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
13260 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20  pParse, iStart, 
13270 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCount);.}../*.*
13280 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13290 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
132a0 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
132b0 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
132c0 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
132d0 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20  To..iTo+nReg-1. 
132e0 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Keep the column 
132f0 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65  cache up-to-date
13300 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13310 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
13320 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
13330 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
13340 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
13350 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
13360 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73  olCache *p;.  as
13370 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f  sert( iFrom>=iTo
13380 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e  +nReg || iFrom+n
13390 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71  Reg<=iTo );.  sq
133a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
133b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
133c0 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
133d0 54 6f 2c 20 6e 52 65 67 2d 31 29 3b 0a 20 20 66  To, nReg-1);.  f
133e0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
133f0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
13400 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
13410 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
13420 20 69 6e 74 20 78 20 3d 20 70 2d 3e 69 52 65 67   int x = p->iReg
13430 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 69 46 72  ;.    if( x>=iFr
13440 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52  om && x<iFrom+nR
13450 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  eg ){.      p->i
13460 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d  Reg += iTo-iFrom
13470 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
13480 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
13490 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
134a0 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
134b0 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  AGE_TEST)./*.** 
134c0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
134d0 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  ny register in t
134e0 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e  he range iFrom..
134f0 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a  iTo (inclusive).
13500 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ** is used as pa
13510 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  rt of the column
13520 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
13530 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
13540 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ed within assert
13550 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28  () and testcase(
13560 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a  ) macros only.**
13570 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70   and does not ap
13580 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c  pear in a normal
13590 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
135a0 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75  c int usedAsColu
135b0 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  mnCache(Parse *p
135c0 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
135d0 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e  , int iTo){.  in
135e0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
135f0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
13600 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
13610 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
13620 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
13630 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
13640 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
13650 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f  .    if( r>=iFro
13660 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65  m && r<=iTo ) re
13670 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f  turn 1;    /*NO_
13680 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  TEST*/.  }.  ret
13690 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
136a0 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
136b0 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  || SQLITE_COVERA
136c0 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a  GE_TEST */../*.*
136d0 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 65 78 70  * Convert an exp
136e0 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20  ression node to 
136f0 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2f  a TK_REGISTER.*/
13700 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
13710 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72  rToRegister(Expr
13720 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a   *p, int iReg){.
13730 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70    p->op2 = p->op
13740 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52  ;.  p->op = TK_R
13750 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54  EGISTER;.  p->iT
13760 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45  able = iReg;.  E
13770 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
13780 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a  (p, EP_Skip);.}.
13790 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
137a0 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
137b0 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
137c0 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
137d0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
137e0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72   Attempt to stor
137f0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
13800 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65   register "targe
13810 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  t"..** Return th
13820 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
13830 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
13840 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  red..**.** With 
13850 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
13860 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e  ere is no guaran
13870 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73  tee that results
13880 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72   will.** be stor
13890 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54  ed in target.  T
138a0 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20  he result might 
138b0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d  be stored in som
138c0 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73  e other.** regis
138d0 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ter if it is con
138e0 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f  venient to do so
138f0 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
13900 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
13910 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
13920 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74   code and move t
13930 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68  he results to th
13940 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67  e desired.** reg
13950 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
13960 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
13970 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  get(Parse *pPars
13980 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
13990 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
139a0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
139b0 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20  >pVdbe;  /* The 
139c0 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  VM under constru
139d0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ction */.  int o
139e0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
139f0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
13a00 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  de being coded *
13a10 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20  /.  int inReg = 
13a20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a  target;       /*
13a30 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20   Results stored 
13a40 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65  in register inRe
13a50 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  g */.  int regFr
13a60 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee1 = 0;        
13a70 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
13a80 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
13a90 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
13aa0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
13ab0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
13ac0 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
13ad0 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
13ae0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
13af0 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b   r1, r2, r3, r4;
13b00 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
13b10 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  s register numbe
13b20 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rs */.  sqlite3 
13b30 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
13b40 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73  ; /* The databas
13b50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
13b60 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
13b70 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
13b80 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
13b90 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
13ba0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
13bb0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
13bc0 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d );.    return 
13bd0 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45  0;.  }..  if( pE
13be0 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70  xpr==0 ){.    op
13bf0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65   = TK_NULL;.  }e
13c00 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45  lse{.    op = pE
13c10 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73  xpr->op;.  }.  s
13c20 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
13c30 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
13c40 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  UMN: {.      Agg
13c50 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
13c60 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
13c70 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41  ;.      struct A
13c80 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
13c90 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
13ca0 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b  ol[pExpr->iAgg];
13cb0 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
13cc0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
13cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
13ce0 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30  rt( pCol->iMem>0
13cf0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
13d00 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a  g = pCol->iMem;.
13d10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13d20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
13d30 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74  AggInfo->useSort
13d40 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ingIdx ){.      
13d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13d60 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
13d70 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74  , pAggInfo->sort
13d80 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20  ingIdxPTab,.    
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13da0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
13db0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74  iSorterColumn, t
13dc0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
13dd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
13de0 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
13df0 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
13e00 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
13e10 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
13e20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
13e30 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  : {.      int iT
13e40 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  ab = pExpr->iTab
13e50 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54  le;.      if( iT
13e60 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ab<0 ){.        
13e70 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  if( pParse->ckBa
13e80 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  se>0 ){.        
13e90 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
13ea0 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
13eb0 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69  s or inserting i
13ec0 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65  nto partial inde
13ed0 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  x */.          i
13ee0 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43  nReg = pExpr->iC
13ef0 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e  olumn + pParse->
13f00 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  ckBase;.        
13f10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13f30 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 66 72    /* Deleting fr
13f40 6f 6d 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  om a partial ind
13f50 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ex */.          
13f60 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69  iTab = pParse->i
13f70 50 61 72 74 49 64 78 54 61 62 3b 0a 20 20 20 20  PartIdxTab;.    
13f80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13f90 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
13fa0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
13fb0 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
13fc0 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20  pr->pTab,.      
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fe0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
13ff0 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74  iColumn, iTab, t
14000 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
14010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14020 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32        pExpr->op2
14030 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14040 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14050 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
14060 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
14070 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
14080 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14090 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
140a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
140b0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
140c0 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
140d0 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
140e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
140f0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
14100 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
14110 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78   codeReal(v, pEx
14120 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
14130 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14140 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
14150 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
14160 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
14170 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
14180 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
14190 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
141a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
141b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
141c0 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74  ring8, 0, target
141d0 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
141e0 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  oken, 0);.      
141f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14200 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
14210 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14220 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
14230 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
14240 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14250 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
14260 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
14270 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
14280 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69  _BLOB: {.      i
14290 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt n;.      cons
142a0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
142b0 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20   char *zBlob;.  
142c0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
142d0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
142e0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
142f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14300 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
14310 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78  n[0]=='x' || pEx
14320 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
14330 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73  ='X' );.      as
14340 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
14350 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29  Token[1]=='\'' )
14360 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78  ;.      z = &pEx
14370 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b  pr->u.zToken[2];
14380 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
14390 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20  e3Strlen30(z) - 
143a0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
143b0 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20   z[n]=='\'' );. 
143c0 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c       zBlob = sql
143d0 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71  ite3HexToBlob(sq
143e0 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
143f0 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  z, n);.      sql
14400 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
14410 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20  , OP_Blob, n/2, 
14420 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62  target, 0, zBlob
14430 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
14440 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14450 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
14460 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
14470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
14480 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14490 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
144a0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
144b0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
144c0 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20  oken!=0 );.     
144d0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
144e0 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29  u.zToken[0]!=0 )
144f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14500 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14510 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
14520 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  >iColumn, target
14530 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
14540 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21  pr->u.zToken[1]!
14550 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
14560 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
14570 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20  Token[0]=='?' . 
14580 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
14590 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  trcmp(pExpr->u.z
145a0 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61  Token, pParse->a
145b0 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
145c0 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20  umn-1])==0 );.  
145d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
145e0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
145f0 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70   pParse->azVar[p
14600 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d  Expr->iColumn-1]
14610 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
14620 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
14630 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14640 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
14650 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70  .      inReg = p
14660 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
14670 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14680 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a  .    case TK_AS:
14690 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
146a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
146b0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
146c0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
146d0 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
146e0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
146f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
14700 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
14710 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
14720 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
14730 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
14740 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
14750 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c  /.      int aff,
14760 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e   to_op;.      in
14770 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
14780 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
14790 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
147a0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
147b0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
147c0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
147d0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
147e0 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c  .      aff = sql
147f0 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
14800 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
14810 2c 20 30 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f  , 0);.      to_o
14820 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45  p = aff - SQLITE
14830 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54  _AFF_TEXT + OP_T
14840 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  oText;.      ass
14850 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
14860 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21  oText    || aff!
14870 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
14880 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
14890 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
148a0 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21  oBlob    || aff!
148b0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
148c0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
148d0 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
148e0 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21  oNumeric || aff!
148f0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
14900 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73  RIC );.      ass
14910 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
14920 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21  oInt     || aff!
14930 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
14940 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  GER );.      ass
14950 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
14960 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21  oReal    || aff!
14970 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
14980 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73      );.      tes
14990 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
149a0 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20  _ToText );.     
149b0 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
149c0 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20  ==OP_ToBlob );. 
149d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
149e0 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72  o_op==OP_ToNumer
149f0 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ic );.      test
14a00 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
14a10 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74  ToInt );.      t
14a20 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
14a30 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20  OP_ToReal );.   
14a40 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
14a50 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rget ){.        
14a60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14a70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
14a80 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
14a90 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74         inReg = t
14aa0 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
14ab0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14ac0 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c  AddOp1(v, to_op,
14ad0 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74   inReg);.      t
14ae0 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43  estcase( usedAsC
14af0 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
14b00 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29  e, inReg, inReg)
14b10 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14b20 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
14b30 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
14b40 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20   inReg, 1);.    
14b50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
14b60 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14b70 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
14b80 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
14b90 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
14ba0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
14bb0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
14bc0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
14bd0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
14be0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14bf0 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20  LT==OP_Lt );.   
14c00 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
14c10 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20  ==OP_Le );.     
14c20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d   assert( TK_GT==
14c30 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Gt );.      a
14c40 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50  ssert( TK_GE==OP
14c50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Ge );.      ass
14c60 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45  ert( TK_EQ==OP_E
14c70 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
14c80 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20  t( TK_NE==OP_Ne 
14c90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14ca0 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
14cb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14cc0 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
14cd0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14ce0 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
14cf0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14d00 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
14d10 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
14d20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14d30 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
14d40 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
14d50 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14d60 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14d70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
14d80 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
14d90 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14da0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14db0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
14dc0 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
14dd0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
14de0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
14df0 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e10 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20   r1, r2, inReg, 
14e20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
14e30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14e40 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
14e50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14e60 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
14e70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14e80 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
14e90 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
14ea0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
14eb0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
14ec0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14ed0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  se( op==TK_ISNOT
14ee0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
14ef0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
14f00 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
14f10 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
14f20 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
14f30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14f40 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
14f50 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
14f60 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20  ree2);.      op 
14f70 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
14f80 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
14f90 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
14fa0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14fb0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
14fc0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
14fe0 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
14ff0 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c 49  E_STOREP2 | SQLI
15000 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
15010 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
15020 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
15030 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
15040 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
15050 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15060 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
15070 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
15080 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
15090 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
150a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
150b0 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
150c0 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
150d0 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
150e0 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
150f0 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
15100 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
15110 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
15120 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
15130 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
15140 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15150 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20  AND==OP_And );. 
15160 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15170 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20  OR==OP_Or );.   
15180 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c     assert( TK_PL
15190 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20  US==OP_Add );.  
151a0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
151b0 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
151c0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
151d0 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
151e0 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20  mainder );.     
151f0 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
15200 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
15210 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
15220 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
15230 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
15240 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
15250 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20  Divide );.      
15260 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
15270 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
15280 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15290 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
152a0 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20  hiftRight );.   
152b0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
152c0 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
152d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
152e0 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  e( op==TK_AND );
152f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15300 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20   op==TK_OR );.  
15310 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15320 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20  ==TK_PLUS );.   
15330 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15340 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20  =TK_MINUS );.   
15350 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15360 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20  =TK_REM );.     
15370 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15380 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20  K_BITAND );.    
15390 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
153a0 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20  TK_BITOR );.    
153b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
153c0 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20  TK_SLASH );.    
153d0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
153e0 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_LSHIFT );.   
153f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15400 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20  =TK_RSHIFT );.  
15410 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15420 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20  ==TK_CONCAT );. 
15430 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
15440 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
15450 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
15460 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
15470 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
15480 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
15490 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
154a0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
154b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
154c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
154d0 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
154e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
154f0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
15500 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15510 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
15520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15530 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
15540 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
15550 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
15560 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
15570 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
15580 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
15590 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
155a0 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  R ){.        cod
155b0 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
155c0 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65   pLeft, 1, targe
155d0 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
155e0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
155f0 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c  _POINT.      }el
15600 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  se if( pLeft->op
15610 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  ==TK_FLOAT ){.  
15620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
15630 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
15640 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
15650 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  e) );.        co
15660 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d  deReal(v, pLeft-
15670 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61  >u.zToken, 1, ta
15680 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rget);.#endif.  
15690 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
156a0 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 72 31     regFree1 = r1
156b0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
156c0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
156d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
156e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
156f0 74 65 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20  teger, 0, r1);. 
15700 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
15710 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15720 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15730 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29  Left, &regFree2)
15740 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15750 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15760 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20  P_Subtract, r2, 
15770 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
15780 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
15790 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
157a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65      }.      inRe
157b0 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
157c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
157d0 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
157e0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
157f0 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
15800 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
15810 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20  P_BitNot );.    
15820 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
15830 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20  ==OP_Not );.    
15840 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15850 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20  TK_BITNOT );.   
15860 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15870 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_NOT );.     
15880 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
15890 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
158a0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
158b0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
158c0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
158d0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
158e0 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
158f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15900 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
15910 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  r1, inReg);.    
15920 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
15930 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
15940 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
15950 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
15960 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
15970 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
15980 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  L==OP_IsNull );.
15990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
159a0 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
159b0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65  Null );.      te
159c0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
159d0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
159e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
159f0 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
15a00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15a10 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
15a20 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
15a30 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
15a40 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15a50 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15a60 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
15a70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
15a80 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
15a90 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
15aa0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15ab0 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  op, r1);.      s
15ac0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15ad0 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74  (v, OP_AddImm, t
15ae0 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20  arget, -1);.    
15af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
15b00 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
15b10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15b20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
15b30 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
15b40 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
15b50 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
15b60 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
15b70 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
15b80 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
15b90 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
15ba0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
15bb0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
15bc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15bd0 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
15be0 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
15bf0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
15c00 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
15c10 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
15c20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45   pInfo->aFunc[pE
15c30 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b  xpr->iAgg].iMem;
15c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
15c50 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15c60 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55  case TK_CONST_FU
15c70 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NC:.    case TK_
15c80 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
15c90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72    ExprList *pFar
15ca0 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  g;       /* List
15cb0 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
15cc0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
15cd0 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20  int nFarg;      
15ce0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15cf0 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
15d00 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
15d10 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20  FuncDef *pDef;  
15d20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
15d30 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
15d40 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  n object */.    
15d50 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20    int nId;      
15d60 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
15d70 74 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  th of the functi
15d80 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  on name in bytes
15d90 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
15da0 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
15db0 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
15dc0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69   name */.      i
15dd0 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30  nt constMask = 0
15de0 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ;     /* Mask of
15df0 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
15e00 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  nts that are con
15e10 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  stant */.      i
15e20 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
15e30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
15e40 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  unter */.      u
15e50 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
15e60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
15e70 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20  t encoding used 
15e80 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
15e90 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   */.      CollSe
15ea0 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20  q *pColl = 0;   
15eb0 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20   /* A collating 
15ec0 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20  sequence */..   
15ed0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
15ee0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15ef0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
15f00 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15f10 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54  se( op==TK_CONST
15f20 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20 20 20 74  _FUNC );.      t
15f30 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15f40 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
15f50 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
15f60 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
15f70 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
15f80 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
15f90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15fa0 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
15fb0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
15fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72      }.      nFar
15fd0 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72  g = pFarg ? pFar
15fe0 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  g->nExpr : 0;.  
15ff0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
16000 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16010 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
16020 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
16030 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
16040 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c  .      nId = sql
16050 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64  ite3Strlen30(zId
16060 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  );.      pDef = 
16070 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
16080 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64  ion(db, zId, nId
16090 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
160a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  ;.      if( pDef
160b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
160c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
160d0 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
160e0 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29  function: %.*s()
160f0 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20  ", nId, zId);.  
16100 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16110 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
16120 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20  ttempt a direct 
16130 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
16140 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43  f the built-in C
16150 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20  OALESCE() and.  
16160 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20      ** IFNULL() 
16170 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  functions.  This
16180 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73   avoids unnecess
16190 61 72 79 20 65 76 61 6c 61 74 69 6f 6e 20 6f 66  ary evalation of
161a0 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  .      ** argume
161b0 6e 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72  nts past the fir
161c0 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75  st non-NULL argu
161d0 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
161e0 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
161f0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
16200 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20  E_FUNC_COALESCE 
16210 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
16220 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c  ndCoalesce = sql
16230 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
16240 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73  l(v);.        as
16250 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29  sert( nFarg>=2 )
16260 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16270 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
16280 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
16290 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
162a0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
162b0 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
162c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
162d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
162e0 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c  NotNull, target,
162f0 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
16300 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16310 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
16320 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20  pParse, target, 
16330 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
16340 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
16350 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
16360 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16370 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
16380 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  arg->a[i].pExpr,
16390 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
163a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
163b0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
163c0 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
163d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
163e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
163f0 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
16400 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16410 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
16420 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66  The UNLIKELY() f
16430 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
16440 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  op.  The result 
16450 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  is the value.   
16460 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
16470 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
16480 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
16490 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
164a0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e  & SQLITE_FUNC_UN
164b0 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20  LIKELY ){.      
164c0 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
164d0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =1 );.        sq
164e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
164f0 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
16500 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
16510 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
16520 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
16530 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20  if( pFarg ){.   
16540 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
16550 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
16560 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 0a 20  arse, nFarg);.. 
16570 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65         /* For le
16580 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f  ngth() and typeo
16590 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69  f() functions wi
165a0 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75  th a column argu
165b0 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ment,.        **
165c0 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61   set the P5 para
165d0 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f  meter to the OP_
165e0 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f  Column opcode to
165f0 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
16600 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  G.        ** or 
16610 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
16620 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74   respectively, t
16630 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
16640 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20  ary data.       
16650 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20   ** loading..   
16660 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16670 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
16680 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46  lags & (SQLITE_F
16690 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54  UNC_LENGTH|SQLIT
166a0 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21  E_FUNC_TYPEOF))!
166b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
166c0 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20  u8 exprOp;.     
166d0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
166e0 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg==1 );.       
166f0 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67     assert( pFarg
16700 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
16710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  );.          exp
16720 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30  rOp = pFarg->a[0
16730 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20  ].pExpr->op;.   
16740 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f         if( exprO
16750 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
16760 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43  exprOp==TK_AGG_C
16770 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
16780 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
16790 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d  ITE_FUNC_LENGTH=
167a0 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  =OPFLAG_LENGTHAR
167b0 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
167c0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
167d0 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46  FUNC_TYPEOF==OPF
167e0 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b  LAG_TYPEOFARG );
167f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
16800 74 63 61 73 65 28 20 28 70 44 65 66 2d 3e 66 75  tcase( (pDef->fu
16810 6e 63 46 6c 61 67 73 26 7e 53 51 4c 49 54 45 5f  ncFlags&~SQLITE_
16820 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 0a 20 20  FUNC_ENCMASK).  
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 20 20 20 3d 3d 53 51 4c 49 54 45 5f 46 55       ==SQLITE_FU
16850 4e 43 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 20  NC_LENGTH );.   
16860 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e           pFarg->
16870 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20  a[0].pExpr->op2 
16880 3d 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  = pDef->funcFlag
16890 73 26 7e 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45  s&~SQLITE_FUNC_E
168a0 4e 43 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20  NCMASK;.        
168b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
168c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
168d0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
168e0 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b  se);     /* Tick
168f0 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
16900 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
16910 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
16920 73 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  st(pParse, pFarg
16930 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
16940 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16950 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
16960 3b 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65  ;   /* Ticket 2e
16970 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
16980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16990 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20     r1 = 0;.     
169a0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
169b0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
169c0 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
169d0 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
169e0 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
169f0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
16a00 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
16a10 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
16a20 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
16a30 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
16a40 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
16a50 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
16a60 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
16a70 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
16a80 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
16a90 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
16aa0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
16ab0 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
16ac0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
16ad0 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
16ae0 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
16af0 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
16b00 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
16b10 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
16b20 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
16b30 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
16b40 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
16b50 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
16b60 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
16b70 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
16b80 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
16b90 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
16ba0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
16bb0 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
16bc0 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
16bd0 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
16be0 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
16bf0 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
16c00 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
16c10 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
16c20 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
16c30 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
16c40 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
16c50 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
16c60 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32      if( nFarg>=2
16c70 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
16c80 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
16c90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
16ca0 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
16cb0 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
16cc0 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
16cd0 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
16ce0 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
16cf0 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
16d00 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
16d10 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
16d20 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
16d30 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
16d40 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
16d50 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
16d60 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
16d70 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
16d80 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
16d90 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
16da0 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
16db0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
16dc0 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
16dd0 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20   |= (1<<i);.    
16de0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
16df0 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
16e00 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
16e10 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26  _NEEDCOLL)!=0 &&
16e20 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
16e30 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
16e40 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
16e50 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
16e60 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
16e70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16e80 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
16e90 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
16ea0 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
16eb0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
16ec0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
16ed0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
16ee0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16ef0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
16f00 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
16f10 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
16f20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
16f30 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
16f40 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16f50 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e  OP_Function, con
16f60 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67  stMask, r1, targ
16f70 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
16f80 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
16f90 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43  r*)pDef, P4_FUNC
16fa0 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  DEF);.      sqli
16fb0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
16fc0 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20  v, (u8)nFarg);. 
16fd0 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 29       if( nFarg )
16fe0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16ff0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
17000 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46  e(pParse, r1, nF
17010 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arg);.      }.  
17020 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17030 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17040 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
17050 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
17060 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
17070 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  LECT: {.      te
17080 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
17090 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
170a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
170b0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
170c0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43  inReg = sqlite3C
170d0 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
170e0 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30  rse, pExpr, 0, 0
170f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17100 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
17110 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
17120 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
17130 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17140 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
17150 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
17160 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17170 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
17180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17190 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
171a0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
171b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
171c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
171d0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
171e0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
171f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17200 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
17210 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
17220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17230 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
17240 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
17250 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17260 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
17270 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20  , target, 0);.  
17280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
17290 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
172a0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
172b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
172c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
172d0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
172e0 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
172f0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
17300 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20  AND z.    **.   
17310 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69   ** This is equi
17320 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  valent to.    **
17330 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20  .    **    x>=y 
17340 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a  AND x<=z.    **.
17350 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72      ** X is stor
17360 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  ed in pExpr->pLe
17370 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
17380 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
17390 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
173a0 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20  pr..    ** Z is 
173b0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
173c0 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
173d0 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  pr..    */.    c
173e0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
173f0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
17400 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
17410 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  ft;.      struct
17420 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
17430 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e  pLItem = pExpr->
17440 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  x.pList->a;.    
17450 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
17460 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
17470 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
17480 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
17490 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
174a0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
174b0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
174c0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
174d0 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  , pRight, &regFr
174e0 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee2);.      test
174f0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
17500 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
17510 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
17520 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73   );.      r3 = s
17530 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17540 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17550 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r4 = sqlite3GetT
17560 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
17570 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
17580 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
17590 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a   pRight, OP_Ge,.
175a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175b0 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51    r1, r2, r3, SQ
175c0 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
175d0 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
175e0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
175f0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
17600 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17610 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17620 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20   regFree2);.    
17630 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
17640 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17650 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
17660 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
17670 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
17680 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
17690 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
176a0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
176b0 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34  P_Le, r1, r2, r4
176c0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
176d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
176e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
176f0 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61  _And, r3, r4, ta
17700 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
17710 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17720 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
17730 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
17740 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
17750 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62  se, r4);.      b
17760 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17770 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a  case TK_COLLATE:
17780 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50   .    case TK_UP
17790 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  LUS: {.      inR
177a0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
177b0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
177c0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
177d0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
177e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
177f0 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
17800 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
17810 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
17820 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
17830 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
17840 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
17850 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
17860 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
17870 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
17880 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
17890 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
178a0 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
178b0 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
178c0 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
178d0 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
178e0 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
178f0 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
17900 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
17910 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
17920 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
17930 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
17940 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
17950 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
17960 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
17970 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
17980 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
17990 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
179a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
179b0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
179c0 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f  ng an OP_Param o
179d0 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20  pcode. The p1.  
179e0 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
179f0 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72   is set to 0 for
17a00 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65   an old.rowid re
17a10 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28  ference, or to (
17a20 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  i+1).      ** to
17a30 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68   reference anoth
17a40 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  er column of the
17a50 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
17a60 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ble, where .    
17a70 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
17a80 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
17a90 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77  n. For a new.row
17aa0 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31  id reference, p1
17ab0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74   is.      ** set
17ac0 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65   to (n+1), where
17ad0 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   n is the number
17ae0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65   of columns in e
17af0 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  ach pseudo-table
17b00 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  ..      ** For a
17b10 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
17b20 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69  y other column i
17b30 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75  n the new.* pseu
17b40 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20  do-table, p1.   
17b50 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
17b60 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e  (n+2+i), where n
17b70 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65   and i are as de
17b80 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79  fined previously
17b90 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65  . For.      ** e
17ba0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
17bb0 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72  able on which tr
17bc0 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67  iggers are being
17bd0 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20   fired is.      
17be0 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a  ** declared as:.
17bf0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17c00 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
17c10 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
17c20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
17c30 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65  n p1 is interpre
17c40 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
17c50 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17c60 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20  *   p1==0   ->  
17c70 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20    old.rowid     
17c80 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65  p1==3   ->    ne
17c90 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  w.rowid.      **
17ca0 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20     p1==1   ->   
17cb0 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70   old.a         p
17cc0 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==4   ->    new
17cd0 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  .a.      **   p1
17ce0 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==2   ->    old.
17cf0 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20  b         p1==5 
17d00 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20    ->    new.b   
17d10 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20      .      */.  
17d20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
17d30 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
17d40 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45       int p1 = pE
17d50 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70  xpr->iTable * (p
17d60 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31  Tab->nCol+1) + 1
17d70 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   + pExpr->iColum
17d80 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  n;..      assert
17d90 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
17da0 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  =0 || pExpr->iTa
17db0 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
17dc0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
17dd0 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45  Column>=-1 && pE
17de0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61  xpr->iColumn<pTa
17df0 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
17e00 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69   assert( pTab->i
17e10 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d  PKey<0 || pExpr-
17e20 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e  >iColumn!=pTab->
17e30 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61  iPKey );.      a
17e40 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
17e50 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32  p1<(pTab->nCol*2
17e60 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71  +2) );..      sq
17e70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17e80 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c  v, OP_Param, p1,
17e90 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
17ea0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
17eb0 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a  "%s.%s -> $%d",.
17ec0 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
17ed0 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a  iTable ? "new" :
17ee0 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20   "old"),.       
17ef0 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   (pExpr->iColumn
17f00 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70  <0 ? "rowid" : p
17f10 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  Expr->pTab->aCol
17f20 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
17f30 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  .zName),.       
17f40 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29   target.      ))
17f50 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
17f60 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
17f70 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49  POINT.      /* I
17f80 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  f the column has
17f90 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20   REAL affinity, 
17fa0 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  it may currently
17fb0 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e   be stored as an
17fc0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
17fd0 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66  r. Use OP_RealAf
17fe0 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73  finity to make s
17ff0 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79  ure it is really
18000 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   real.  */.     
18010 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
18020 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26  umn>=0 .       &
18030 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  & pTab->aCol[pEx
18040 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  pr->iColumn].aff
18050 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
18060 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a  F_REAL.      ){.
18070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18080 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
18090 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61  RealAffinity, ta
180a0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  rget);.      }.#
180b0 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
180c0 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
180d0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
180e0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
180f0 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
18100 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
18110 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
18120 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
18130 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
18140 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
18150 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
18160 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
18170 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
18180 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
18190 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
181a0 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
181b0 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
181c0 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
181d0 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
181e0 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
181f0 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
18200 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
18210 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
18220 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
18230 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
18240 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
18250 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
18260 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
18270 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
18280 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74  Y is in the last
18290 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70   element of pExp
182a0 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45  r->x.pList if pE
182b0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
182c0 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64  xpr is.    ** od
182d0 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73  d.  The Y is als
182e0 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20  o optional.  If 
182f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
18300 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73  ements in x.pLis
18310 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e  t.    ** is even
18320 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74  , then Y is omit
18330 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68  ted and the "oth
18340 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69  erwise" result i
18350 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
18360 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
18370 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
18380 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
18390 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
183a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
183b0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
183c0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
183d0 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
183e0 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
183f0 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
18400 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
18410 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
18420 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
18430 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
18440 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
18450 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
18460 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
18470 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
18480 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184a0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
184b0 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
184c0 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
184d0 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
184e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184f0 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
18500 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
18510 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
18520 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18540 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
18550 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
18560 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18580 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
18590 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
185a0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
185b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
185c0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
185d0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
185e0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
185f0 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
18600 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
18610 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
18620 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
18630 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
18640 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
18650 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
18660 20 20 20 20 20 20 45 78 70 72 20 63 61 63 68 65        Expr cache
18670 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
18680 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
18690 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a  d expression X *
186a0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
186b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
186c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
186d0 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
186e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
186f0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
18700 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
18710 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
18720 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
18730 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
18740 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
18750 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
18760 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
18770 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
18780 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18790 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
187a0 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
187b0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
187c0 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
187d0 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
187e0 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
187f0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
18800 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
18810 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
18820 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
18830 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
18840 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
18850 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18860 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
18870 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
18880 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63  0 ){.        cac
18890 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20  heX = *pX;.     
188a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
188b0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
188c0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
188d0 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52  se( pX->op==TK_R
188e0 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
188f0 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65     exprToRegiste
18900 72 28 26 63 61 63 68 65 58 2c 20 73 71 6c 69 74  r(&cacheX, sqlit
18910 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
18920 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46  Parse, pX, &regF
18930 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ree1));.        
18940 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
18950 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
18960 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
18970 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
18980 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
18990 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20   &cacheX;.      
189a0 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
189b0 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  pare;.        /*
189c0 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66   Ticket b351d95f
189d0 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65  9cd5ef17e9d9dbae
189e0 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31  18f5ca8611190001
189f0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  :.        ** The
18a00 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65   value in regFre
18a10 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f  e1 might get SCo
18a20 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66  py-ed into the f
18a30 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  ile result..    
18a40 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73      ** So make s
18a50 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67  ure that the reg
18a60 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69  Free1 register i
18a70 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72  s not reused for
18a80 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a   other.        *
18a90 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70  * purposes and p
18aa0 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74  ossibly overwrit
18ab0 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ten.  */.       
18ac0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
18ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
18ae0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b  (i=0; i<nExpr-1;
18af0 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
18b00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
18b10 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
18b20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b         if( pX ){
18b30 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
18b40 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20  t( pTest!=0 );. 
18b50 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61           opCompa
18b60 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73  re.pRight = aLis
18b70 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
18b80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18b90 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d           pTest =
18ba0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
18bb0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
18bc0 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20         nextCase 
18bd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18be0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
18bf0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
18c00 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  st->op==TK_COLUM
18c10 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
18c20 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
18c30 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e  pParse, pTest, n
18c40 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f  extCase, SQLITE_
18c50 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
18c60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
18c70 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
18c80 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
18c90 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MN );.        te
18ca0 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65  stcase( aListele
18cb0 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  m[i+1].pExpr->op
18cc0 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
18cd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18ce0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
18cf0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
18d00 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
18d10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18d20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18d30 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65  Goto, 0, endLabe
18d40 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
18d50 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
18d60 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
18d70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
18d80 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
18d90 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
18da0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78  }.      if( (nEx
18db0 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  pr&1)!=0 ){.    
18dc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18dd0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
18de0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18df0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
18e00 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70  , pEList->a[nExp
18e10 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  r-1].pExpr, targ
18e20 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
18e30 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
18e40 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
18e50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18e70 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
18e80 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
18e90 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
18ea0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
18eb0 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
18ec0 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20  rr>0 .          
18ed0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63   || pParse->iCac
18ee0 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c  heLevel==iCacheL
18ef0 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  evel );.      sq
18f00 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
18f10 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65  Label(v, endLabe
18f20 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
18f30 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
18f40 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
18f50 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
18f60 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  AISE: {.      as
18f70 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66  sert( pExpr->aff
18f80 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  inity==OE_Rollba
18f90 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ck .           |
18fa0 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
18fb0 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20  y==OE_Abort.    
18fc0 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
18fd0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61  >affinity==OE_Fa
18fe0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  il.           ||
18ff0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
19000 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20  ==OE_Ignore.    
19010 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21    );.      if( !
19020 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
19030 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
19040 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19050 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
19070 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
19080 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
19090 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
190a0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
190b0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
190c0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
190d0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
190e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
190f0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
19100 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
19110 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
19120 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
19130 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
19140 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
19150 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
19160 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
19170 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19180 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20  ddOp4(.         
19190 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53     v, OP_Halt, S
191a0 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e  QLITE_OK, OE_Ign
191b0 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75  ore, 0, pExpr->u
191c0 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20  .zToken,0);.    
191d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
191e0 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
191f0 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53  traint(pParse, S
19200 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
19210 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20  _TRIGGER,.      
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19230 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
19240 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e  ffinity, pExpr->
19250 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20  u.zToken, 0);.  
19260 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65      }..      bre
19270 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
19280 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
19290 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
192a0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
192b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
192c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
192d0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74  regFree2);.  ret
192e0 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
192f0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19300 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  e to evaluate an
19310 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
19320 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
19330 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69  s.** into a regi
19340 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ster.  Return th
19350 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
19360 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75  r where the resu
19370 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  lts.** are store
19380 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
19390 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
193a0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
193b0 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61   that can be dea
193c0 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65  llocated,.** the
193d0 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62  n write its numb
193e0 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20  er into *pReg.  
193f0 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
19400 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a  gister is not.**
19410 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68   a temporary, th
19420 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20  en set *pReg to 
19430 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  zero..*/.int sql
19440 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
19450 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19460 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
19470 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72   *pReg){.  int r
19480 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
19490 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
194a0 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
194b0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
194c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
194d0 31 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72 31  1);.  if( r2==r1
194e0 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20   ){.    *pReg = 
194f0 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r1;.  }else{.   
19500 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19510 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19520 31 29 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20  1);.    *pReg = 
19530 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
19540 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  r2;.}../*.** Gen
19550 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
19560 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
19570 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
19580 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
19590 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
195a0 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
195b0 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
195c0 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
195d0 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
195e0 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20   target..*/.int 
195f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
19600 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
19610 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
19620 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
19630 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
19640 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
19650 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
19660 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  m );.  if( pExpr
19670 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   && pExpr->op==T
19680 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
19690 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
196a0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
196b0 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70  e, OP_Copy, pExp
196c0 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
196d0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
196e0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
196f0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
19700 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
19710 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72  rget);.    asser
19720 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
19730 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
19740 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
19750 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
19760 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d  arget && pParse-
19770 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20  >pVdbe ){.      
19780 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19790 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
197a0 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
197b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d  , target);.    }
197c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61  .  }.  return ta
197d0 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rget;.}../*.** G
197e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
197f0 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67  t evalutes the g
19800 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
19810 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73  and puts the res
19820 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ult.** in regist
19830 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  er target..**.**
19840 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70   Also make a cop
19850 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
19860 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ion results into
19870 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22   another "cache"
19880 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
19890 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72   modify the expr
198a0 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  ession so that t
198b0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20  he next time it 
198c0 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a  is evaluated,.**
198d0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
198e0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63   copy of the cac
198f0 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  he register..**.
19900 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19910 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72  is used for expr
19920 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
19930 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a   used multiple .
19940 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20  ** times.  They 
19950 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  are evaluated on
19960 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  ce and the resul
19970 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ts of the expres
19980 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73  sion.** are reus
19990 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
199a0 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
199b0 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
199c0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
199d0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
199e0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
199f0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52  pVdbe;.  int inR
19a00 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71  eg;.  inReg = sq
19a10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
19a20 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
19a30 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  get);.  assert( 
19a40 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 2f 2a  target>0 );.  /*
19a50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
19a60 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 65 72 6d   called for term
19a70 73 20 74 6f 20 49 4e 53 45 52 54 20 6f 72 20 55  s to INSERT or U
19a80 50 44 41 54 45 2e 20 20 41 6e 64 20 74 68 65 20  PDATE.  And the 
19a90 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 20  only.  ** other 
19aa0 70 6c 61 63 65 20 77 68 65 72 65 20 65 78 70 72  place where expr
19ab0 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 63  essions can be c
19ac0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b  onverted into TK
19ad0 5f 52 45 47 49 53 54 45 52 20 69 73 0a 20 20 2a  _REGISTER is.  *
19ae0 2a 20 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  * in WHERE claus
19af0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53  e processing.  S
19b00 6f 20 61 73 20 63 75 72 72 65 6e 74 6c 79 20 69  o as currently i
19b10 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 74 68 65 72  mplemented, ther
19b20 65 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 77 61 79  e is.  ** no way
19b30 20 66 6f 72 20 61 20 54 4b 5f 52 45 47 49 53 54   for a TK_REGIST
19b40 45 52 20 74 6f 20 65 78 69 73 74 20 68 65 72 65  ER to exist here
19b50 2e 20 20 42 75 74 20 69 74 20 73 65 65 6d 73 20  .  But it seems 
19b60 70 72 75 64 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  prudent to.  ** 
19b70 6b 65 65 70 20 74 68 65 20 41 4c 57 41 59 53 28  keep the ALWAYS(
19b80 29 20 69 6e 20 63 61 73 65 20 74 68 65 20 63 6f  ) in case the co
19b90 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 63  nditions above c
19ba0 68 61 6e 67 65 20 77 69 74 68 20 66 75 74 75 72  hange with futur
19bb0 65 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74  e.  ** modificat
19bc0 69 6f 6e 73 20 6f 72 20 65 6e 68 61 6e 63 65 6d  ions or enhancem
19bd0 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28 20 41  ents. */.  if( A
19be0 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 6f 70 21  LWAYS(pExpr->op!
19bf0 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20 29 7b  =TK_REGISTER) ){
19c00 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b    .    int iMem;
19c10 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50  .    iMem = ++pP
19c20 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
19c30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19c40 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e  2(v, OP_Copy, in
19c50 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  Reg, iMem);.    
19c60 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70  exprToRegister(p
19c70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d  Expr, iMem);.  }
19c80 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b  .  return inReg;
19c90 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
19ca0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
19cb0 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a  EE_EXPLAIN)./*.*
19cc0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d  * Generate a hum
19cd0 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c  an-readable expl
19ce0 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78  anation of an ex
19cf0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
19d00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
19d10 70 6c 61 69 6e 45 78 70 72 28 56 64 62 65 20 2a  plainExpr(Vdbe *
19d20 70 4f 75 74 2c 20 45 78 70 72 20 2a 70 45 78 70  pOut, Expr *pExp
19d30 72 29 7b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20  r){.  int op;   
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65  /* The opcode be
19d60 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 63  ing coded */.  c
19d70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 69 6e 4f  onst char *zBinO
19d80 70 20 3d 20 30 3b 20 20 20 2f 2a 20 42 69 6e 61  p = 0;   /* Bina
19d90 72 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ry operator */. 
19da0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 6e   const char *zUn
19db0 69 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 55 6e  iOp = 0;   /* Un
19dc0 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ary operator */.
19dd0 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
19de0 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
19df0 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
19e00 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
19e10 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
19e20 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
19e30 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
19e40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
19e50 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
19e60 22 41 47 47 7b 25 64 3a 25 64 7d 22 2c 0a 20 20  "AGG{%d:%d}",.  
19e70 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
19e80 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  >iTable, pExpr->
19e90 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
19ea0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19eb0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
19ec0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
19ed0 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
19ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
19ef0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
19f00 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
19f10 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
19f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19f30 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
19f40 20 22 43 4f 4c 55 4d 4e 28 25 64 29 22 2c 20 70   "COLUMN(%d)", p
19f50 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
19f60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19f70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
19f80 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
19f90 22 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20  "{%d:%d}",.     
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fb0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
19fc0 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  Table, pExpr->iC
19fd0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
19fe0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19ff0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1a000 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
1a010 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
1a020 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
1a030 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a040 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1a050 4f 75 74 2c 20 22 25 64 22 2c 20 70 45 78 70 72  Out, "%d", pExpr
1a060 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20  ->u.iValue);.   
1a070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a080 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a090 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73  Printf(pOut, "%s
1a0a0 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
1a0b0 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  en);.      }.   
1a0c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a0d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a0e0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1a0f0 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  NT.    case TK_F
1a100 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  LOAT: {.      sq
1a110 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1a120 74 66 28 70 4f 75 74 2c 22 25 73 22 2c 20 70 45  tf(pOut,"%s", pE
1a130 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1a140 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a150 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
1a160 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
1a170 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a180 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a190 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
1a1a0 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
1a1b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1a1c0 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
1a1d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a1e0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1a1f0 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72  NULL");.      br
1a200 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1a210 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
1a220 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
1a230 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
1a240 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a250 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a260 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%s", pExpr->u.z
1a270 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
1a280 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1a290 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
1a2a0 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
1a2b0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1a2c0 69 6e 74 66 28 70 4f 75 74 2c 22 56 41 52 49 41  intf(pOut,"VARIA
1a2d0 42 4c 45 28 25 73 2c 25 64 29 22 2c 0a 20 20 20  BLE(%s,%d)",.   
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2f0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75          pExpr->u
1a300 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78 70 72 2d 3e  .zToken, pExpr->
1a310 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1a320 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1a330 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1a340 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
1a350 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1a360 70 4f 75 74 2c 22 52 45 47 49 53 54 45 52 28 25  pOut,"REGISTER(%
1a370 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  d)", pExpr->iTab
1a380 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
1a390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a3a0 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20   TK_AS: {.      
1a3b0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1a3c0 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
1a3d0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72  pLeft);.      br
1a3e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1a3f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1a400 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
1a410 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
1a420 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
1a430 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
1a440 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
1a450 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
1a460 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 22 75 6e  char *zAff = "un
1a470 6b 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  k";.      switch
1a480 28 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  ( sqlite3Affinit
1a490 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
1a4a0 54 6f 6b 65 6e 2c 20 30 29 20 29 7b 0a 20 20 20  Token, 0) ){.   
1a4b0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1a4c0 5f 41 46 46 5f 54 45 58 54 3a 20 20 20 20 7a 41  _AFF_TEXT:    zA
1a4d0 66 66 20 3d 20 22 54 45 58 54 22 3b 20 20 20 20  ff = "TEXT";    
1a4e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1a4f0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
1a500 4e 4f 4e 45 3a 20 20 20 20 7a 41 66 66 20 3d 20  NONE:    zAff = 
1a510 22 4e 4f 4e 45 22 3b 20 20 20 20 20 62 72 65 61  "NONE";     brea
1a520 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1a530 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
1a540 49 43 3a 20 7a 41 66 66 20 3d 20 22 4e 55 4d 45  IC: zAff = "NUME
1a550 52 49 43 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  RIC";  break;.  
1a560 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1a570 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 20 7a  E_AFF_INTEGER: z
1a580 41 66 66 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  Aff = "INTEGER";
1a590 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1a5a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1a5b0 5f 52 45 41 4c 3a 20 20 20 20 7a 41 66 66 20 3d  _REAL:    zAff =
1a5c0 20 22 52 45 41 4c 22 3b 20 20 20 20 20 62 72 65   "REAL";     bre
1a5d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1a5e0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a5f0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 41  Printf(pOut, "CA
1a600 53 54 2d 25 73 28 22 2c 20 7a 41 66 66 29 3b 0a  ST-%s(", zAff);.
1a610 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a620 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1a630 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1a640 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1a650 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1a660 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  )");.      break
1a670 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1a680 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  * SQLITE_OMIT_CA
1a690 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ST */.    case T
1a6a0 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_LT:      zBinO
1a6b0 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 62 72  p = "LT";     br
1a6c0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a6d0 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _LE:      zBinOp
1a6e0 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 62 72 65   = "LE";     bre
1a6f0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a700 47 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  GT:      zBinOp 
1a710 3d 20 22 47 54 22 3b 20 20 20 20 20 62 72 65 61  = "GT";     brea
1a720 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
1a730 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  E:      zBinOp =
1a740 20 22 47 45 22 3b 20 20 20 20 20 62 72 65 61 6b   "GE";     break
1a750 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  ;.    case TK_NE
1a760 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
1a770 22 4e 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "NE";     break;
1a780 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
1a790 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1a7a0 45 51 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  EQ";     break;.
1a7b0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20      case TK_IS: 
1a7c0 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49       zBinOp = "I
1a7d0 53 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  S";     break;. 
1a7e0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
1a7f0 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53  :   zBinOp = "IS
1a800 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  NOT";  break;.  
1a810 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20    case TK_AND:  
1a820 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 4e 44     zBinOp = "AND
1a830 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1a840 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20   case TK_OR:    
1a850 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4f 52 22 3b    zBinOp = "OR";
1a860 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a870 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20  case TK_PLUS:   
1a880 20 7a 42 69 6e 4f 70 20 3d 20 22 41 44 44 22 3b   zBinOp = "ADD";
1a890 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1a8a0 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20  ase TK_STAR:    
1a8b0 7a 42 69 6e 4f 70 20 3d 20 22 4d 55 4c 22 3b 20  zBinOp = "MUL"; 
1a8c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1a8d0 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a  se TK_MINUS:   z
1a8e0 42 69 6e 4f 70 20 3d 20 22 53 55 42 22 3b 20 20  BinOp = "SUB";  
1a8f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a900 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 42  e TK_REM:     zB
1a910 69 6e 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20  inOp = "REM";   
1a920 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a930 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 42 69   TK_BITAND:  zBi
1a940 6e 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20  nOp = "BITAND"; 
1a950 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a960 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 42 69 6e  TK_BITOR:   zBin
1a970 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 62  Op = "BITOR";  b
1a980 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a990 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 42 69 6e 4f  K_SLASH:   zBinO
1a9a0 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 62 72  p = "DIV";    br
1a9b0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a9c0 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70  _LSHIFT:  zBinOp
1a9d0 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 62 72 65   = "LSHIFT"; bre
1a9e0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a9f0 52 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20  RSHIFT:  zBinOp 
1aa00 3d 20 22 52 53 48 49 46 54 22 3b 20 62 72 65 61  = "RSHIFT"; brea
1aa10 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  k;.    case TK_C
1aa20 4f 4e 43 41 54 3a 20 20 7a 42 69 6e 4f 70 20 3d  ONCAT:  zBinOp =
1aa30 20 22 43 4f 4e 43 41 54 22 3b 20 62 72 65 61 6b   "CONCAT"; break
1aa40 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  ;..    case TK_U
1aa50 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f 70 20 3d  MINUS:  zUniOp =
1aa60 20 22 55 4d 49 4e 55 53 22 3b 20 62 72 65 61 6b   "UMINUS"; break
1aa70 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  ;.    case TK_UP
1aa80 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70 20 3d 20  LUS:   zUniOp = 
1aa90 22 55 50 4c 55 53 22 3b 20 20 62 72 65 61 6b 3b  "UPLUS";  break;
1aaa0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1aab0 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22  NOT:  zUniOp = "
1aac0 42 49 54 4e 4f 54 22 3b 20 62 72 65 61 6b 3b 0a  BITNOT"; break;.
1aad0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1aae0 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 4e       zUniOp = "N
1aaf0 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  OT";    break;. 
1ab00 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
1ab10 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 49 53  L:  zUniOp = "IS
1ab20 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NULL"; break;.  
1ab30 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
1ab40 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54  L: zUniOp = "NOT
1ab50 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20  NULL"; break;.. 
1ab60 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41     case TK_COLLA
1ab70 54 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  TE: {.      sqli
1ab80 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1ab90 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Out, pExpr->pLef
1aba0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1abb0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1abc0 4f 75 74 2c 22 2e 43 4f 4c 4c 41 54 45 28 25 73  Out,".COLLATE(%s
1abd0 29 22 2c 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  )",pExpr->u.zTok
1abe0 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
1abf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
1ac00 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
1ac10 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
1ac20 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63  ONST_FUNC:.    c
1ac30 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
1ac40 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
1ac50 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
1ac60 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
1ac70 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1ac80 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1ac90 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1aca0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
1acb0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  ){.        pFarg
1acc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1acd0 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  e{.        pFarg
1ace0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1acf0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1ad00 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f   if( op==TK_AGG_
1ad10 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
1ad20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ad30 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1ad40 41 47 47 5f 46 55 4e 43 54 49 4f 4e 25 64 3a 25  AGG_FUNCTION%d:%
1ad50 73 28 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s(",.           
1ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad70 20 20 70 45 78 70 72 2d 3e 6f 70 32 2c 20 70 45    pExpr->op2, pE
1ad80 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1ad90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ada0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1adb0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1adc0 22 46 55 4e 43 54 49 4f 4e 3a 25 73 28 22 2c 20  "FUNCTION:%s(", 
1add0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1ade0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1adf0 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20  if( pFarg ){.   
1ae00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1ae10 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74  ainExprList(pOut
1ae20 2c 20 70 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , pFarg);.      
1ae30 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
1ae40 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1ae50 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62  t, ")");.      b
1ae60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1ae70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ae80 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
1ae90 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 7b 0a 20  e TK_EXISTS: {. 
1aea0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1aeb0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1aec0 22 45 58 49 53 54 53 28 22 29 3b 0a 20 20 20 20  "EXISTS(");.    
1aed0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1aee0 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78  Select(pOut, pEx
1aef0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a  pr->x.pSelect);.
1af00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1af10 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1af20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ")");.      brea
1af30 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1af40 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
1af50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1af60 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1af70 22 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  "(");.      sqli
1af80 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
1af90 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e  (pOut, pExpr->x.
1afa0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
1afb0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1afc0 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b  intf(pOut, ")");
1afd0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1afe0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1aff0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  IN: {.      sqli
1b000 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b010 28 70 4f 75 74 2c 20 22 49 4e 28 22 29 3b 0a 20  (pOut, "IN(");. 
1b020 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b030 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1b040 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1b050 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b060 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c  nPrintf(pOut, ",
1b070 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  ");.      if( Ex
1b080 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1b090 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1b0a0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  t) ){.        sq
1b0b0 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65  lite3ExplainSele
1b0c0 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  ct(pOut, pExpr->
1b0d0 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
1b0e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b0f0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1b100 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45  xprList(pOut, pE
1b110 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
1b120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1b130 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1b140 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20  f(pOut, ")");.  
1b150 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b160 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1b170 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
1b180 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  */..    /*.    *
1b190 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
1b1a0 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
1b1b0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
1b1c0 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
1b1d0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
1b1e0 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
1b1f0 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
1b200 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
1b210 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
1b220 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
1b230 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
1b240 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
1b250 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
1b260 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
1b270 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
1b280 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
1b290 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1b2a0 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  X = pExpr->pLeft
1b2b0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 59  ;.      Expr *pY
1b2c0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1b2d0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1b2e0 20 20 20 20 20 45 78 70 72 20 2a 70 5a 20 3d 20       Expr *pZ = 
1b2f0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1b300 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
1b310 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b320 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 42 45  Printf(pOut, "BE
1b330 54 57 45 45 4e 28 22 29 3b 0a 20 20 20 20 20 20  TWEEN(");.      
1b340 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1b350 70 72 28 70 4f 75 74 2c 20 70 58 29 3b 0a 20 20  pr(pOut, pX);.  
1b360 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b370 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1b380 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ,");.      sqlit
1b390 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1b3a0 75 74 2c 20 70 59 29 3b 0a 20 20 20 20 20 20 73  ut, pY);.      s
1b3b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b3c0 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a  ntf(pOut, ",");.
1b3d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b3e0 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1b3f0 5a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Z);.      sqlite
1b400 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b410 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20  Out, ")");.     
1b420 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1b430 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
1b440 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
1b450 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
1b460 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
1b470 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1b480 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
1b490 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
1b4a0 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
1b4b0 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
1b4c0 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
1b4d0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
1b4e0 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
1b4f0 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
1b500 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
1b510 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
1b520 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
1b530 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
1b540 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
1b550 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
1b560 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
1b570 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
1b580 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
1b590 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
1b5a0 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
1b5b0 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
1b5c0 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
1b5d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1b5e0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b5f0 28 70 4f 75 74 2c 20 22 25 73 28 25 64 29 22 2c  (pOut, "%s(%d)",
1b600 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70   .          pExp
1b610 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 4e 45 57  r->iTable ? "NEW
1b620 22 20 3a 20 22 4f 4c 44 22 2c 20 70 45 78 70 72  " : "OLD", pExpr
1b630 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1b640 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b650 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a     case TK_CASE:
1b660 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1b670 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b680 75 74 2c 20 22 43 41 53 45 28 22 29 3b 0a 20 20  ut, "CASE(");.  
1b690 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b6a0 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78  inExpr(pOut, pEx
1b6b0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
1b6c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b6d0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22  Printf(pOut, ","
1b6e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b6f0 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
1b700 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  pOut, pExpr->x.p
1b710 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  List);.      bre
1b720 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1b730 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
1b740 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
1b750 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
1b760 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
1b770 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20  pe = "unk";.    
1b780 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1b790 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  >affinity ){.   
1b7a0 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c       case OE_Rol
1b7b0 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70 65 20 3d  lback:   zType =
1b7c0 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62 72   "rollback";  br
1b7d0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
1b7e0 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20 20  e OE_Abort:     
1b7f0 20 7a 54 79 70 65 20 3d 20 22 61 62 6f 72 74 22   zType = "abort"
1b800 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1b810 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69       case OE_Fai
1b820 6c 3a 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  l:       zType =
1b830 20 22 66 61 69 6c 22 3b 20 20 20 20 20 20 62 72   "fail";      br
1b840 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
1b850 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 20  e OE_Ignore:    
1b860 20 7a 54 79 70 65 20 3d 20 22 69 67 6e 6f 72 65   zType = "ignore
1b870 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1b880 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1b890 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1b8a0 70 4f 75 74 2c 20 22 52 41 49 53 45 2d 25 73 28  pOut, "RAISE-%s(
1b8b0 25 73 29 22 2c 20 7a 54 79 70 65 2c 20 70 45 78  %s)", zType, pEx
1b8c0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1b8d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b8e0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  }.#endif.  }.  i
1b8f0 66 28 20 7a 42 69 6e 4f 70 20 29 7b 0a 20 20 20  f( zBinOp ){.   
1b900 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b910 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 28 22  rintf(pOut,"%s("
1b920 2c 20 7a 42 69 6e 4f 70 29 3b 0a 20 20 20 20 73  , zBinOp);.    s
1b930 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1b940 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
1b950 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
1b960 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1b970 70 4f 75 74 2c 22 2c 22 29 3b 0a 20 20 20 20 73  pOut,",");.    s
1b980 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1b990 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
1b9a0 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c 69  Right);.    sqli
1b9b0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b9c0 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 7d 65  (pOut,")");.  }e
1b9d0 6c 73 65 20 69 66 28 20 7a 55 6e 69 4f 70 20 29  lse if( zUniOp )
1b9e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1b9f0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1ba00 22 25 73 28 22 2c 20 7a 55 6e 69 4f 70 29 3b 0a  "%s(", zUniOp);.
1ba10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ba20 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78  inExpr(pOut, pEx
1ba30 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
1ba40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1ba50 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a  intf(pOut,")");.
1ba60 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
1ba70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1ba80 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
1ba90 49 4e 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  IN) */..#if defi
1baa0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1bab0 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
1bac0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
1bad0 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
1bae0 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61  explanation of a
1baf0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
1bb00 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1bb10 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
1bb20 74 28 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78  t(Vdbe *pOut, Ex
1bb30 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
1bb40 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1bb50 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74  List==0 || pList
1bb60 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ->nExpr==0 ){.  
1bb70 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1bb80 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 28 65  Printf(pOut, "(e
1bb90 6d 70 74 79 2d 6c 69 73 74 29 22 29 3b 0a 20 20  mpty-list)");.  
1bba0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
1bbb0 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78  e if( pList->nEx
1bbc0 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  pr==1 ){.    sql
1bbd0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1bbe0 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 30  pOut, pList->a[0
1bbf0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73  ].pExpr);.  }els
1bc00 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1bc10 70 6c 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b  plainPush(pOut);
1bc20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1bc30 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1bc40 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1bc50 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1bc60 4f 75 74 2c 20 22 69 74 65 6d 5b 25 64 5d 20 3d  Out, "item[%d] =
1bc70 20 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71   ", i);.      sq
1bc80 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
1bc90 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 73 71  (pOut);.      sq
1bca0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1bcb0 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  (pOut, pList->a[
1bcc0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
1bcd0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1bce0 6f 70 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20  op(pOut);.      
1bcf0 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
1bd00 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
1bd10 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1bd20 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 20 41 53  rintf(pOut, " AS
1bd30 20 25 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69   %s", pList->a[i
1bd40 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
1bd50 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  }.      if( pLis
1bd60 74 2d 3e 61 5b 69 5d 2e 62 53 70 61 6e 49 73 54  t->a[i].bSpanIsT
1bd70 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
1bd80 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1bd90 74 66 28 70 4f 75 74 2c 20 22 20 28 25 73 29 22  tf(pOut, " (%s)"
1bda0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53  , pList->a[i].zS
1bdb0 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pan);.      }.  
1bdc0 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d      if( i<pList-
1bdd0 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20  >nExpr-1 ){.    
1bde0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1bdf0 69 6e 4e 4c 28 70 4f 75 74 29 3b 0a 20 20 20 20  inNL(pOut);.    
1be00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1be10 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28  lite3ExplainPop(
1be20 70 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  pOut);.  }.}.#en
1be30 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
1be40 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  BUG */../*.** Re
1be50 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 45 78  turn TRUE if pEx
1be60 70 72 20 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e  pr is an constan
1be70 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  t expression tha
1be80 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
1be90 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72 69 6e  .** for factorin
1bea0 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e  g out of a loop.
1beb0 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 78    Appropriate ex
1bec0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a  pressions are:.*
1bed0 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 65  *.**    *  Any e
1bee0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65  xpression that e
1bef0 76 61 6c 75 61 74 65 73 20 74 6f 20 74 77 6f 20  valuates to two 
1bf00 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e  or more opcodes.
1bf10 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79  .**.**    *  Any
1bf20 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f   OP_Integer, OP_
1bf30 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Real, OP_String,
1bf40 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c   OP_Blob, OP_Nul
1bf50 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20  l, .**       or 
1bf60 4f 50 5f 56 61 72 69 61 62 6c 65 20 74 68 61 74  OP_Variable that
1bf70 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1bf80 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61  o be placed in a
1bf90 20 0a 2a 2a 20 20 20 20 20 20 20 73 70 65 63 69   .**       speci
1bfa0 66 69 63 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  fic register..**
1bfb0 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .** There is no 
1bfc0 70 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f 72 69  point in factori
1bfd0 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e  ng out single-in
1bfe0 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61  struction consta
1bff0 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  nt.** expression
1c000 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1c010 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 70 61  e placed in a pa
1c020 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
1c030 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64  r.  .** We could
1c040 20 66 61 63 74 6f 72 20 74 68 65 6d 20 6f 75 74   factor them out
1c050 2c 20 62 75 74 20 74 68 65 6e 20 77 65 20 77 6f  , but then we wo
1c060 75 6c 64 20 65 6e 64 20 75 70 20 61 64 64 69 6e  uld end up addin
1c070 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79  g an.** OP_SCopy
1c080 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
1c090 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20 69  move the value i
1c0a0 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20  nto the correct 
1c0b0 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65  register.** late
1c0c0 72 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73 20  r.  We might as 
1c0d0 77 65 6c 6c 20 6a 75 73 74 20 75 73 65 20 74 68  well just use th
1c0e0 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74 72  e original instr
1c0f0 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76  uction and.** av
1c100 6f 69 64 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  oid the OP_SCopy
1c110 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c120 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72  isAppropriateFor
1c130 46 61 63 74 6f 72 69 6e 67 28 45 78 70 72 20 2a  Factoring(Expr *
1c140 70 29 7b 0a 20 20 69 66 28 20 21 73 71 6c 69 74  p){.  if( !sqlit
1c150 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1c160 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20  NotJoin(p) ){.  
1c170 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
1c180 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65 78  Only constant ex
1c190 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 61 70  pressions are ap
1c1a0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 66 61  propriate for fa
1c1b0 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  ctoring */.  }. 
1c1c0 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26   if( (p->flags &
1c1d0 20 45 50 5f 46 69 78 65 64 44 65 73 74 29 3d 3d   EP_FixedDest)==
1c1e0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1c1f0 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74  1;  /* Any const
1c200 61 6e 74 20 77 69 74 68 6f 75 74 20 61 20 66 69  ant without a fi
1c210 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  xed destination 
1c220 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a  is appropriate *
1c230 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  /.  }.  while( p
1c240 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29  ->op==TK_UPLUS )
1c250 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
1c260 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
1c270 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1c280 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
1c290 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
1c2a0 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20  LOB:.#endif.    
1c2b0 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
1c2c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  :.    case TK_IN
1c2d0 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20  TEGER:.    case 
1c2e0 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61  TK_FLOAT:.    ca
1c2f0 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20  se TK_NULL:.    
1c300 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
1c310 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1c320 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42  ( p->op==TK_BLOB
1c330 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1c340 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  se( p->op==TK_VA
1c350 52 49 41 42 4c 45 20 29 3b 0a 20 20 20 20 20 20  RIABLE );.      
1c360 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
1c370 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  =TK_INTEGER );. 
1c380 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1c390 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
1c3a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c3b0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c  ( p->op==TK_NULL
1c3c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1c3d0 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  se( p->op==TK_ST
1c3e0 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a  RING );.      /*
1c3f0 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74   Single-instruct
1c400 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77 69  ion constants wi
1c410 74 68 20 61 20 66 69 78 65 64 20 64 65 73 74 69  th a fixed desti
1c420 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20  nation are.     
1c430 20 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e 65 20   ** better done 
1c440 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65 20  in-line.  If we 
1c450 66 61 63 74 6f 72 20 74 68 65 6d 2c 20 74 68 65  factor them, the
1c460 79 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a  y will just end.
1c470 20 20 20 20 20 20 2a 2a 20 75 70 20 67 65 6e 65        ** up gene
1c480 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f  rating an OP_SCo
1c490 70 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76  py to move the v
1c4a0 61 6c 75 65 20 74 6f 20 74 68 65 20 64 65 73 74  alue to the dest
1c4b0 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ination.      **
1c4c0 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20   register. */.  
1c4d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1c4e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1c4f0 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
1c500 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70  if( p->pLeft->op
1c510 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d  ==TK_FLOAT || p-
1c520 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
1c530 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
1c540 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1c550 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1c560 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
1c570 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61  lt: {.      brea
1c580 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
1c590 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
1c5a0 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
1c5b0 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
1c5c0 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72  ion that is appr
1c5d0 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66  opriate for.** f
1c5e0 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20  actoring out of 
1c5f0 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61  a loop, then eva
1c600 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
1c610 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  sion.** into a r
1c620 65 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e 76  egister and conv
1c630 65 72 74 20 74 68 65 20 65 78 70 72 65 73 73 69  ert the expressi
1c640 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47  on into a TK_REG
1c650 49 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73 73  ISTER.** express
1c660 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1c670 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72  nt evalConstExpr
1c680 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
1c690 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
1c6a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
1c6b0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
1c6c0 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  e;.  switch( pEx
1c6d0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
1c6e0 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61  se TK_IN:.    ca
1c6f0 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
1c700 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
1c710 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
1c720 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
1c730 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ATE: {.      ret
1c740 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1c750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c760 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
1c770 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
1c780 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
1c790 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20   TK_CONST_FUNC: 
1c7a0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  {.      /* The a
1c7b0 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 66 75  rguments to a fu
1c7c0 6e 63 74 69 6f 6e 20 68 61 76 65 20 61 20 66 69  nction have a fi
1c7d0 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  xed destination.
1c7e0 0a 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74  .      ** Mark t
1c7f0 68 65 6d 20 74 68 69 73 20 77 61 79 20 74 6f 20  hem this way to 
1c800 61 76 6f 69 64 20 67 65 6e 65 72 61 74 65 64 20  avoid generated 
1c810 75 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f 70  unneeded OP_SCop
1c820 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72  y.      ** instr
1c830 75 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20  uctions. .      
1c840 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
1c850 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
1c860 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
1c870 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1c880 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1c890 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1c8a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
1c8b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
1c8c0 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   i = pList->nExp
1c8d0 72 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  r;.        struc
1c8e0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1c8f0 2a 70 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e  *pItem = pList->
1c900 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  a;.        for(;
1c910 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1c920 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1c930 66 28 20 41 4c 57 41 59 53 28 70 49 74 65 6d 2d  f( ALWAYS(pItem-
1c940 3e 70 45 78 70 72 29 20 29 20 70 49 74 65 6d 2d  >pExpr) ) pItem-
1c950 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d  >pExpr->flags |=
1c960 20 45 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20   EP_FixedDest;. 
1c970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c980 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c990 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73    }.  }.  if( is
1c9a0 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61  AppropriateForFa
1c9b0 63 74 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29  ctoring(pExpr) )
1c9c0 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b  {.    int r1 = +
1c9d0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1c9e0 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
1c9f0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1ca00 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1ca10 20 72 31 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20   r1);.    /* If 
1ca20 72 32 21 3d 72 31 2c 20 69 74 20 6d 65 61 6e 73  r2!=r1, it means
1ca30 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 72   that register r
1ca40 31 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  1 is never used.
1ca50 20 20 54 68 61 74 20 69 73 20 68 61 72 6d 6c 65    That is harmle
1ca60 73 73 0a 20 20 20 20 2a 2a 20 62 75 74 20 73 75  ss.    ** but su
1ca70 62 6f 70 74 69 6d 61 6c 2c 20 73 6f 20 77 65 20  boptimal, so we 
1ca80 77 61 6e 74 20 74 6f 20 6b 6e 6f 77 20 61 62 6f  want to know abo
1ca90 75 74 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  ut the situation
1caa0 20 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20   to fix it..    
1cab0 2a 2a 20 48 65 6e 63 65 20 74 68 65 20 66 6f 6c  ** Hence the fol
1cac0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 3a 20 2a  lowing assert: *
1cad0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 32  /.    assert( r2
1cae0 3d 3d 72 31 20 29 3b 0a 20 20 20 20 65 78 70 72  ==r1 );.    expr
1caf0 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72  ToRegister(pExpr
1cb00 2c 20 72 32 29 3b 0a 20 20 20 20 72 65 74 75 72  , r2);.    retur
1cb10 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
1cb20 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
1cb30 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
1cb40 20 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e   Preevaluate con
1cb50 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 73  stant subexpress
1cb60 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70  ions within pExp
1cb70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
1cb80 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
1cb90 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79  gisters.  Modify
1cba0 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74   pExpr so that t
1cbb0 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  he constant sube
1cbc0 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  xpresions.** are
1cbd0 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63   TK_REGISTER opc
1cbe0 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20  odes that refer 
1cbf0 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74  to the precomput
1cc00 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  ed values..**.**
1cc10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1cc20 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
1cc30 6a 75 6d 70 20 74 6f 20 74 68 65 20 63 6f 6f 6b  jump to the cook
1cc40 69 65 2d 63 68 65 63 6b 20 63 6f 64 65 20 68 61  ie-check code ha
1cc50 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63  s.** already occ
1cc60 75 72 2e 20 20 53 69 6e 63 65 20 74 68 65 20 63  ur.  Since the c
1cc70 6f 6f 6b 69 65 2d 63 68 65 63 6b 20 6a 75 6d 70  ookie-check jump
1cc80 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 70 72   is generated pr
1cc90 69 6f 72 20 74 6f 0a 2a 2a 20 61 6e 79 20 6f 74  ior to.** any ot
1cca0 68 65 72 20 73 65 72 69 6f 75 73 20 70 72 6f 63  her serious proc
1ccb0 65 73 73 69 6e 67 2c 20 74 68 69 73 20 63 68 65  essing, this che
1ccc0 63 6b 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ck ensures that 
1ccd0 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 77  there is no.** w
1cce0 61 79 20 74 6f 20 61 63 63 69 64 65 6e 74 6c 79  ay to accidently
1ccf0 20 62 79 70 61 73 73 20 74 68 65 20 63 6f 6e 73   bypass the cons
1cd00 74 61 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  tant initializat
1cd10 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
1cd20 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 73 6f   routine is also
1cd30 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
1cd40 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74  SQLITE_FactorOut
1cd50 43 6f 6e 73 74 20 6f 70 74 69 6d 69 7a 61 74 69  Const optimizati
1cd60 6f 6e 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  on.** is disable
1cd70 64 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  d via the sqlite
1cd80 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1cd90 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1cda0 50 54 49 4d 49 5a 41 54 49 4f 4e 53 29 0a 2a 2a  PTIMIZATIONS).**
1cdb0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68 69   interface.  Thi
1cdc0 73 20 61 6c 6c 6f 77 73 20 74 65 73 74 20 6c 6f  s allows test lo
1cdd0 67 69 63 20 74 6f 20 76 65 72 69 66 79 20 74 68  gic to verify th
1cde0 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  at the same answ
1cdf0 65 72 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  er is.** obtaine
1ce00 64 20 66 6f 72 20 71 75 65 72 69 65 73 20 72 65  d for queries re
1ce10 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
1ce20 68 65 72 20 6f 72 20 6e 6f 74 20 63 6f 6e 73 74  her or not const
1ce30 61 6e 74 73 20 61 72 65 0a 2a 2a 20 70 72 65 63  ants are.** prec
1ce40 6f 6d 70 75 74 65 64 20 69 6e 74 6f 20 72 65 67  omputed into reg
1ce50 69 73 74 65 72 73 20 6f 72 20 69 66 20 74 68 65  isters or if the
1ce60 79 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  y are inserted i
1ce70 6e 2d 6c 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n-line..*/.void 
1ce80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
1ce90 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20 2a  onstants(Parse *
1cea0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1ceb0 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  xpr){.  Walker w
1cec0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1ced0 63 6f 6f 6b 69 65 47 6f 74 6f 20 29 20 72 65 74  cookieGoto ) ret
1cee0 75 72 6e 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d  urn;.  if( Optim
1cef0 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
1cf00 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
1cf10 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73  TE_FactorOutCons
1cf20 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  t) ) return;.  m
1cf30 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
1cf40 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
1cf50 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 76 61  prCallback = eva
1cf60 6c 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 77 2e  lConstExpr;.  w.
1cf70 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
1cf80 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
1cf90 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
1cfa0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1cfb0 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
1cfc0 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
1cfd0 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
1cfe0 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
1cff0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e  pression list in
1d000 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  to a sequence of
1d010 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
1d020 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a  ning at target..
1d030 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1d040 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
1d050 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a  nts evaluated..*
1d060 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1d070 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20  rCodeExprList(. 
1d080 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1d090 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1d0a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
1d0b0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
1d0c0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
1d0d0 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65   list to be code
1d0e0 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65  d */.  int targe
1d0f0 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  t,        /* Whe
1d100 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75  re to write resu
1d110 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48  lts */.  int doH
1d120 61 72 64 43 6f 70 79 20 20 20 20 20 2f 2a 20 4d  ardCopy     /* M
1d130 61 6b 65 20 61 20 68 61 72 64 20 63 6f 70 79 20  ake a hard copy 
1d140 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
1d150 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
1d160 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1d170 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  Item;.  int i, n
1d180 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
1d190 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
1d1a0 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
1d1b0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1d1c0 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
1d1d0 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
1d1e0 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
1d1f0 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
1d200 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  xpr;.  for(pItem
1d210 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
1d220 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
1d230 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1d240 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
1d250 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 6e 52 65  pr;.    int inRe
1d260 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1d270 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1d280 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
1d290 69 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65  i);.    if( inRe
1d2a0 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20  g!=target+i ){. 
1d2b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d2c0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
1d2d0 56 64 62 65 2c 20 64 6f 48 61 72 64 43 6f 70 79  Vdbe, doHardCopy
1d2e0 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f   ? OP_Copy : OP_
1d2f0 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1d310 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b  nReg, target+i);
1d320 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1d330 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
1d340 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1d350 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72  r a BETWEEN oper
1d360 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78  ator..**.**    x
1d370 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
1d380 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
1d390 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1d3a0 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79  o .**.**    x>=y
1d3b0 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20   AND x<=z.**.** 
1d3c0 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c  Code it as such,
1d3d0 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
1d3e0 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75  do the common su
1d3f0 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65  bexpression.** e
1d400 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78  lementation of x
1d410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d420 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
1d430 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1d440 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
1d450 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1d460 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
1d470 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
1d480 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45      /* The BETWE
1d490 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  EN expression */
1d4a0 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
1d4b0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1d4c0 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73  e if the jump is
1d4d0 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20   taken */.  int 
1d4e0 6a 75 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a  jumpIfTrue,   /*
1d4f0 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
1d500 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
1d510 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   true */.  int j
1d520 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
1d530 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
1d540 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
1d550 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  NULL */.){.  Exp
1d560 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f  r exprAnd;     /
1d570 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74  * The AND operat
1d580 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20  or in  x>=y AND 
1d590 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20  x<=z  */.  Expr 
1d5a0 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20  compLeft;    /* 
1d5b0 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20  The  x>=y  term 
1d5c0 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69  */.  Expr compRi
1d5d0 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78  ght;   /* The  x
1d5e0 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  <=z  term */.  E
1d5f0 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20  xpr exprX;      
1d600 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65   /* The  x  sube
1d610 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
1d620 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1d630 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
1d640 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20  e register */.. 
1d650 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1d660 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1d670 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1d680 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78  ;.  exprX = *pEx
1d690 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70  pr->pLeft;.  exp
1d6a0 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
1d6b0 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66  ;.  exprAnd.pLef
1d6c0 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
1d6d0 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
1d6e0 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
1d6f0 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
1d700 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  _GE;.  compLeft.
1d710 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
1d720 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
1d730 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
1d740 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
1d750 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
1d760 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69   TK_LE;.  compRi
1d770 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
1d780 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  rX;.  compRight.
1d790 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
1d7a0 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
1d7b0 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  xpr;.  exprToReg
1d7c0 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 73 71  ister(&exprX, sq
1d7d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1d7e0 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  p(pParse, &exprX
1d7f0 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
1d800 20 69 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20   if( jumpIfTrue 
1d810 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1d820 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1d830 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
1d840 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1d850 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1d860 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1d870 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
1d880 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1d890 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1d8a0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1d8b0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
1d8c0 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61  ;..  /* Ensure a
1d8d0 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76  dequate test cov
1d8e0 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63  erage */.  testc
1d8f0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1d900 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1d910 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
1d920 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1d930 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1d940 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1d950 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
1d960 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1d970 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1d980 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1d990 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1d9a0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1d9b0 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1d9c0 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1d9d0 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
1d9e0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1d9f0 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1da00 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1da10 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
1da20 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1da30 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1da40 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1da50 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
1da60 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1da70 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1da80 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1da90 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1daa0 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1dab0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1dac0 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1dad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1dae0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
1daf0 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
1db00 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
1db10 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
1db20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
1db30 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1db40 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
1db50 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
1db60 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
1db70 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
1db80 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
1db90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
1dba0 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
1dbb0 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
1dbc0 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
1dbd0 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
1dbe0 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
1dbf0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
1dc00 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
1dc10 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FNULL..**.** Thi
1dc20 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
1dc30 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
1dc40 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
1dc50 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
1dc60 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
1dc70 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
1dc80 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
1dc90 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
1dca0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1dcb0 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
1dcc0 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
1dcd0 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
1dce0 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
1dcf0 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
1dd00 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
1dd10 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
1dd20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
1dd30 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
1dd40 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
1dd50 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1dd60 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
1dd70 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
1dd80 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1dd90 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
1dda0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1ddb0 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
1ddc0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
1ddd0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1dde0 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
1ddf0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1de00 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
1de10 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
1de20 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
1de30 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
1de40 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1de50 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
1de60 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
1de70 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65  R(v==0) )     re
1de80 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65  turn;  /* Existe
1de90 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
1dea0 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
1deb0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
1dec0 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  pr==0) ) return;
1ded0 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73    /* No way this
1dee0 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20   can happen */. 
1def0 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
1df00 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1df10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1df20 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
1df30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1df40 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1df50 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1df60 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1df70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1df80 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1df90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1dfa0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1dfb0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1dfc0 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  d2,jumpIfNull^SQ
1dfd0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1dfe0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1dff0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1e000 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1e010 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1e020 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1e030 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1e040 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
1e050 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1e060 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
1e070 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e080 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
1e090 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  R: {.      testc
1e0a0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1e0b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1e0c0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1e0d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e0e0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1e0f0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1e100 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1e110 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1e120 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1e130 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1e140 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e150 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
1e160 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1e170 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1e180 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e190 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1e1a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1e1b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1e1c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e1d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e1e0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
1e1f0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
1e200 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
1e210 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
1e220 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
1e230 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  _EQ: {.      ass
1e240 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  ert( TK_LT==OP_L
1e250 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
1e260 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20  t( TK_LE==OP_Le 
1e270 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e280 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b   TK_GT==OP_Gt );
1e290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e2a0 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  K_GE==OP_Ge );. 
1e2b0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e2c0 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  EQ==OP_Eq );.   
1e2d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45     assert( TK_NE
1e2e0 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
1e2f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e300 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
1e310 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1e320 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
1e330 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29  ase( op==TK_GT )
1e340 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e350 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ( op==TK_GE );. 
1e360 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e370 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
1e380 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e390 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_NE );.      t
1e3a0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1e3b0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1e3c0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1e3d0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e3e0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1e3f0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1e400 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1e410 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e420 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1e430 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1e440 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1e450 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e460 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1e470 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1e480 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1e490 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1e4a0 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ll);.      testc
1e4b0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1e4c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1e4d0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1e4e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e4f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1e500 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1e510 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20  K_ISNOT: {.     
1e520 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e530 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IS );.      te
1e540 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1e550 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  SNOT );.      r1
1e560 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e570 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e580 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1e590 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1e5a0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1e5b0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e5c0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1e5d0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1e5e0 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
1e5f0 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
1e600 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  E;.      codeCom
1e610 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1e620 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
1e630 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e650 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51  r1, r2, dest, SQ
1e660 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
1e670 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1e680 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1e690 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1e6a0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1e6b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e6c0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
1e6d0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
1e6e0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
1e6f0 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
1e700 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  L==OP_IsNull );.
1e710 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e720 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
1e730 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65  Null );.      te
1e740 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1e750 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
1e760 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e770 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
1e780 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1e790 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e7a0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1e7b0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1e7c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e7d0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
1e7e0 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
1e7f0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1e800 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1e810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e820 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
1e830 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1e840 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1e850 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
1e860 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
1e870 78 70 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75  xpr, dest, 1, ju
1e880 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1e890 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1e8a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e8b0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
1e8c0 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
1e8d0 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
1e8e0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
1e8f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1e900 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
1e910 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  ll = jumpIfNull 
1e920 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46  ? dest : destIfF
1e930 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  alse;.      sqli
1e940 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
1e950 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1e960 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
1e970 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1e980 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e990 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
1e9a0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
1e9b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1e9c0 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
1e9d0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1e9e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1e9f0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
1ea00 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1ea10 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ea20 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
1ea30 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
1ea40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1ea50 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73  , OP_If, r1, des
1ea60 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
1ea70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ea80 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1ea90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1eaa0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1eab0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1eac0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1ead0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1eae0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1eaf0 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
1eb00 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1eb10 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20  rse, regFree2); 
1eb20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   .}../*.** Gener
1eb30 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
1eb40 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
1eb50 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
1eb60 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
1eb70 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
1eb80 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
1eb90 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
1eba0 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
1ebb0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
1ebc0 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
1ebd0 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
1ebe0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
1ebf0 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
1ec00 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
1ec10 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
1ec20 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
1ec30 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
1ec40 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
1ec50 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f  ULL or fall thro
1ec60 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ugh if jumpIfNul
1ec70 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f  l.** is 0..*/.vo
1ec80 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
1ec90 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61  False(Parse *pPa
1eca0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1ecb0 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
1ecc0 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
1ecd0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1ece0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
1ecf0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1ed00 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
1ed10 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
1ed20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
1ed30 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
1ed40 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
1ed50 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
1ed60 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
1ed70 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
1ed80 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63  urn; /* Existenc
1ed90 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
1eda0 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
1edb0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1edc0 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a     return;..  /*
1edd0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45   The value of pE
1ede0 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61  xpr->op and op a
1edf0 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f  re related as fo
1ee00 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
1ee10 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20              op. 
1ee30 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d   **       ------
1ee40 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  ---          ---
1ee50 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20  -------.  **    
1ee60 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20     TK_ISNULL    
1ee70 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c        OP_NotNull
1ee80 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
1ee90 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f  OTNULL         O
1eea0 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  P_IsNull.  **   
1eeb0 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20      TK_NE       
1eec0 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a         OP_Eq.  *
1eed0 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20  *       TK_EQ   
1eee0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65             OP_Ne
1eef0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
1ef00 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
1ef10 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Le.  **       
1ef20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20  TK_LE           
1ef30 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20     OP_Gt.  **   
1ef40 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20      TK_GE       
1ef50 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a         OP_Lt.  *
1ef60 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20  *       TK_LT   
1ef70 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65             OP_Ge
1ef80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f  .  **.  ** For o
1ef90 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70  ther values of p
1efa0 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20  Expr->op, op is 
1efb0 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e  undefined and un
1efc0 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76  used..  ** The v
1efd0 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20  alue of TK_ and 
1efe0 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  OP_ constants ar
1eff0 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20  e arranged such 
1f000 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e  that we.  ** can
1f010 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70   compute the map
1f020 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67  ping above using
1f030 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
1f040 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20  xpression..  ** 
1f050 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79  Assert()s verify
1f060 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74   that the comput
1f070 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74  ation is correct
1f080 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28  ..  */.  op = ((
1f090 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53  pExpr->op+(TK_IS
1f0a0 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f  NULL&1))^1)-(TK_
1f0b0 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a  ISNULL&1);..  /*
1f0c0 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20   Verify correct 
1f0d0 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f  alignment of TK_
1f0e0 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
1f0f0 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
1f100 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1f110 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  ISNULL || op==OP
1f120 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  _NotNull );.  as
1f130 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1f140 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f  =TK_NOTNULL || o
1f150 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  p==OP_IsNull );.
1f160 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1f170 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70  >op!=TK_NE || op
1f180 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73  ==OP_Eq );.  ass
1f190 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1f1a0 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_EQ || op==OP_
1f1b0 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ne );.  assert( 
1f1c0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54  pExpr->op!=TK_LT
1f1d0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b   || op==OP_Ge );
1f1e0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1f1f0 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f  ->op!=TK_LE || o
1f200 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73  p==OP_Gt );.  as
1f210 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1f220 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GT || op==OP
1f230 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Le );.  assert(
1f240 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
1f250 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29  E || op==OP_Lt )
1f260 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
1f270 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
1f280 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
1f290 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f2a0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f2b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1f2c0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1f2d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1f2e0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1f2f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f300 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1f310 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1f320 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1f330 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f340 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f350 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
1f360 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
1f370 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1f380 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f390 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f3a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f3b0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1f3c0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1f3d0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1f3e0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f3f0 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c  t, d2, jumpIfNul
1f400 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
1f410 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
1f420 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1f430 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1f440 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1f450 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1f460 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1f470 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
1f480 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f490 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
1f4a0 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
1f4b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f4c0 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
1f4d0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1f4e0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1f4f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1f500 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1f510 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1f520 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1f530 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f540 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
1f550 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
1f560 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
1f570 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
1f580 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
1f590 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
1f5a0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1f5b0 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
1f5c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f5d0 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
1f5e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f5f0 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
1f600 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f610 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
1f620 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
1f630 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f640 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
1f650 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f660 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f670 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1f680 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f690 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f6a0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1f6b0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1f6c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f6d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f6e0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1f6f0 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
1f700 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1f710 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1f720 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f740 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
1f750 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1f760 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f770 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1f780 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f790 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1f7a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f7b0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1f7c0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
1f7d0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1f7e0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1f7f0 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
1f800 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
1f810 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
1f820 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f830 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f840 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f850 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f860 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1f870 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f880 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1f890 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1f8a0 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70        op = (pExp
1f8b0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  r->op==TK_IS) ? 
1f8c0 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20  TK_NE : TK_EQ;. 
1f8d0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1f8e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f8f0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1f900 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1f910 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1f920 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45  r2, dest, SQLITE
1f930 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
1f940 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f950 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1f960 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f970 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1f980 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f990 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1f9a0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1f9b0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  LL: {.      test
1f9c0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1f9d0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
1f9e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1f9f0 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
1fa00 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1fa10 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1fa20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1fa30 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1fa40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fa50 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
1fa60 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1fa70 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1fa80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1fa90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1faa0 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
1fab0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1fac0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1fad0 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
1fae0 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
1faf0 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70  r, dest, 0, jump
1fb00 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1fb10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1fb20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1fb30 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
1fb40 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
1fb50 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   if( jumpIfNull 
1fb60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1fb70 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
1fb80 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1fb90 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
1fba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1fbb0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
1fbc0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1fbd0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
1fbe0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1fbf0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
1fc00 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c   dest, destIfNul
1fc10 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1fc20 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1fc30 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
1fc40 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1fc50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1fc60 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
1fc70 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  t: {.      r1 = 
1fc80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1fc90 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1fca0 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
1fcb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fcc0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
1fcd0 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  ot, r1, dest, ju
1fce0 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
1fcf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1fd00 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1fd10 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1fd20 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1fd30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fd40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1fd50 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1fd60 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1fd70 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1fd80 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1fd90 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a  regFree2);.}../*
1fda0 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
1fdb0 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
1fdc0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
1fdd0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
1fde0 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
1fdf0 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65  sions are comple
1fe00 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20  tely identical. 
1fe10 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
1fe20 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a  y differ only.**
1fe30 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70   by a COLLATE op
1fe40 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f  erator at the to
1fe50 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e  p level.  Return
1fe60 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20   2 if there are 
1fe70 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f  differences.** o
1fe80 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f  ther than the to
1fe90 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20  p-level COLLATE 
1fea0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
1feb0 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e  If any subelemen
1fec0 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72  t of pB has Expr
1fed0 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68  .iTable==(-1) th
1fee0 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64  en it is allowed
1fef0 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65  .** to compare e
1ff00 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76  qual to an equiv
1ff10 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e  alent element in
1ff20 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54   pA with Expr.iT
1ff30 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a  able==iTab..**.*
1ff40 2a 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69  * The pA side mi
1ff50 67 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f  ght be using TK_
1ff60 52 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68  REGISTER.  If th
1ff70 61 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61  at is the case a
1ff80 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20  nd pB is.** not 
1ff90 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
1ffa0 52 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  R but is otherwi
1ffb0 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74  se equivalent, t
1ffc0 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
1ffd0 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69   0..**.** Someti
1ffe0 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
1fff0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65   will return 2 e
20000 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65  ven if the two e
20010 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65  xpressions.** re
20020 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c  ally are equival
20030 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e  ent.  If we cann
20040 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  ot prove that th
20050 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
20060 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20  e.** identical, 
20070 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74  we return 2 just
20080 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f   to be safe.  So
20090 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
200a0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74  .** returns 2, t
200b0 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
200c0 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
200d0 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
200e0 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
200f0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
20100 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
20110 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20   0 or 1 return, 
20120 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
20130 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
20140 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
20150 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
20160 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
20170 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
20180 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
20190 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
201a0 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a  xtra 2 - that.**
201b0 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75   just might resu
201c0 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68  lt in some sligh
201d0 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e  tly slower code.
201e0 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a    But returning.
201f0 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** an incorrect 
20200 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61  0 or 1 could lea
20210 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
20220 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
20230 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
20240 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
20250 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
20260 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20  f( pA==0||pB==0 
20270 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
20280 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20  ==pA ? 0 : 2;.  
20290 7d 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  }.  assert( !Exp
202a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c  rHasProperty(pA,
202b0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
202c0 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 61  _Reduced) );.  a
202d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
202e0 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 54  roperty(pB, EP_T
202f0 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
20300 63 65 64 29 20 29 3b 0a 20 20 69 66 28 20 45 78  ced) );.  if( Ex
20310 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41  prHasProperty(pA
20320 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
20330 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
20340 74 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pB, EP_xIsSel
20350 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
20360 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
20370 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
20380 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e  Distinct)!=(pB->
20390 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
203a0 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  nct) ) return 2;
203b0 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
203c0 42 2d 3e 6f 70 20 26 26 20 28 70 41 2d 3e 6f 70  B->op && (pA->op
203d0 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c  !=TK_REGISTER ||
203e0 20 70 41 2d 3e 6f 70 32 21 3d 70 42 2d 3e 6f 70   pA->op2!=pB->op
203f0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  ) ){.    if( pA-
20400 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
20410 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
20420 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
20430 20 70 42 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a   pB, iTab)<2 ){.
20440 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
20450 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
20460 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
20470 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
20480 6f 6d 70 61 72 65 28 70 41 2c 20 70 42 2d 3e 70  ompare(pA, pB->p
20490 4c 65 66 74 2c 20 69 54 61 62 29 3c 32 20 29 7b  Left, iTab)<2 ){
204a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
204b0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
204c0 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 2;.  }.  if( s
204d0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
204e0 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
204f0 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20  >pLeft, iTab) ) 
20500 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
20510 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
20520 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  re(pA->pRight, p
20530 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29  B->pRight, iTab)
20540 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
20550 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
20560 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e  stCompare(pA->x.
20570 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69  pList, pB->x.pLi
20580 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  st, iTab) ) retu
20590 72 6e 20 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 2;.  if( pA->
205a0 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
205b0 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
205c0 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c  .  if( pA->iTabl
205d0 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20  e!=pB->iTable . 
205e0 20 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f    && pA->op!=TK_
205f0 52 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 28  REGISTER.   && (
20600 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62  pA->iTable!=iTab
20610 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54   || NEVER(pB->iT
20620 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75  able>=0)) ) retu
20630 72 6e 20 32 3b 0a 20 20 69 66 28 20 45 78 70 72  rn 2;.  if( Expr
20640 48 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20  HasProperty(pA, 
20650 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 7b 0a  EP_IntValue) ){.
20660 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
20670 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f  Property(pB, EP_
20680 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 41 2d  IntValue) || pA-
20690 3e 75 2e 69 56 61 6c 75 65 21 3d 70 42 2d 3e 75  >u.iValue!=pB->u
206a0 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  .iValue ){.     
206b0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
206c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d  .  }else if( pA-
206d0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op!=TK_COLUMN &
206e0 26 20 41 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21  & ALWAYS(pA->op!
206f0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
20700 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  && pA->u.zToken)
20710 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
20720 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50  sProperty(pB, EP
20730 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 4e 45  _IntValue) || NE
20740 56 45 52 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  VER(pB->u.zToken
20750 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 32 3b  ==0) ) return 2;
20760 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
20770 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
20780 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  >u.zToken)!=0 ){
20790 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
207a0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
207b0 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a   ? 1 : 2;.    }.
207c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
207d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
207e0 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
207f0 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
20800 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
20810 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
20820 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
20830 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
20840 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
20850 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
20860 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
20870 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
20880 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
20890 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
208a0 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
208b0 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
208c0 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
208d0 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Tab..**.** This 
208e0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
208f0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
20900 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
20910 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
20920 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
20930 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
20940 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
20950 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
20960 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
20970 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
20980 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
20990 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
209a0 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
209b0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
209c0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
209d0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
209e0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
209f0 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
20a00 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
20a10 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
20a20 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
20a30 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
20a40 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
20a50 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
20a60 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
20a70 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
20a80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
20a90 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
20aa0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
20ab0 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
20ac0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
20ad0 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
20ae0 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
20af0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
20b00 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
20b10 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
20b20 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
20b30 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
20b40 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
20b50 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
20b60 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
20b70 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
20b80 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
20b90 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
20ba0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
20bb0 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61  prA, pExprB, iTa
20bc0 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
20bd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
20be0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20bf0 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72  rue if we can pr
20c00 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c  ove the pE2 will
20c10 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20   always be true 
20c20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75  if pE1 is.** tru
20c30 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  e.  Return false
20c40 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f   if we cannot co
20c50 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66  mplete the proof
20c60 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74   or if pE2 might
20c70 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45  .** be false.  E
20c80 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
20c90 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20     pE1: x==5    
20ca0 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
20cb0 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
20cc0 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
20cd0 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32  : x>0        pE2
20ce0 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
20cf0 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
20d00 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32  .**     pE1: x=2
20d10 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32  1       pE2: x=2
20d20 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65  1 OR y=43     Re
20d30 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
20d40 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20    pE1: x!=123   
20d50 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
20d60 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
20d70 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
20d80 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a   x!=?1      pE2:
20d90 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
20da0 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
20db0 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20  *     pE1: x IS 
20dc0 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20  NULL  pE2: x IS 
20dd0 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
20de0 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
20df0 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20   pE1: x IS ?2   
20e00 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
20e10 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66  ULL    Reuslt: f
20e20 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  alse.**.** When 
20e30 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c  comparing TK_COL
20e40 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65  UMN nodes betwee
20e50 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69  n pE1 and pE2, i
20e60 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70  f pE2 has.** Exp
20e70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20  r.iTable<0 then 
20e80 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e  assume a table n
20e90 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69  umber given by i
20ea0 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Tab..**.** When 
20eb0 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
20ec0 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
20ed0 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
20ee0 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
20ef0 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
20f00 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
20f10 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
20f20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
20f30 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
20f40 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
20f50 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
20f60 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
20f70 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
20f80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
20f90 72 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70  rImpliesExpr(Exp
20fa0 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45  r *pE1, Expr *pE
20fb0 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  2, int iTab){.  
20fc0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
20fd0 6f 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c  ompare(pE1, pE2,
20fe0 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20   iTab)==0 ){.   
20ff0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
21000 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
21010 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74  _OR.   && (sqlit
21020 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
21030 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66  r(pE1, pE2->pLef
21040 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20  t, iTab).       
21050 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
21060 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
21070 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74  pE1, pE2->pRight
21080 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20  , iTab) ).  ){. 
21090 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
210a0 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
210b0 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26  TK_NOTNULL.   &&
210c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
210d0 61 72 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20  are(pE1->pLeft, 
210e0 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
210f0 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d  )==0.   && (pE1-
21100 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26  >op!=TK_ISNULL &
21110 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53  & pE1->op!=TK_IS
21120 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
21130 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
21140 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
21150 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
21160 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
21170 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
21180 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
21190 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65  ** to count refe
211a0 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20  rences to table 
211b0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61  columns in the a
211c0 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a  rguments of an .
211d0 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ** aggregate fun
211e0 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20  ction, in order 
211f0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
21200 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74  .** sqlite3Funct
21210 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75  ionThisSrc() rou
21220 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tine..*/.struct 
21230 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63  SrcCount {.  Src
21240 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a  List *pSrc;   /*
21250 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20   One particular 
21260 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61  FROM clause in a
21270 20 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f   nested query */
21280 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20  .  int nThis;   
21290 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
212a0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
212b0 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69  olumns in pSrcLi
212c0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68  st */.  int nOth
212d0 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  er;      /* Numb
212e0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
212f0 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f   to columns in o
21300 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
21310 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.};../*.** C
21320 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
21330 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
21340 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61   columns..*/.sta
21350 74 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43  tic int exprSrcC
21360 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  ount(Walker *pWa
21370 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
21380 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56  r){.  /* The NEV
21390 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f  ER() on the seco
213a0 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75  nd term is becau
213b0 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  se sqlite3Functi
213c0 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a  onUsesThisSrc().
213d0 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63    ** is always c
213e0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c  alled before sql
213f0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
21400 67 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20  ggregates() and 
21410 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43  so the.  ** TK_C
21420 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20  OLUMNs have not 
21430 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  yet been convert
21440 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  ed into TK_AGG_C
21450 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20  OLUMN.  If.  ** 
21460 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
21470 73 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20  sesThisSrc() is 
21480 75 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  used differently
21490 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
214a0 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29  the.  ** NEVER()
214b0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
214c0 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69   removed. */.  i
214d0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
214e0 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52  _COLUMN || NEVER
214f0 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41  (pExpr->op==TK_A
21500 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20  GG_COLUMN) ){.  
21510 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72    int i;.    str
21520 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20  uct SrcCount *p 
21530 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72  = pWalker->u.pSr
21540 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c  cCount;.    SrcL
21550 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
21560 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Src;.    for(i=0
21570 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
21580 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
21590 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
215a0 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
215b0 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
215c0 0a 20 20 20 20 69 66 28 20 69 3c 70 53 72 63 2d  .    if( i<pSrc-
215d0 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70  >nSrc ){.      p
215e0 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d  ->nThis++;.    }
215f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
21600 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Other++;.    }. 
21610 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
21620 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
21630 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
21640 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d  any of the argum
21650 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70  ents to the pExp
21660 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72  r Function refer
21670 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74  ence.** pSrcList
21680 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
21690 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f  f they do.  Also
216a0 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   return true if 
216b0 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  the function.** 
216c0 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  has no arguments
216d0 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e   or has only con
216e0 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
216f0 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
21700 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72  f pExpr.** refer
21710 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75  ences columns bu
21720 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  t not columns of
21730 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e   tables found in
21740 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e   pSrcList..*/.in
21750 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  t sqlite3Functio
21760 6e 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70  nUsesThisSrc(Exp
21770 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73  r *pExpr, SrcLis
21780 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20  t *pSrcList){.  
21790 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75  Walker w;.  stru
217a0 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b  ct SrcCount cnt;
217b0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
217c0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
217d0 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65  CTION );.  memse
217e0 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
217f0 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
21800 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63  llback = exprSrc
21810 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72  Count;.  w.u.pSr
21820 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20  cCount = &cnt;. 
21830 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63   cnt.pSrc = pSrc
21840 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69  List;.  cnt.nThi
21850 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74  s = 0;.  cnt.nOt
21860 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  her = 0;.  sqlit
21870 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26  e3WalkExprList(&
21880 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  w, pExpr->x.pLis
21890 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74  t);.  return cnt
218a0 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e  .nThis>0 || cnt.
218b0 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  nOther==0;.}../*
218c0 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
218d0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
218e0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
218f0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
21900 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
21910 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
21920 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
21930 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
21940 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
21950 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
21960 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
21970 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
21980 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
21990 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
219a0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
219b0 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
219c0 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
219d0 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
219e0 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
219f0 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
21a00 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
21a10 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
21a20 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
21a30 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
21a40 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
21a50 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
21a60 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
21a70 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
21a80 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
21a90 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
21aa0 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
21ab0 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
21ac0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
21ad0 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
21ae0 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
21af0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
21b00 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
21b10 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
21b20 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
21b30 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
21b40 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
21b50 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
21b60 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
21b70 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
21b80 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
21b90 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
21ba0 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
21bb0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
21bc0 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
21bd0 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
21be0 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
21bf0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
21c00 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
21c10 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
21c20 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
21c30 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
21c40 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
21c50 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
21c60 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
21c70 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
21c80 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
21c90 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
21ca0 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
21cb0 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
21cc0 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
21cd0 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
21ce0 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
21cf0 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
21d00 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
21d10 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f   = pNC->pAggInfo
21d20 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
21d30 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
21d40 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
21d50 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
21d60 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  LUMN: {.      te
21d70 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
21d80 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
21d90 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
21da0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
21db0 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
21dc0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
21dd0 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
21de0 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  is in one of the
21df0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
21e00 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  ROM.      ** cla
21e10 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
21e20 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
21e30 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
21e40 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  SrcList!=0) ){. 
21e50 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
21e60 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
21e70 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
21e80 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
21e90 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
21ea0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
21eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
21ec0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
21ed0 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
21ee0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
21ef0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
21f00 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
21f10 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
21f20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
21f30 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
21f40 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >iCursor ){.    
21f50 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
21f60 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
21f70 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
21f80 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f   pExpr refers to
21f90 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20   a table.       
21fa0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
21fb0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
21fc0 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
21fd0 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20  ate query.  .   
21fe0 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
21ff0 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20          ** Make 
22000 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
22010 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49   column in pAggI
22020 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74  nfo->aCol[] if t
22030 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
22040 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e   ** is not an en
22050 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64  try there alread
22060 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
22070 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
22080 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
22090 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f   pCol = pAggInfo
220a0 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
220b0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
220c0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
220d0 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; k++, pCol++){.
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
220f0 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d  ( pCol->iTable==
22100 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
22110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22120 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
22130 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
22140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22150 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22160 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22180 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67       if( (k>=pAg
22190 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a  gInfo->nColumn).
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
221b0 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (k = addAggInfoC
221c0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62  olumn(pParse->db
221d0 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20  , pAggInfo))>=0 
221e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
22200 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
22210 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  aCol[k];.       
22220 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
22230 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
22240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
22250 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  Col->iTable = pE
22260 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
22270 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
22280 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  >iColumn = pExpr
22290 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
222a0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
222b0 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
222c0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
222d0 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
222e0 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  rColumn = -1;.  
222f0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
22300 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
22310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
22320 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72  f( pAggInfo->pGr
22330 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
22340 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20           int j, 
22350 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
22360 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42     ExprList *pGB
22370 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72   = pAggInfo->pGr
22380 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20  oupBy;.         
22390 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
223a0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
223b0 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20  rm = pGB->a;.   
223c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
223d0 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20   pGB->nExpr;.   
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
223f0 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20  (j=0; j<n; j++, 
22400 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
22410 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
22420 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pE = pTerm->pE
22430 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
22440 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
22450 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
22460 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  pE->iTable==pExp
22470 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22490 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d     pE->iColumn==
224a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
224b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
224c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
224d0 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  terColumn = j;. 
224e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22500 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
22520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
22530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
22540 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
22550 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
22560 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
22570 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
22580 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74   pAggInfo->nSort
22590 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20  ingColumn++;.   
225a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
225b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
225c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20         /* There 
225d0 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20  is now an entry 
225e0 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67  for pExpr in pAg
225f0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65  gInfo->aCol[] (e
22600 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  ither.          
22610 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20    ** because it 
22620 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65  was there before
22630 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a   or because we j
22640 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e  ust created it).
22650 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
22660 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70  Convert the pExp
22670 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47  r to be a TK_AGG
22680 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e  _COLUMN referrin
22690 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20  g to that.      
226a0 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66        ** pAggInf
226b0 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e  o->aCol[] entry.
226c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
226d0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
226e0 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
226f0 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
22700 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
22710 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
22720 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
22730 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
22740 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  p = TK_AGG_COLUM
22750 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  N;.            p
22760 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
22770 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  6)k;.           
22780 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22790 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78    } /* endif pEx
227a0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
227b0 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20  m->iCursor */.  
227c0 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c        } /* end l
227d0 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73  oop over pSrcLis
227e0 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  t */.      }.   
227f0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
22800 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  une;.    }.    c
22810 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
22820 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ION: {.      if(
22830 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26   (pNC->ncFlags &
22840 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d   NC_InAggFunc)==
22850 30 0a 20 20 20 20 20 20 20 26 26 20 70 57 61 6c  0.       && pWal
22860 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
22870 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20  ==pExpr->op2.   
22880 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
22890 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
228a0 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c   pExpr is a dupl
228b0 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
228c0 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20   aggregate .    
228d0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
228e0 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
228f0 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20  in the pAggInfo 
22900 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20  structure.      
22910 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72    */.        str
22920 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
22930 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e   *pItem = pAggIn
22940 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20  fo->aFunc;.     
22950 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
22960 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
22970 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
22980 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
22990 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
229a0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
229b0 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  pr, -1)==0 ){.  
229c0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
229d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
229e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
229f0 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
22a00 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
22a10 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
22a20 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
22a30 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
22a40 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
22a50 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
22a60 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
22a70 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
22a80 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
22a90 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50  ddAggInfoFunc(pP
22aa0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
22ab0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
22ac0 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
22ad0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
22ae0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22af0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
22b00 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
22b10 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
22b20 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
22b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
22b40 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
22b50 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
22b60 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  Item->iMem = ++p
22b70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
22b80 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22b90 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
22ba0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
22bb0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
22bc0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
22bd0 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
22be0 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
22bf0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
22c00 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
22c10 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53  zToken, sqlite3S
22c20 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75  trlen30(pExpr->u
22c30 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20  .zToken),.      
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
22c50 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45  pr->x.pList ? pE
22c60 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
22c70 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
22c80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
22c90 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
22ca0 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
22cc0 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
22cd0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
22ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
22cf0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
22d00 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
22d10 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
22d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22d30 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
22d40 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
22d50 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
22d60 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
22d70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
22d80 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
22d90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
22da0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22db0 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
22dc0 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
22dd0 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53  );.        ExprS
22de0 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
22df0 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
22e00 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
22e10 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b  ->iAgg = (i16)i;
22e20 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
22e30 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
22e40 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nfo;.        ret
22e50 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
22e60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22e70 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
22e80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
22e90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22ea0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
22eb0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
22ec0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
22ed0 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20  InSelect(Walker 
22ee0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
22ef0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e   *pSelect){.  UN
22f00 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
22f10 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45  Walker);.  UNUSE
22f20 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c  D_PARAMETER(pSel
22f30 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ect);.  return W
22f40 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
22f50 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
22f60 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
22f70 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
22f80 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
22f90 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
22fa0 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
22fb0 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
22fc0 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
22fd0 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e  that pNC->pAggIn
22fe0 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e  fo.** points to.
22ff0 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74    Additional ent
23000 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e  ries are made on
23010 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a   the AggInfo obj
23020 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73  ect as.** necess
23030 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
23040 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
23050 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
23060 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
23070 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
23080 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
23090 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
230a0 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  es()..*/.void sq
230b0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
230c0 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43  Aggregates(NameC
230d0 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
230e0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c  r *pExpr){.  Wal
230f0 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
23100 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
23110 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
23120 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
23130 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65  gregate;.  w.xSe
23140 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61  lectCallback = a
23150 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
23160 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e  InSelect;.  w.u.
23170 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73  pNC = pNC;.  ass
23180 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ert( pNC->pSrcLi
23190 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  st!=0 );.  sqlit
231a0 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
231b0 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
231c0 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
231d0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
231e0 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
231f0 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
23200 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
23210 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
23220 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
23230 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
23240 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
23250 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
23260 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20   short..*/.void 
23270 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
23280 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
23290 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
232a0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
232b0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
232c0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
232d0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
232e0 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
232f0 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
23300 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
23310 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
23320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
23330 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
23340 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
23350 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
23360 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
23370 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  ate a single new
23380 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73   register for us
23390 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69  e to hold some i
233a0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
233b0 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lt..*/.int sqlit
233c0 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72  e3GetTempReg(Par
233d0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
233e0 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
233f0 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Reg==0 ){.    re
23400 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  turn ++pParse->n
23410 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Mem;.  }.  retur
23420 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  n pParse->aTempR
23430 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65  eg[--pParse->nTe
23440 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mpReg];.}../*.**
23450 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65   Deallocate a re
23460 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61  gister, making a
23470 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
23480 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
23490 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a  r.** purpose..**
234a0 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
234b0 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62  r is currently b
234c0 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 65  eing used by the
234d0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74   column cache, t
234e0 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 6c 6c 6f  hen.** the dallo
234f0 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72  cation is deferr
23500 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c  ed until the col
23510 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74  umn cache line t
23520 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20  hat uses.** the 
23530 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73  register becomes
23540 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   stale..*/.void 
23550 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
23560 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
23570 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  rse, int iReg){.
23580 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50    if( iReg && pP
23590 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
235a0 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
235b0 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
235c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72    int i;.    str
235d0 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
235e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
235f0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
23600 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
23610 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
23620 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
23630 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
23640 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65         p->tempRe
23650 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  g = 1;.        r
23660 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
23670 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
23680 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
23690 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
236a0 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
236b0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64  ** Allocate or d
236c0 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63  eallocate a bloc
236d0 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63  k of nReg consec
236e0 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73 0a  utive registers.
236f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
23700 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  tTempRange(Parse
23710 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52   *pParse, int nR
23720 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  eg){.  int i, n;
23730 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69  .  i = pParse->i
23740 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20  RangeReg;.  n = 
23750 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
23760 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e  g;.  if( nReg<=n
23770 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
23780 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63  !usedAsColumnCac
23790 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b  he(pParse, i, i+
237a0 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72  n-1) );.    pPar
237b0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d  se->iRangeReg +=
237c0 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
237d0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20  e->nRangeReg -= 
237e0 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nReg;.  }else{. 
237f0 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e     i = pParse->n
23800 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
23810 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
23820 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
23830 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  .}.void sqlite3R
23840 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
23850 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
23860 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
23870 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  g){.  sqlite3Exp
23880 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
23890 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29  rse, iReg, nReg)
238a0 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61  ;.  if( nReg>pPa
238b0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29  rse->nRangeReg )
238c0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  {.    pParse->nR
238d0 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a  angeReg = nReg;.
238e0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
238f0 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  geReg = iReg;.  
23900 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  }.}../*.** Mark 
23910 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65  all temporary re
23920 67 69 73 74 65 72 73 20 61 73 20 62 65 69 6e 67  gisters as being
23930 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72   unavailable for
23940 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20   reuse..*/.void 
23950 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
23960 52 65 67 43 61 63 68 65 28 50 61 72 73 65 20 2a  RegCache(Parse *
23970 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73  pParse){.  pPars
23980 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b  e->nTempReg = 0;
23990 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  .  pParse->nRang
239a0 65 52 65 67 20 3d 20 30 3b 0a 7d 0a              eReg = 0;.}.