/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact b74939e7935c4ad9e7f87b31ce05713fd5dafc3a:


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 0a 20 20 50 61 72 73 65  teToken(.  Parse
08e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
08f0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
0900: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
0910: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
0920: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
0930: 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65  "COLLATE" clause
0940: 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73   to this express
0950: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  ion */.  const T
0960: 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 20  oken *pCollName 
0970: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c    /* Name of col
0980: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
0990: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c  */.){.  if( pCol
09a0: 6c 4e 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20  lName->n>0 ){.  
09b0: 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
09c0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
09d0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43  pParse->db, TK_C
09e0: 4f 4c 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d  OLLATE, pCollNam
09f0: 65 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e, 1);.    if( p
0a00: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0a10: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0a20: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0a30: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0a40: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0a50: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0a60: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0a70: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0a80: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0a90: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0aa0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0ab0: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0ac0: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ad0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0ae0: 43 21 3d 30 20 29 3b 0a 20 20 73 2e 7a 20 3d 20  C!=0 );.  s.z = 
0af0: 7a 43 3b 0a 20 20 73 2e 6e 20 3d 20 73 71 6c 69  zC;.  s.n = sqli
0b00: 74 65 33 53 74 72 6c 65 6e 33 30 28 73 2e 7a 29  te3Strlen30(s.z)
0b10: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
0b20: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
0b30: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 45  Token(pParse, pE
0b40: 78 70 72 2c 20 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a  xpr, &s);.}../*.
0b50: 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79  ** Skip over any
0b60: 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 72 20 54   TK_COLLATE or T
0b70: 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 73 20 61  K_AS operators a
0b80: 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28  nd any unlikely(
0b90: 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f  ).** or likeliho
0ba0: 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 74  od() function at
0bb0: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
0bc0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45  expression..*/.E
0bd0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
0be0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72  SkipCollate(Expr
0bf0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c   *pExpr){.  whil
0c00: 65 28 20 70 45 78 70 72 20 26 26 20 45 78 70 72  e( pExpr && Expr
0c10: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0c20: 72 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20  r, EP_Skip) ){. 
0c30: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
0c40: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
0c50: 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20  _Unlikely) ){.  
0c60: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
0c70: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
0c80: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
0c90: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
0ca0: 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  t( pExpr->x.pLis
0cb0: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
0cc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0cd0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  r->op==TK_FUNCTI
0ce0: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ON );.      pExp
0cf0: 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  r = pExpr->x.pLi
0d00: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
0d10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
0d20: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0d30: 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c  op==TK_COLLATE |
0d40: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
0d50: 41 53 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  AS );.      pExp
0d60: 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  r = pExpr->pLeft
0d70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20  ;.    }.  }   . 
0d80: 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
0d90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0da0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
0db0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78  uence for the ex
0dc0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
0dd0: 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e  If.** there is n
0de0: 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  o defined collat
0df0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65  ing sequence, re
0e00: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
0e10: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
0e20: 65 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65  equence might be
0e30: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61   determined by a
0e40: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
0e50: 72 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70  r.** or by the p
0e60: 72 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c  resence of a col
0e70: 75 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e  umn with a defin
0e80: 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ed collating seq
0e90: 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54  uence..** COLLAT
0ea0: 45 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65  E operators take
0eb0: 20 66 69 72 73 74 20 70 72 65 63 65 64 65 6e 63   first precedenc
0ec0: 65 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64  e.  Left operand
0ed0: 73 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64  s take.** preced
0ee0: 65 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74 20  ence over right 
0ef0: 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c  operands..*/.Col
0f00: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70  lSeq *sqlite3Exp
0f10: 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  rCollSeq(Parse *
0f20: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0f30: 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  xpr){.  sqlite3 
0f40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
0f50: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
0f60: 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a  ll = 0;.  Expr *
0f70: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69  p = pExpr;.  whi
0f80: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  le( p ){.    int
0f90: 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20   op = p->op;.   
0fa0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54   if( op==TK_CAST
0fb0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   || op==TK_UPLUS
0fc0: 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d   ){.      p = p-
0fd0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f  >pLeft;.      co
0fe0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
0ff0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c    if( op==TK_COL
1000: 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54 4b 5f  LATE || (op==TK_
1010: 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 6f  REGISTER && p->o
1020: 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 29 20  p2==TK_COLLATE) 
1030: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  ){.      pColl =
1040: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
1050: 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43 28 64  eq(pParse, ENC(d
1060: 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  b), 0, p->u.zTok
1070: 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
1080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1090: 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20 20  p->pTab!=0.     
10a0: 26 26 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  && (op==TK_AGG_C
10b0: 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  OLUMN || op==TK_
10c0: 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20  COLUMN.         
10d0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53   || op==TK_REGIS
10e0: 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52  TER || op==TK_TR
10f0: 49 47 47 45 52 29 0a 20 20 20 20 29 7b 0a 20 20  IGGER).    ){.  
1100: 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45      /* op==TK_RE
1110: 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54 61  GISTER && p->pTa
1120: 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65  b!=0 happens whe
1130: 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67  n pExpr was orig
1140: 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  inally.      ** 
1150: 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20  a TK_COLUMN but 
1160: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65  was previously e
1170: 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63  valuated and cac
1180: 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65  hed in a registe
1190: 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  r */.      int j
11a0: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
11b0: 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b       if( j>=0 ){
11c0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
11d0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e  har *zColl = p->
11e0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43  pTab->aCol[j].zC
11f0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  oll;.        pCo
1200: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
1210: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
1220: 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a  db), zColl, 0);.
1230: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1240: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
1250: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
1260: 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  _Collate ){.    
1270: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e    if( ALWAYS(p->
1280: 70 4c 65 66 74 29 20 26 26 20 28 70 2d 3e 70 4c  pLeft) && (p->pL
1290: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
12a0: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
12b0: 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c         p = p->pL
12c0: 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eft;.      }else
12d0: 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d  {.        p = p-
12e0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d  >pRight;.      }
12f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1300: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1310: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1320: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
1330: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a  rse, pColl) ){ .
1340: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
1350: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
1360: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  l;.}../*.** pExp
1370: 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20  r is an operand 
1380: 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  of a comparison 
1390: 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20  operator.  aff2 
13a0: 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61  is the.** type a
13b0: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f  ffinity of the o
13c0: 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54  ther operand.  T
13d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
13e0: 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20  rns the.** type 
13f0: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
1400: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
1410: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1420: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61  operator..*/.cha
1430: 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  r sqlite3Compare
1440: 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70  Affinity(Expr *p
1450: 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32 29  Expr, char aff2)
1460: 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d 20  {.  char aff1 = 
1470: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1480: 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ity(pExpr);.  if
1490: 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20 29  ( aff1 && aff2 )
14a0: 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69  {.    /* Both si
14b0: 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  des of the compa
14c0: 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e  rison are column
14d0: 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75  s. If one has nu
14e0: 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66  meric.    ** aff
14f0: 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e  inity, use that.
1500: 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 6e   Otherwise use n
1510: 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  o affinity..    
1520: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
1530: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1540: 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c  ity(aff1) || sql
1550: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1560: 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20  inity(aff2) ){. 
1570: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1580: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
1590: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
15b0: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  FF_NONE;.    }. 
15c0: 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 31   }else if( !aff1
15d0: 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20   && !aff2 ){.   
15e0: 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65   /* Neither side
15f0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1600: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
1610: 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20   Compare the.   
1620: 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65   ** results dire
1630: 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctly..    */.   
1640: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1650: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  FF_NONE;.  }else
1660: 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64  {.    /* One sid
1670: 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  e is a column, t
1680: 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e  he other is not.
1690: 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73   Use the columns
16a0: 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
16b0: 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d    assert( aff1==
16c0: 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a  0 || aff2==0 );.
16d0: 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31      return (aff1
16e0: 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a   + aff2);.  }.}.
16f0: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
1700: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1710: 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74  rator.  Return t
1720: 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  he type affinity
1730: 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
1740: 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f  be applied to bo
1750: 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f  th operands prio
1760: 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63  r to doing the c
1770: 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74  omparison..*/.st
1780: 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72  atic char compar
1790: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70  isonAffinity(Exp
17a0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61  r *pExpr){.  cha
17b0: 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28  r aff;.  assert(
17c0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
17d0: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
17e0: 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IN || pExpr->
17f0: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20  op==TK_LT ||.   
1800: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1810: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72  ==TK_GT || pExpr
1820: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70  ->op==TK_GE || p
1830: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
1840: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
1850: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c  pr->op==TK_NE ||
1860: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
1870: 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  S || pExpr->op==
1880: 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73  TK_ISNOT );.  as
1890: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
18a0: 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71  ft );.  aff = sq
18b0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
18c0: 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  y(pExpr->pLeft);
18d0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52  .  if( pExpr->pR
18e0: 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20  ight ){.    aff 
18f0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
1900: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
1910: 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20  pRight, aff);.  
1920: 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61  }else if( ExprHa
1930: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1940: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1950: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
1960: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1970: 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  ty(pExpr->x.pSel
1980: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ect->pEList->a[0
1990: 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20  ].pExpr, aff);. 
19a0: 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 20   }else if( !aff 
19b0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c  ){.    aff = SQL
19c0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
19d0: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
19e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
19f0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65  s a comparison e
1a00: 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27  xpression, eg. '
1a10: 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29  =', '<', IN(...)
1a20: 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66   etc..** idx_aff
1a30: 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66  inity is the aff
1a40: 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65  inity of an inde
1a50: 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75  xed column. Retu
1a60: 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68  rn true.** if th
1a70: 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66  e index with aff
1a80: 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69  inity idx_affini
1a90: 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  ty may be used t
1aa0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74  o implement.** t
1ab0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  he comparison in
1ac0: 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pExpr..*/.int s
1ad0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
1ae0: 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70  ityOk(Expr *pExp
1af0: 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69  r, char idx_affi
1b00: 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66  nity){.  char af
1b10: 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  f = comparisonAf
1b20: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
1b30: 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a   switch( aff ){.
1b40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b50: 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20 20  AFF_NONE:.      
1b60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61  return 1;.    ca
1b70: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  se SQLITE_AFF_TE
1b80: 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  XT:.      return
1b90: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
1ba0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
1bb0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1bc0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1bd0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1be0: 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ty(idx_affinity)
1bf0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1c00: 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c  eturn the P5 val
1c10: 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ue that should b
1c20: 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e  e used for a bin
1c30: 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  ary comparison.*
1c40: 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c  * opcode (OP_Eq,
1c50: 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65   OP_Ge etc.) use
1c60: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78  d to compare pEx
1c70: 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a  pr1 and pExpr2..
1c80: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e  */.static u8 bin
1c90: 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70  aryCompareP5(Exp
1ca0: 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20  r *pExpr1, Expr 
1cb0: 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d  *pExpr2, int jum
1cc0: 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61  pIfNull){.  u8 a
1cd0: 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74  ff = (char)sqlit
1ce0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1cf0: 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20  Expr2);.  aff = 
1d00: 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61  (u8)sqlite3Compa
1d10: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1d20: 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75  1, aff) | (u8)ju
1d30: 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75  mpIfNull;.  retu
1d40: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
1d50: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1d60: 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69  r to the collati
1d70: 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  on sequence that
1d80: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1d90: 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63  by.** a binary c
1da0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1db0: 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65  or comparing pLe
1dc0: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
1dd0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74  *.** If the left
1de0: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
1df0: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
1e00: 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20   sequence type, 
1e10: 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73  then it is.** us
1e20: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  ed. Otherwise th
1e30: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1e40: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67  ence for the rig
1e50: 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ht hand expressi
1e60: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f  on.** is used, o
1e70: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42  r the default (B
1e80: 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65  INARY) if neithe
1e90: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  r expression has
1ea0: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20   a collating.** 
1eb0: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  type..**.** Argu
1ec0: 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74  ment pRight (but
1ed0: 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20   not pLeft) may 
1ee0: 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  be a null pointe
1ef0: 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
1f00: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f  .** it is not co
1f10: 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c  nsidered..*/.Col
1f20: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e  lSeq *sqlite3Bin
1f30: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
1f40: 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  q(.  Parse *pPar
1f50: 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65  se, .  Expr *pLe
1f60: 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69  ft, .  Expr *pRi
1f70: 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ght.){.  CollSeq
1f80: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72   *pColl;.  asser
1f90: 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66  t( pLeft );.  if
1fa0: 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ( pLeft->flags &
1fb0: 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
1fc0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1fd0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1fe0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
1ff0: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
2000: 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61   && (pRight->fla
2010: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
2020: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  !=0 ){.    pColl
2030: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2040: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52  llSeq(pParse, pR
2050: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
2060: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2070: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2080: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
2090: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
20a0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
20b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
20c0: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
20d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
20e0: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
20f0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
2100: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
2110: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
2120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
2130: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
2140: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
2150: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
2160: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
2170: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
2180: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
2190: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
21a0: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
21b0: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
21c0: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
21d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
21e0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
21f0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
2200: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20  e */.  int in1, 
2210: 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69  int in2, /* Regi
2220: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65  ster holding ope
2230: 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rands */.  int d
2240: 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
2250: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75  Jump here if tru
2260: 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  e.  */.  int jum
2270: 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66  pIfNull    /* If
2280: 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65   true, jump if e
2290: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
22a0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
22b0: 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72  t p5;.  int addr
22c0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b  ;.  CollSeq *p4;
22d0: 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33  ..  p4 = sqlite3
22e0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
22f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
2300: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70  ft, pRight);.  p
2310: 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  5 = binaryCompar
2320: 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68  eP5(pLeft, pRigh
2330: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
2340: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
2350: 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73  VdbeAddOp4(pPars
2360: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
2370: 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31  , in2, dest, in1
2380: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
23a0: 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53  id*)p4, P4_COLLS
23b0: 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EQ);.  sqlite3Vd
23c0: 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73  beChangeP5(pPars
23d0: 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35  e->pVdbe, (u8)p5
23e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
23f0: 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
2400: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
2410: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
2420: 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67  t argument nHeig
2430: 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ht is less than 
2440: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
2450: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65  maximum.** expre
2460: 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f  ssion depth allo
2470: 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  wed. If it is no
2480: 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  t, leave an erro
2490: 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20  r message in.** 
24a0: 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  pParse..*/.int s
24b0: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
24c0: 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61  eight(Parse *pPa
24d0: 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74  rse, int nHeight
24e0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
24f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d  LITE_OK;.  int m
2500: 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73 65  xHeight = pParse
2510: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
2520: 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44  ITE_LIMIT_EXPR_D
2530: 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65  EPTH];.  if( nHe
2540: 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b  ight>mxHeight ){
2550: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2560: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
2570: 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e       "Expression
2580: 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72   tree is too lar
2590: 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74  ge (maximum dept
25a0: 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74  h %d)", mxHeight
25b0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
25c0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
25d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25e0: 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  }../* The follow
25f0: 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69  ing three functi
2600: 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70  ons, heightOfExp
2610: 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70  r(), heightOfExp
2620: 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68  rList().** and h
2630: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c  eightOfSelect(),
2640: 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65 74   are used to det
2650: 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d  ermine the maxim
2660: 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20  um height.** of 
2670: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  any expression t
2680: 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20 62  ree referenced b
2690: 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  y the structure 
26a0: 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a  passed as the.**
26b0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
26c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d  .**.** If this m
26d0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73  aximum height is
26e0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
26f0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
2700: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
2710: 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73   pnHeight, the s
2720: 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c  econd parameter,
2730: 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69   then set *pnHei
2740: 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76  ght to that.** v
2750: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
2760: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
2770: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *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 66 28 20 70 2d   p ){.    if( p-
27a0: 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67  >nHeight>*pnHeig
27b0: 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48  ht ){.      *pnH
27c0: 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67  eight = p->nHeig
27d0: 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ht;.    }.  }.}.
27e0: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
27f0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70  htOfExprList(Exp
2800: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70  rList *p, int *p
2810: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20  nHeight){.  if( 
2820: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
2830: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2840: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
2850: 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70       heightOfExp
2860: 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  r(p->a[i].pExpr,
2870: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2880: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2890: 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65  oid heightOfSele
28a0: 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ct(Select *p, in
28b0: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
28c0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69  if( p ){.    hei
28d0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68  ghtOfExpr(p->pWh
28e0: 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ere, pnHeight);.
28f0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2900: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48  (p->pHaving, pnH
2910: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
2920: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d  htOfExpr(p->pLim
2930: 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  it, pnHeight);. 
2940: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
2950: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65  p->pOffset, pnHe
2960: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2970: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
2980: 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29  EList, pnHeight)
2990: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
29a0: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
29b0: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
29c0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
29d0: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
29e0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
29f0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
2a00: 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67  ->pPrior, pnHeig
2a10: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
2a20: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
2a30: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
2a40: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
2a50: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
2a60: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
2a70: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
2a80: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
2a90: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
2aa0: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
2ab0: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
2ac0: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
2ad0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
2ae0: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
2af0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
2b00: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
2b10: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
2b20: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
2b30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2b40: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
2b50: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
2b60: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
2b70: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
2b80: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
2b90: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2ba0: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
2bb0: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
2bc0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
2bd0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
2be0: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
2bf0: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
2c00: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
2c10: 65 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  e{.    heightOfE
2c20: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
2c30: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
2c40: 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20   }.  p->nHeight 
2c50: 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d  = nHeight + 1;.}
2c60: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2c70: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
2c80: 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  iable using the 
2c90: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20  exprSetHeight() 
2ca0: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20  function. If.** 
2cb0: 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72  the height is gr
2cc0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d  eater than the m
2cd0: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65  aximum allowed e
2ce0: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c  xpression depth,
2cf0: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
2d00: 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  or in pParse..*/
2d10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2d20: 72 53 65 74 48 65 69 67 68 74 28 50 61 72 73 65  rSetHeight(Parse
2d30: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
2d40: 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48 65 69  p){.  exprSetHei
2d50: 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ght(p);.  sqlite
2d60: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
2d70: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
2d80: 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ght);.}../*.** R
2d90: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
2da0: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
2db0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
2dc0: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
2dd0: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
2de0: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
2df0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
2e00: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
2e10: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
2e20: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
2e30: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
2e40: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
2e50: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
2e60: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65  rn nHeight;.}.#e
2e70: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 65 78  lse.  #define ex
2e80: 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23  prSetHeight(y).#
2e90: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2ea0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
2eb0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
2ec0: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63  routine is the c
2ed0: 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f  ore allocator fo
2ee0: 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a  r Expr nodes..**
2ef0: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
2f00: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
2f10: 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ode and return a
2f20: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20   pointer to it. 
2f30: 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74   Memory.** for t
2f40: 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72  his node and for
2f50: 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75   the pToken argu
2f60: 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65  ment is a single
2f70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f   allocation.** o
2f80: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
2f90: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20  ite3DbMalloc(). 
2fa0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
2fb0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70  ction.** is resp
2fc0: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
2fd0: 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65  ng sure the node
2fe0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
2ff0: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
3000: 20 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65   dequote is true
3010: 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e  , then the token
3020: 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
3030: 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20  is dequoted..** 
3040: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61  If dequote is fa
3050: 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e  lse, no dequotin
3060: 67 20 69 73 20 70 65 72 66 6f 72 6d 61 6e 63 65  g is performance
3070: 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a  .  The deQuote.*
3080: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  * parameter is i
3090: 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e  gnored if pToken
30a0: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
30b0: 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f  he token does no
30c0: 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62  t.** appear to b
30d0: 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68  e quoted.  If th
30e0: 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66  e quotes were of
30f0: 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20   the form "..." 
3100: 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a  (double-quotes).
3110: 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44  ** then the EP_D
3120: 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73  blQuoted flag is
3130: 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72   set on the expr
3140: 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a  ession node..**.
3150: 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  ** Special case:
3160: 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45    If op==TK_INTE
3170: 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70  GER and pToken p
3180: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
3190: 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  g that.** can be
31a0: 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f   translated into
31b0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
31c0: 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  r, then the toke
31d0: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72  n is not.** stor
31e0: 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20  ed in u.zToken. 
31f0: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e   Instead, the in
3200: 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73 20  teger values is 
3210: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
3220: 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65  u.iValue and the
3230: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
3240: 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78  g is set.  No ex
3250: 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69  tra storage.** i
3260: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  s allocated to h
3270: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 20  old the integer 
3280: 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65 71  text and the deq
3290: 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e  uote flag is ign
32a0: 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ored..*/.Expr *s
32b0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
32c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
32e0: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
32f0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
3300: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3310: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3330: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3340: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
3350: 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54  *pToken,    /* T
3360: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3370: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3380: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
3390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
33a0: 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f  ue to dequote */
33b0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
33c0: 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  ;.  int nExtra =
33d0: 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65   0;.  int iValue
33e0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 54 6f   = 0;..  if( pTo
33f0: 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ken ){.    if( o
3400: 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
3410: 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20   pToken->z==0.  
3420: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
3430: 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65  e3GetInt32(pToke
3440: 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d  n->z, &iValue)==
3450: 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72  0 ){.      nExtr
3460: 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b  a = pToken->n+1;
3470: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
3480: 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20  Value>=0 );.    
3490: 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73  }.  }.  pNew = s
34a0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
34b0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  ro(db, sizeof(Ex
34c0: 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69  pr)+nExtra);.  i
34d0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70  f( pNew ){.    p
34e0: 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  New->op = (u8)op
34f0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67 67  ;.    pNew->iAgg
3500: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70   = -1;.    if( p
3510: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  Token ){.      i
3520: 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a  f( nExtra==0 ){.
3530: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
3540: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
3550: 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
3560: 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56 61  ->u.iValue = iVa
3570: 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lue;.      }else
3580: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  {.        int c;
3590: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
35a0: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
35b0: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20  )&pNew[1];.     
35c0: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65     assert( pToke
35d0: 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b 65  n->z!=0 || pToke
35e0: 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  n->n==0 );.     
35f0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e     if( pToken->n
3600: 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e   ) memcpy(pNew->
3610: 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e  u.zToken, pToken
3620: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b  ->z, pToken->n);
3630: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
3640: 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e  .zToken[pToken->
3650: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
3660: 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 6e  if( dequote && n
3670: 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20 20 20  Extra>=3 .      
3680: 20 20 20 20 20 20 20 26 26 20 28 28 63 20 3d 20         && ((c = 
3690: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d 3d 27  pToken->z[0])=='
36a0: 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20 7c 7c  \'' || c=='"' ||
36b0: 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 60   c=='[' || c=='`
36c0: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
36d0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70  sqlite3Dequote(p
36e0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  New->u.zToken);.
36f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
3700: 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61  ='"' ) pNew->fla
3710: 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74  gs |= EP_DblQuot
3720: 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
3730: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20      }.    }.#if 
3740: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
3750: 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77  DEPTH>0.    pNew
3760: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23  ->nHeight = 1;.#
3770: 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65  endif  .  }.  re
3780: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3790: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
37a0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
37b0: 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74  de from a zero-t
37c0: 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20  erminated token 
37d0: 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65  that has.** alre
37e0: 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65  ady been dequote
37f0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
3800: 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74  te3Expr(.  sqlit
3810: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
3820: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
3830: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3840: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
3850: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
3860: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3870: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
3880: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
3890: 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20  t char *zToken  
38a0: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
38b0: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
38c0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f   NULL */.){.  To
38d0: 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a  ken x;.  x.z = z
38e0: 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a  Token;.  x.n = z
38f0: 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33 53  Token ? sqlite3S
3900: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20  trlen30(zToken) 
3910: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  : 0;.  return sq
3920: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
3930: 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d  b, op, &x, 0);.}
3940: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73  ../*.** Attach s
3950: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
3960: 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20  d pRight to the 
3970: 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e  Expr node pRoot.
3980: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d  .**.** If pRoot=
3990: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
39a0: 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61   that a memory a
39b0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
39c0: 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  has occurred..**
39d0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
39e0: 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65  elete the subtre
39f0: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
3a00: 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ght..*/.void sql
3a10: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
3a20: 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65  btrees(.  sqlite
3a30: 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70  3 *db,.  Expr *p
3a40: 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c  Root,.  Expr *pL
3a50: 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69  eft,.  Expr *pRi
3a60: 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f  ght.){.  if( pRo
3a70: 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ot==0 ){.    ass
3a80: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
3a90: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
3aa0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
3ab0: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
3ac0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3ad0: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
3ae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
3af0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
3b00: 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  Root->pRight = p
3b10: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f  Right;.      pRo
3b20: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
3b30: 43 6f 6c 6c 61 74 65 20 26 20 70 52 69 67 68 74  Collate & pRight
3b40: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
3b50: 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a     if( pLeft ){.
3b60: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65        pRoot->pLe
3b70: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20  ft = pLeft;.    
3b80: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
3b90: 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26 20 70  = EP_Collate & p
3ba0: 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Left->flags;.   
3bb0: 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65   }.    exprSetHe
3bc0: 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d  ight(pRoot);.  }
3bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
3be0: 74 65 20 61 20 45 78 70 72 20 6e 6f 64 65 20 77  te a Expr node w
3bf0: 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61  hich joins as ma
3c00: 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72 65  ny as two subtre
3c10: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72  es..**.** One or
3c20: 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62   both of the sub
3c30: 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c  trees can be NUL
3c40: 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  L.  Return a poi
3c50: 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a  nter to the new.
3c60: 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f  ** Expr node.  O
3c70: 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72  r, if an OOM err
3c80: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70  or occurs, set p
3c90: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
3ca0: 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65  cFailed,.** free
3cb0: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61 6e   the subtrees an
3cc0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
3cd0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50  /.Expr *sqlite3P
3ce0: 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70  Expr(.  Parse *p
3cf0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
3d00: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3d10: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  xt */.  int op, 
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d30: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
3d40: 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  code */.  Expr *
3d50: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
3d60: 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e    /* Left operan
3d70: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  d */.  Expr *pRi
3d80: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
3d90: 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20  * Right operand 
3da0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
3db0: 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20   *pToken     /* 
3dc0: 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a  Argument token *
3dd0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  /.){.  Expr *p;.
3de0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44    if( op==TK_AND
3df0: 20 26 26 20 70 4c 65 66 74 20 26 26 20 70 52 69   && pLeft && pRi
3e00: 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61  ght ){.    /* Ta
3e10: 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ke advantage of 
3e20: 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61  short-circuit fa
3e30: 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  lse optimization
3e40: 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20   for AND */.    
3e50: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  p = sqlite3ExprA
3e60: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
3e70: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
3e80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
3e90: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3ea0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c  (pParse->db, op,
3eb0: 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 20   pToken, 1);.   
3ec0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
3ed0: 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73  chSubtrees(pPars
3ee0: 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c  e->db, p, pLeft,
3ef0: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20   pRight);.  }.  
3f00: 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71  if( p ) {.    sq
3f10: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65  lite3ExprCheckHe
3f20: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  ight(pParse, p->
3f30: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  nHeight);.  }.  
3f40: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
3f50: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
3f60: 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  sion is always e
3f70: 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41  ither TRUE or FA
3f80: 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c  LSE (respectivel
3f90: 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  y),.** then retu
3fa0: 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61  rn 1.  If one ca
3fb0: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74  nnot determine t
3fc0: 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f  he truth value o
3fd0: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
3fe0: 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ion at compile-t
3ff0: 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ime return 0..**
4000: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f  .** This is an o
4010: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66  ptimization.  If
4020: 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e   is OK to return
4030: 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a   0 here even if.
4040: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
4050: 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61  n really is alwa
4060: 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73  ys false or fals
4070: 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74  e (a false negat
4080: 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20  ive)..** But it 
4090: 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75  is a bug to retu
40a0: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
40b0: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76  ession might hav
40c0: 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62  e different.** b
40d0: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e  oolean values in
40e0: 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75   different circu
40f0: 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73  mstances (a fals
4100: 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a  e positive.).**.
4110: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
4120: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
4130: 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74  s part of condit
4140: 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c  ional for a.** L
4150: 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77  EFT JOIN, then w
4160: 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
4170: 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ne at compile-ti
4180: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
4190: 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20  t.** is it true 
41a0: 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77  or false, so alw
41b0: 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ays return 0..*/
41c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
41d0: 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20  AlwaysTrue(Expr 
41e0: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
41f0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
4200: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
4210: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
4220: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
4230: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
4240: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
4250: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30  0;.  return v!=0
4260: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  ;.}.static int e
4270: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45  xprAlwaysFalse(E
4280: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76  xpr *p){.  int v
4290: 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72   = 0;.  if( Expr
42a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
42b0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
42c0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
42d0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
42e0: 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74  ger(p, &v) ) ret
42f0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
4300: 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  v==0;.}../*.** J
4310: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
4320: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
4330: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
4340: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
4350: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
4360: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
4370: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
4380: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
4390: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
43a0: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
43b0: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
43c0: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
43d0: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
43e0: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
43f0: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
4400: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
4410: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
4420: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
4430: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
4440: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
4450: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
4460: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
4470: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
4480: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
4490: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
44a0: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
44b0: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
44c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70  .  }else if( exp
44d0: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
44e0: 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79  ft) || exprAlway
44f0: 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29  sFalse(pRight) )
4500: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4510: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
4520: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4530: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
4540: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
4550: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
4560: 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
4570: 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
4580: 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d  kens[0], 0);.  }
4590: 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a  else{.    Expr *
45a0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
45b0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41  prAlloc(db, TK_A
45c0: 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ND, 0, 0);.    s
45d0: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
45e0: 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65  Subtrees(db, pNe
45f0: 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  w, pLeft, pRight
4600: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e  );.    return pN
4610: 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ew;.  }.}../*.**
4620: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
4630: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
4640: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
4650: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
4660: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
4670: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
4680: 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
4690: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
46a0: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
46b0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
46c0: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
46d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
46e0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
46f0: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
4700: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
4710: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
4720: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
4730: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
4740: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
4750: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
4760: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
4770: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
4780: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
4790: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
47a0: 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  .  pNew->x.pList
47b0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65   = pList;.  asse
47c0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
47d0: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
47e0: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71  sSelect) );.  sq
47f0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
4800: 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  ht(pParse, pNew)
4810: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
4820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
4830: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
4840: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
4850: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
4860: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
4870: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
4880: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
4890: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
48a0: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
48b0: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
48c0: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
48d0: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
48e0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
48f0: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
4900: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
4910: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
4920: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
4930: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
4940: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
4950: 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20  too be to avoid 
4960: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
4970: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
4980: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
4990: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
49a0: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
49b0: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
49c0: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
49d0: 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20  ":aaa", "@aaa", 
49e0: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
49f0: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
4a00: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
4a10: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
4a20: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
4a30: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
4a40: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
4a50: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
4a60: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
4a70: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61  he next sequenia
4a80: 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  l variable numbe
4a90: 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64  r is.** assigned
4aa0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4ab0: 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75  3ExprAssignVarNu
4ac0: 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  mber(Parse *pPar
4ad0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
4ae0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
4af0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
4b00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a  const char *z;..
4b10: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
4b20: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4b30: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
4b40: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
4b50: 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63 65  tValue|EP_Reduce
4b60: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  d|EP_TokenOnly) 
4b70: 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e  );.  z = pExpr->
4b80: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65  u.zToken;.  asse
4b90: 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73  rt( z!=0 );.  as
4ba0: 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b  sert( z[0]!=0 );
4bb0: 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29  .  if( z[1]==0 )
4bc0: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
4bd0: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
4be0: 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e  ".  Assign the n
4bf0: 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ext variable num
4c00: 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ber */.    asser
4c10: 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a  t( z[0]=='?' );.
4c20: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
4c30: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70  mn = (ynVar)(++p
4c40: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
4c50: 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61 72  }else{.    ynVar
4c60: 20 78 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20   x = 0;.    u32 
4c70: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
4c80: 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  n30(z);.    if( 
4c90: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  z[0]=='?' ){.   
4ca0: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
4cb0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
4cc0: 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e  ".  Convert "nnn
4cd0: 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  " to an integer 
4ce0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  and.      ** use
4cf0: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
4d00: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
4d10: 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20      i64 i;.     
4d20: 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71   int bOk = 0==sq
4d30: 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31  lite3Atoi64(&z[1
4d40: 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49  ], &i, n-1, SQLI
4d50: 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
4d60: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
4d70: 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20   x = (ynVar)i;. 
4d80: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4d90: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
4da0: 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20  tcase( i==1 );. 
4db0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4dc0: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
4dd0: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4de0: 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a  LE_NUMBER]-1 );.
4df0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4e00: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
4e10: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4e20: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20  BLE_NUMBER] );. 
4e30: 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20       if( bOk==0 
4e40: 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e  || i<1 || i>db->
4e50: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
4e60: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
4e70: 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  BER] ){.        
4e80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4e90: 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c  pParse, "variabl
4ea0: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65  e number must be
4eb0: 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20   between ?1 and 
4ec0: 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?%d",.          
4ed0: 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c    db->aLimit[SQL
4ee0: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4ef0: 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20  LE_NUMBER]);.   
4f00: 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 20       x = 0;.    
4f10: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
4f20: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
4f30: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4f40: 6e 56 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a 20  nVar = (int)i;. 
4f50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
4f60: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
4f70: 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22  ards like ":aaa"
4f80: 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61  , "$aaa" or "@aa
4f90: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
4fa0: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
4fb0: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
4fc0: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
4fd0: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4fe0: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
4ff0: 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68   name.      ** h
5000: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
5010: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
5020: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
5030: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
5040: 2f 0a 20 20 20 20 20 20 79 6e 56 61 72 20 69 3b  /.      ynVar i;
5050: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
5060: 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b  i<pParse->nzVar;
5070: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
5080: 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  f( pParse->azVar
5090: 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 70 50  [i] && strcmp(pP
50a0: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c 7a  arse->azVar[i],z
50b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
50c0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
50d0: 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 2b   = x = (ynVar)i+
50e0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
50f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5100: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5110: 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70 72  x==0 ) x = pExpr
5120: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56  ->iColumn = (ynV
5130: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
5140: 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ar);.    }.    i
5150: 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( x>0 ){.      
5160: 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e 7a  if( x>pParse->nz
5170: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Var ){.        c
5180: 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20 20  har **a;.       
5190: 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65   a = sqlite3DbRe
51a0: 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73 65  alloc(db, pParse
51b0: 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65 6f  ->azVar, x*sizeo
51c0: 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  f(a[0]));.      
51d0: 20 20 69 66 28 20 61 3d 3d 30 20 29 20 72 65 74    if( a==0 ) ret
51e0: 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f 72 20 72  urn;  /* Error r
51f0: 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68 20  eported through 
5200: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5210: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 61 72   */.        pPar
5220: 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a 20  se->azVar = a;. 
5230: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61         memset(&a
5240: 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d 2c  [pParse->nzVar],
5250: 20 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e 6e   0, (x-pParse->n
5260: 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b 30  zVar)*sizeof(a[0
5270: 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ]));.        pPa
5280: 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b 0a  rse->nzVar = x;.
5290: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
52a0: 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20 70  ( z[0]!='?' || p
52b0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31  Parse->azVar[x-1
52c0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
52d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
52e0: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  , pParse->azVar[
52f0: 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  x-1]);.        p
5300: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31  Parse->azVar[x-1
5310: 5d 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  ] = sqlite3DbStr
5320: 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b 0a  NDup(db, z, n);.
5330: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5340: 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  } .  if( !pParse
5350: 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73 65  ->nErr && pParse
5360: 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69  ->nVar>db->aLimi
5370: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
5380: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
5390: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
53a0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
53b0: 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72  too many SQL var
53c0: 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a  iables");.  }.}.
53d0: 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65  ./*.** Recursive
53e0: 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70  ly delete an exp
53f0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
5400: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
5410: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
5420: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
5430: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
5440: 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  rn;.  /* Sanity 
5450: 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68  check: Assert th
5460: 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20  at the IntValue 
5470: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  is non-negative 
5480: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
5490: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
54a0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
54b0: 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d  _IntValue) || p-
54c0: 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  >u.iValue>=0 );.
54d0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
54e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
54f0: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 2f  enOnly) ){.    /
5500: 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69  * The Expr.x uni
5510: 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  on is never used
5520: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
5530: 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74  e as Expr.pRight
5540: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
5550: 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  p->x.pList==0 ||
5560: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
5570: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
5580: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
5590: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
55a0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
55b0: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  p->pRight);.    
55c0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
55d0: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
55e0: 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62 46  en) ) sqlite3DbF
55f0: 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f  ree(db, p->u.zTo
5600: 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ken);.    if( Ex
5610: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5620: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
5630: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
5640: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
5650: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
5660: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5670: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
5680: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
5690: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
56a0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
56b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74  roperty(p, EP_St
56c0: 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c  atic) ){.    sql
56d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
56e0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
56f0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5700: 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63  r of bytes alloc
5710: 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70  ated for the exp
5720: 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72  ression structur
5730: 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  e .** passed as 
5740: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
5750: 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  nt. This is alwa
5760: 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46  ys one of EXPR_F
5770: 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52  ULLSIZE,.** EXPR
5780: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20  _REDUCEDSIZE or 
5790: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
57a0: 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ZE..*/.static in
57b0: 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  t exprStructSize
57c0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
57d0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
57e0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
57f0: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
5800: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20  TOKENONLYSIZE;. 
5810: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
5820: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
5830: 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ed) ) return EXP
5840: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20  R_REDUCEDSIZE;. 
5850: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c   return EXPR_FUL
5860: 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSIZE;.}../*.** 
5870: 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53 69  The dupedExpr*Si
5880: 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61  ze() routines ea
5890: 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ch return the nu
58a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
58b0: 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f  quired.** to sto
58c0: 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  re a copy of an 
58d0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78  expression or ex
58e0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
58f0: 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a  They differ in.*
5900: 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68  * how much of th
5910: 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75 72  e tree is measur
5920: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75  ed..**.**     du
5930: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
5940: 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20  e()     Size of 
5950: 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73 74  only the Expr st
5960: 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20  ructure .**     
5970: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
5980: 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f  e()       Size o
5990: 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20 66  f Expr + space f
59a0: 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20  or token.**     
59b0: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29 20  dupedExprSize() 
59c0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2b            Expr +
59d0: 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65   token + subtree
59e0: 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a   components.**.*
59f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
5a40: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53 74   The dupedExprSt
5a50: 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74  ructSize() funct
5a60: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20  ion returns two 
5a70: 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67  values OR-ed tog
5a80: 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20  ether:  .** (1) 
5a90: 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72  the space requir
5aa0: 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66  ed for a copy of
5ab0: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
5ac0: 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a  ure only and .**
5ad0: 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78 20   (2) the EP_xxx 
5ae0: 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63  flags that indic
5af0: 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74 72  ate what the str
5b00: 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75  ucture size shou
5b10: 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65  ld be..** The re
5b20: 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61  turn values is a
5b30: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  lways one of:.**
5b40: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55  .**      EXPR_FU
5b50: 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45  LLSIZE.**      E
5b60: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
5b70: 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a    | EP_Reduced.*
5b80: 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45  *      EXPR_TOKE
5b90: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
5ba0: 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54  okenOnly.**.** T
5bb0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73  he size of the s
5bc0: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
5bd0: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
5be0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
5bf0: 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75  e.** of this rou
5c00: 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e  tine with 0xfff.
5c10: 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20    The flags can 
5c20: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
5c30: 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  ing the.** retur
5c40: 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f  n value with EP_
5c50: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
5c60: 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  Only..**.** Note
5c70: 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67 73   that with flags
5c80: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
5c90: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20  , this routines 
5ca0: 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69  works on full-si
5cb0: 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64  ze.** (unreduced
5cc0: 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61  ) Expr objects a
5cd0: 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e  s they or origin
5ce0: 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64  ally constructed
5cf0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a   by the parser..
5d00: 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65 73  ** During expres
5d10: 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65  sion analysis, e
5d20: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
5d30: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
5d40: 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c   moved into.** l
5d50: 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74 65  ater parts of te
5d60: 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  h Expr object an
5d70: 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66  d that extra inf
5d80: 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67  ormation might g
5d90: 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66  et chopped.** of
5da0: 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  f if the express
5db0: 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20  ion is reduced. 
5dc0: 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
5dd0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  it does not work
5de0: 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45 58   to.** make a EX
5df0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70  PRDUP_REDUCE cop
5e00: 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65  y of a reduced e
5e10: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69  xpression.  It i
5e20: 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20  s only legal.** 
5e30: 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73  to reduce a pris
5e40: 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tine expression 
5e50: 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61  tree from the pa
5e60: 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65  rser.  The imple
5e70: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mentation.** of 
5e80: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
5e90: 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75  ize() contain mu
5ea0: 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20  ltiple assert() 
5eb0: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
5ec0: 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e  attempt.** to en
5ed0: 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74  force this const
5ee0: 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  raint..*/.static
5ef0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74   int dupedExprSt
5f00: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
5f10: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
5f20: 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73  int nSize;.  ass
5f30: 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52  ert( flags==EXPR
5f40: 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c  DUP_REDUCE || fl
5f50: 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c  ags==0 ); /* Onl
5f60: 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65  y one flag value
5f70: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73   allowed */.  as
5f80: 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53  sert( EXPR_FULLS
5f90: 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20  IZE<=0xfff );.  
5fa0: 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26  assert( (0xfff &
5fb0: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
5fc0: 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29  TokenOnly))==0 )
5fd0: 3b 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c 61 67  ;.  if( 0==(flag
5fe0: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
5ff0: 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  ) ){.    nSize =
6000: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
6010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
6020: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
6030: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
6040: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
6050: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
6060: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
6070: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
6080: 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74  ) ); .    assert
6090: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
60a0: 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65  ty(p, EP_MemToke
60b0: 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
60c0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
60d0: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
60e0: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  e) );.    if( p-
60f0: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70  >pLeft || p->x.p
6100: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
6110: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
6120: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
6130: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
6140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
6150: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
6160: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
6170: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
6180: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20   EP_TokenOnly;. 
6190: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
61a0: 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nSize;.}../*.*
61b0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
61c0: 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63  returns the spac
61d0: 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69  e in bytes requi
61e0: 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  red to store the
61f0: 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65   copy .** of the
6200: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
6210: 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  and a copy of th
6220: 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  e Expr.u.zToken 
6230: 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a  string (if that.
6240: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66  ** string is def
6250: 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ined.).*/.static
6260: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f   int dupedExprNo
6270: 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  deSize(Expr *p, 
6280: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
6290: 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45  t nByte = dupedE
62a0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
62b0: 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b   flags) & 0xfff;
62c0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
62d0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
62e0: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
62f0: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42  zToken ){.    nB
6300: 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
6310: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
6320: 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74  en)+1;.  }.  ret
6330: 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  urn ROUND8(nByte
6340: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
6350: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
6360: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
6370: 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c  to create a dupl
6380: 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a  icate of the .**
6390: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
63a0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
63b0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65  argument. The se
63c0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
63d0: 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61   a.** mask conta
63e0: 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58  ining EXPRDUP_XX
63f0: 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  X flags..**.** T
6400: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
6410: 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65  d includes space
6420: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70   to create a cop
6430: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
6440: 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61  ruct.** itself a
6450: 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65  nd the buffer re
6460: 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70  ferred to by Exp
6470: 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61  r.u.zToken, if a
6480: 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ny..**.** If the
6490: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
64a0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
64b0: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
64c0: 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20  ue includes .** 
64d0: 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61  space to duplica
64e0: 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65  te all Expr node
64f0: 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f  s in the tree fo
6500: 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65  rmed by Expr.pLe
6510: 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e  ft .** and Expr.
6520: 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73  pRight variables
6530: 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e   (but not for an
6540: 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69  y structures poi
6550: 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64  nted to or .** d
6560: 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68  escended from th
6570: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f  e Expr.x.pList o
6580: 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  r Expr.x.pSelect
6590: 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a   variables)..*/.
65a0: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
65b0: 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ExprSize(Expr *p
65c0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
65d0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  int nByte = 0;. 
65e0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42   if( p ){.    nB
65f0: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e  yte = dupedExprN
6600: 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  odeSize(p, flags
6610: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
6620: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  &EXPRDUP_REDUCE 
6630: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
6640: 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  = dupedExprSize(
6650: 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29  p->pLeft, flags)
6660: 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65   + dupedExprSize
6670: 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67  (p->pRight, flag
6680: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  s);.    }.  }.  
6690: 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a  return nByte;.}.
66a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
66b0: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
66c0: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  to sqlite3ExprDu
66d0: 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  p(), except that
66e0: 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a   if pzBuffer .**
66f0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
6700: 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61  n *pzBuffer is a
6710: 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20  ssumed to point 
6720: 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67  to a buffer larg
6730: 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20  e enough .** to 
6740: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  store the copy o
6750: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20  f expression p, 
6760: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d  the copies of p-
6770: 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66  >u.zToken.** (if
6780: 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e   applicable), an
6790: 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  d the copies of 
67a0: 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64  the p->pLeft and
67b0: 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65   p->pRight expre
67c0: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e  ssions,.** if an
67d0: 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  y. Before return
67e0: 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69  ing, *pzBuffer i
67f0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  s set to the fir
6800: 73 74 20 62 79 74 65 20 70 61 73 73 65 64 20 74  st byte passed t
6810: 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66  he.** portion of
6820: 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69   the buffer copi
6830: 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20  ed into by this 
6840: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
6850: 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75  tic Expr *exprDu
6860: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
6870: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
6880: 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72  s, u8 **pzBuffer
6890: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20  ){.  Expr *pNew 
68a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
68b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
68c0: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
68d0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
68e0: 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75 63  onst int isReduc
68f0: 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50 52  ed = (flags&EXPR
6900: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
6910: 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20 20   u8 *zAlloc;.   
6920: 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 20   u32 staticFlag 
6930: 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  = 0;..    assert
6940: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
6950: 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a 20   isReduced );.. 
6960: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
6970: 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   where to write 
6980: 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72  the new Expr str
6990: 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69  ucture. */.    i
69a0: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
69b0: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70       zAlloc = *p
69c0: 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 73  zBuffer;.      s
69d0: 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53  taticFlag = EP_S
69e0: 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73 65  tatic;.    }else
69f0: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6a00: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6a10: 52 61 77 28 64 62 2c 20 64 75 70 65 64 45 78 70  Raw(db, dupedExp
6a20: 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 29  rSize(p, flags))
6a30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
6a40: 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f   = (Expr *)zAllo
6a50: 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77  c;..    if( pNew
6a60: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   ){.      /* Set
6a70: 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65   nNewSize to the
6a80: 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20   size allocated 
6a90: 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72  for the structur
6aa0: 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20  e pointed to.   
6ab0: 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54     ** by pNew. T
6ac0: 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58  his is either EX
6ad0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50  PR_FULLSIZE, EXP
6ae0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
6af0: 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f 54  .      ** EXPR_T
6b00: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54  OKENONLYSIZE. nT
6b10: 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
6b20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
6b30: 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20  es consumed.    
6b40: 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79    ** by the copy
6b50: 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f   of the p->u.zTo
6b60: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61  ken string (if a
6b70: 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ny)..      */.  
6b80: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
6b90: 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d  ed nStructSize =
6ba0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
6bb0: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
6bc0: 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
6bd0: 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75  nNewSize = nStru
6be0: 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a  ctSize & 0xfff;.
6bf0: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e        int nToken
6c00: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70  ;.      if( !Exp
6c10: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6c20: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
6c30: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
6c40: 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20         nToken = 
6c50: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6c60: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31  p->u.zToken) + 1
6c70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6c80: 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20         nToken = 
6c90: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
6ca0: 20 69 66 28 20 69 73 52 65 64 75 63 65 64 20 29   if( isReduced )
6cb0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6cc0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6cd0: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
6ce0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ==0 );.        m
6cf0: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
6d00: 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20   nNewSize);.    
6d10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6d20: 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78 70   int nSize = exp
6d30: 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a  rStructSize(p);.
6d40: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
6d50: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29  Alloc, p, nSize)
6d60: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
6d70: 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c  (&zAlloc[nSize],
6d80: 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   0, EXPR_FULLSIZ
6d90: 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  E-nSize);.      
6da0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  }..      /* Set 
6db0: 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20  the EP_Reduced, 
6dc0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e  EP_TokenOnly, an
6dd0: 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67  d EP_Static flag
6de0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  s appropriately.
6df0: 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
6e00: 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65  flags &= ~(EP_Re
6e10: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
6e20: 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f  ly|EP_Static|EP_
6e30: 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  MemToken);.     
6e40: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
6e50: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45  nStructSize & (E
6e60: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
6e70: 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70  enOnly);.      p
6e80: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74  New->flags |= st
6e90: 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20  aticFlag;..     
6ea0: 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e   /* Copy the p->
6eb0: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c  u.zToken string,
6ec0: 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
6ed0: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a    if( nToken ){.
6ee0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
6ef0: 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a  oken = pNew->u.z
6f00: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
6f10: 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d  zAlloc[nNewSize]
6f20: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
6f30: 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54  (zToken, p->u.zT
6f40: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
6f50: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
6f60: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
6f70: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45  pNew->flags) & E
6f80: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6f90: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
6fa0: 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70  in the pNew->x.p
6fb0: 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e  Select or pNew->
6fc0: 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20  x.pList member. 
6fd0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  */.        if( E
6fe0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6ff0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
7000: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
7010: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73  w->x.pSelect = s
7020: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
7030: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
7040: 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20  , isReduced);.  
7050: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7060: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
7070: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
7080: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
7090: 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64 75  >x.pList, isRedu
70a0: 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ced);.        }.
70b0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
70c0: 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e  * Fill in pNew->
70d0: 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e  pLeft and pNew->
70e0: 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20  pRight. */.     
70f0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
7100: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
7110: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
7120: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ly) ){.        z
7130: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
7140: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
7150: 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ags);.        if
7160: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
7170: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
7180: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
7190: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 65   pNew->pLeft = e
71a0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
71b0: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
71c0: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20  UCE, &zAlloc);. 
71d0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
71e0: 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70 28  Right = exprDup(
71f0: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45  db, p->pRight, E
7200: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
7210: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
7220: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
7230: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  zBuffer ){.     
7240: 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d       *pzBuffer =
7250: 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20   zAlloc;.       
7260: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
7270: 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78 70          if( !Exp
7280: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
7290: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
72a0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
72b0: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
72c0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
72d0: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
72e0: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
72f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7300: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
7310: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
7320: 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20       }..    }.  
7330: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
7340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
7350: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65   and return a de
7360: 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f  ep copy of the o
7370: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
7380: 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61  the second .** a
7390: 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f  rgument. If an O
73a0: 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  OM condition is 
73b0: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c  encountered, NUL
73c0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  L is returned.**
73d0: 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c   and the db->mal
73e0: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73  locFailed flag s
73f0: 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  et..*/.#ifndef S
7400: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73  QLITE_OMIT_CTE.s
7410: 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74 68  tatic With *with
7420: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
7430: 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74   With *p){.  Wit
7440: 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  h *pRet = 0;.  i
7450: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
7460: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
7470: 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61  p) + sizeof(p->a
7480: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d  [0]) * (p->nCte-
7490: 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73  1);.    pRet = s
74a0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
74b0: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
74c0: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
74d0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
74e0: 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70    pRet->nCte = p
74f0: 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f  ->nCte;.      fo
7500: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
7510: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7520: 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pRet->a[i].pSele
7530: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
7540: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  ctDup(db, p->a[i
7550: 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ].pSelect, 0);. 
7560: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
7570: 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65  ].pCols = sqlite
7580: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
7590: 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20   p->a[i].pCols, 
75a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  0);.        pRet
75b0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
75c0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
75d0: 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  b, p->a[i].zName
75e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
75f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
7600: 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  et;.}.#else.# de
7610: 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79  fine withDup(x,y
7620: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
7630: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7640: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
7650: 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69  s make deep copi
7660: 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  es of expression
7670: 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  s,.** expression
7680: 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73   lists, ID lists
7690: 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61  , and select sta
76a0: 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f  tements.  The co
76b0: 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64  pies can.** be d
76c0: 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67  eleted (by being
76d0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72   passed to their
76e0: 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44   respective ...D
76f0: 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73  elete() routines
7700: 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66  ).** without eff
7710: 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  ecting the origi
7720: 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nals..**.** The 
7730: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
7740: 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20   ID, and source 
7750: 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20  lists return by 
7760: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7770: 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  up(),.** sqlite3
7780: 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64  IdListDup(), and
7790: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
77a0: 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20  up() can not be 
77b0: 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64  further expanded
77c0: 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65   .** by subseque
77d0: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
77e0: 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20  te*ListAppend() 
77f0: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20  routines..**.** 
7800: 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20  Any tables that 
7810: 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68  the SrcList migh
7820: 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e  t point to are n
7830: 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a  ot duplicated..*
7840: 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
7850: 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e  arameter contain
7860: 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  s a combination 
7870: 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 58  of the EXPRDUP_X
7880: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20  XX flags..** If 
7890: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
78a0: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
78b0: 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75  then the structu
78c0: 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  re returned is a
78d0: 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65  .** truncated ve
78e0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75  rsion of the usu
78f0: 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75 72  al Expr structur
7900: 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73  e that will be s
7910: 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74  tored as.** part
7920: 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
7930: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
7940: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
7950: 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72   schema..*/.Expr
7960: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70   *sqlite3ExprDup
7970: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
7980: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
7990: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
79a0: 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73  Dup(db, p, flags
79b0: 2c 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74  , 0);.}.ExprList
79c0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
79d0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
79e0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  , ExprList *p, i
79f0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70  nt flags){.  Exp
7a00: 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73  rList *pNew;.  s
7a10: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
7a20: 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c  tem *pItem, *pOl
7a30: 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  dItem;.  int i;.
7a40: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
7a50: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
7a60: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7a70: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7a80: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
7a90: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7aa0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73  ;.  pNew->iECurs
7ab0: 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  or = 0;.  pNew->
7ac0: 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e  nExpr = i = p->n
7ad0: 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c 61  Expr;.  if( (fla
7ae0: 67 73 20 26 20 45 58 50 52 44 55 50 5f 52 45 44  gs & EXPRDUP_RED
7af0: 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d  UCE)==0 ) for(i=
7b00: 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  1; i<p->nExpr; i
7b10: 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61  +=i){}.  pNew->a
7b20: 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74   = pItem = sqlit
7b30: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
7b40: 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  ,  i*sizeof(p->a
7b50: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49  [0]) );.  if( pI
7b60: 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tem==0 ){.    sq
7b70: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7b80: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
7b90: 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64  n 0;.  } .  pOld
7ba0: 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66  Item = p->a;.  f
7bb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
7bc0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
7bd0: 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20  , pOldItem++){. 
7be0: 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70     Expr *pOldExp
7bf0: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45  r = pOldItem->pE
7c00: 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  xpr;.    pItem->
7c10: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
7c20: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45  xprDup(db, pOldE
7c30: 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  xpr, flags);.   
7c40: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
7c50: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
7c60: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
7c70: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
7c80: 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
7c90: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
7ca0: 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  dItem->zSpan);. 
7cb0: 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72     pItem->sortOr
7cc0: 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  der = pOldItem->
7cd0: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70  sortOrder;.    p
7ce0: 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a  Item->done = 0;.
7cf0: 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e      pItem->bSpan
7d00: 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  IsTab = pOldItem
7d10: 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20 20  ->bSpanIsTab;.  
7d20: 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c    pItem->u = pOl
7d30: 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20  dItem->u;.  }.  
7d40: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
7d50: 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73  /*.** If cursors
7d60: 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77  , triggers, view
7d70: 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
7d80: 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64   are all omitted
7d90: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69   from.** the bui
7da0: 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66  ld, then none of
7db0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
7dc0: 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20  outines, except 
7dd0: 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53  for .** sqlite3S
7de0: 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20  electDup(), can 
7df0: 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74  be called. sqlit
7e00: 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73  e3SelectDup() is
7e10: 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61   sometimes.** ca
7e20: 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c  lled with a NULL
7e30: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
7e40: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
7e50: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
7e60: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7e70: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a  OMIT_TRIGGER) \.
7e80: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
7e90: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
7ea0: 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  Y).SrcList *sqli
7eb0: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71  te3SrcListDup(sq
7ec0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
7ed0: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
7ee0: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  ){.  SrcList *pN
7ef0: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
7f00: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20  nt nByte;.  if( 
7f10: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
7f20: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
7f30: 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63  f(*p) + (p->nSrc
7f40: 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61  >0 ? sizeof(p->a
7f50: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d  [0]) * (p->nSrc-
7f60: 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20  1) : 0);.  pNew 
7f70: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7f80: 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29  cRaw(db, nByte )
7f90: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
7fa0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
7fb0: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
7fc0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
7fd0: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
7fe0: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
7ff0: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
8000: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
8010: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
8020: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
8030: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
8040: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
8050: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
8060: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63     pNewItem->pSc
8070: 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  hema = pOldItem-
8080: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e  >pSchema;.    pN
8090: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
80a0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
80b0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
80c0: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
80d0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
80e0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
80f0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
8100: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
8110: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
8120: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8130: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8140: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
8150: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d  Item->jointype =
8160: 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pOldItem->joint
8170: 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ype;.    pNewIte
8180: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
8190: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
81a0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64      pNewItem->ad
81b0: 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64  drFillSub = pOld
81c0: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
81d0: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
81e0: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c  >regReturn = pOl
81f0: 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  dItem->regReturn
8200: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8210: 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20 70  isCorrelated = p
8220: 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65  OldItem->isCorre
8230: 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77 49  lated;.    pNewI
8240: 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
8250: 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 76 69  e = pOldItem->vi
8260: 61 43 6f 72 6f 75 74 69 6e 65 3b 0a 20 20 20 20  aCoroutine;.    
8270: 70 4e 65 77 49 74 65 6d 2d 3e 69 73 52 65 63 75  pNewItem->isRecu
8280: 72 73 69 76 65 20 3d 20 70 4f 6c 64 49 74 65 6d  rsive = pOldItem
8290: 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3b 0a 20  ->isRecursive;. 
82a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e     pNewItem->zIn
82b0: 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 53  dex = sqlite3DbS
82c0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
82d0: 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20  em->zIndex);.   
82e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e   pNewItem->notIn
82f0: 64 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  dexed = pOldItem
8300: 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20  ->notIndexed;.  
8310: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64    pNewItem->pInd
8320: 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ex = pOldItem->p
8330: 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 20  Index;.    pTab 
8340: 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62  = pNewItem->pTab
8350: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61   = pOldItem->pTa
8360: 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  b;.    if( pTab 
8370: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  ){.      pTab->n
8380: 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref++;.    }.   
8390: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65   pNewItem->pSele
83a0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
83b0: 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  ctDup(db, pOldIt
83c0: 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61  em->pSelect, fla
83d0: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  gs);.    pNewIte
83e0: 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33  m->pOn = sqlite3
83f0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
8400: 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73  Item->pOn, flags
8410: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
8420: 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65  >pUsing = sqlite
8430: 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70  3IdListDup(db, p
8440: 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  OldItem->pUsing)
8450: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8460: 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74  colUsed = pOldIt
8470: 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d  em->colUsed;.  }
8480: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
8490: 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  }.IdList *sqlite
84a0: 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74  3IdListDup(sqlit
84b0: 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
84c0: 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e  p){.  IdList *pN
84d0: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
84e0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
84f0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
8500: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
8510: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
8520: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
8530: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8540: 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e   pNew->nId = p->
8550: 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  nId;.  pNew->a =
8560: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8570: 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73  Raw(db, p->nId*s
8580: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
8590: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
85a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
85b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77  3DbFree(db, pNew
85c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
85d0: 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74  .  }.  /* Note t
85e0: 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20  hat because the 
85f0: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f  size of the allo
8600: 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b  cation for p->a[
8610: 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65  ] is not.  ** ne
8620: 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65  cessarily a powe
8630: 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65  r of two, sqlite
8640: 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20  3IdListAppend() 
8650: 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  may not be calle
8660: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75  d.  ** on the du
8670: 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20  plicate created 
8680: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
8690: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
86a0: 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  i<p->nId; i++){.
86b0: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
86c0: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
86d0: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
86e0: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
86f0: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
8700: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
8710: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
8720: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
8730: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8740: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
8750: 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c  wItem->idx = pOl
8760: 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a  dItem->idx;.  }.
8770: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
8780: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
8790: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
87a0: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
87b0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
87c0: 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70  Select *pNew, *p
87d0: 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d 3d  Prior;.  if( p==
87e0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
87f0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
8800: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
8810: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
8820: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
8830: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45  rn 0;.  pNew->pE
8840: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
8850: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
8860: 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b  >pEList, flags);
8870: 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20  .  pNew->pSrc = 
8880: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
8890: 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66  p(db, p->pSrc, f
88a0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
88b0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
88c0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  xprDup(db, p->pW
88d0: 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  here, flags);.  
88e0: 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
88f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8900: 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  Dup(db, p->pGrou
8910: 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  pBy, flags);.  p
8920: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  New->pHaving = s
8930: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
8940: 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c  , p->pHaving, fl
8950: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ags);.  pNew->pO
8960: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
8970: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
8980: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61  p->pOrderBy, fla
8990: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  gs);.  pNew->op 
89a0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d  = p->op;.  pNew-
89b0: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
89c0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
89d0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  Dup(db, p->pPrio
89e0: 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  r, flags);.  if(
89f0: 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72   pPrior ) pPrior
8a00: 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
8a10: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
8a20: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  0;.  pNew->pLimi
8a30: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
8a40: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  up(db, p->pLimit
8a50: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8a60: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69  ->pOffset = sqli
8a70: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8a80: 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67 73  ->pOffset, flags
8a90: 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  );.  pNew->iLimi
8aa0: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  t = 0;.  pNew->i
8ab0: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e  Offset = 0;.  pN
8ac0: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70  ew->selFlags = p
8ad0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46  ->selFlags & ~SF
8ae0: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
8af0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
8b00: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
8b10: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
8b20: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
8b30: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
8b40: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [2] = -1;.  pNew
8b50: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
8b60: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
8b70: 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69  pNew->pWith = wi
8b80: 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69  thDup(db, p->pWi
8b90: 74 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  th);.  return pN
8ba0: 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  ew;.}.#else.Sele
8bb0: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
8bc0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
8bd0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
8be0: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
8bf0: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
8c00: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
8c10: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
8c20: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
8c30: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
8c40: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
8c50: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
8c60: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
8c70: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
8c80: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
8c90: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
8ca0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
8cb0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e  r occurs, the en
8cc0: 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65  tire list is fre
8cd0: 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69  ed and.** NULL i
8ce0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
8cf0: 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75  non-NULL is retu
8d00: 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  rned, then it is
8d10: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
8d20: 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hat the new entr
8d30: 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  y was successful
8d40: 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a  ly appended..*/.
8d50: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
8d60: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
8d70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8d80: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
8d90: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8da0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
8db0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
8dc0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
8dd0: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
8de0: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
8df0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
8e00: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
8e10: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  to be appended. 
8e20: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
8e30: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
8e40: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8e50: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
8e60: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
8e70: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
8e80: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  o(db, sizeof(Exp
8e90: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
8ea0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
8eb0: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
8ec0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
8ed0: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
8ee0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
8ef0: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
8f00: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
8f10: 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  ->a==0 ) goto no
8f20: 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _mem;.  }else if
8f30: 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ( (pList->nExpr 
8f40: 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  & (pList->nExpr-
8f50: 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  1))==0 ){.    st
8f60: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8f70: 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72  em *a;.    asser
8f80: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
8f90: 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  0 );.    a = sql
8fa0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
8fb0: 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73  , pList->a, pLis
8fc0: 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f  t->nExpr*2*sizeo
8fd0: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
8fe0: 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  .    if( a==0 ){
8ff0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
9000: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
9010: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
9020: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
9030: 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31  >a!=0 );.  if( 1
9040: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
9050: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
9060: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
9070: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b  pList->nExpr++];
9080: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65  .    memset(pIte
9090: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  m, 0, sizeof(*pI
90a0: 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d  tem));.    pItem
90b0: 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
90c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
90d0: 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20  ist;..no_mem:   
90e0: 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65    .  /* Avoid le
90f0: 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20  aking memory if 
9100: 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65  malloc has faile
9110: 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  d. */.  sqlite3E
9120: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
9130: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  xpr);.  sqlite3E
9140: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
9150: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
9160: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn 0;.}../*.** S
9170: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
9180: 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e  a[].zName elemen
9190: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
91a0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
91b0: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
91c0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
91d0: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
91e0: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
91f0: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
9200: 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64  But pName should
9210: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
9220: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
9230: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
9240: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
9250: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
9260: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
9270: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
9280: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20  prListSetName(. 
9290: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
92a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
92b0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
92c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
92d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
92e0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
92f0: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
9300: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
9310: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
9320: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20  to be added */. 
9330: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
9340: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9350: 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61   to cause the na
9360: 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65  me to be dequote
9370: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
9380: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50  ( pList!=0 || pP
9390: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
93a0: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
93b0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
93c0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
93d0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
93e0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
93f0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70  nExpr>0 );.    p
9400: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
9410: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
9420: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
9430: 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b  tem->zName==0 );
9440: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
9450: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
9460: 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  NDup(pParse->db,
9470: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
9480: 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65  ->n);.    if( de
9490: 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e  quote && pItem->
94a0: 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44  zName ) sqlite3D
94b0: 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e  equote(pItem->zN
94c0: 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ame);.  }.}../*.
94d0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c  ** Set the ExprL
94e0: 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c  ist.a[].zSpan el
94f0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73  ement of the mos
9500: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
9510: 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20   item.** on the 
9520: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
9530: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67  .**.** pList mig
9540: 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f  ht be NULL follo
9550: 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  wing an OOM erro
9560: 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68  r.  But pSpan sh
9570: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a  ould never be.**
9580: 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d   NULL.  If a mem
9590: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
95a0: 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65  ails, the pParse
95b0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
95c0: 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65  ed flag.** is se
95d0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
95e0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61  e3ExprListSetSpa
95f0: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
9600: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
9610: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
9620: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
9630: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
9640: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
9650: 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a   add the span. *
9660: 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53  /.  ExprSpan *pS
9670: 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54  pan         /* T
9680: 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64  he span to be ad
9690: 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ded */.){.  sqli
96a0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
96b0: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
96c0: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e  pList!=0 || db->
96d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
96e0: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
96f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
9700: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
9710: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
9720: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
9730: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
9740: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
9750: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
9760: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74  locFailed || pIt
9770: 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e  em->pExpr==pSpan
9780: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73  ->pExpr );.    s
9790: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
97a0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
97b0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
97c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
97d0: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
97e0: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20  Span->zStart,.  
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9810: 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a    (int)(pSpan->z
9820: 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74  End - pSpan->zSt
9830: 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  art));.  }.}../*
9840: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
9850: 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73  ssion list pELis
9860: 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  t contains more 
9870: 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d  than iLimit elem
9880: 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  ents,.** leave a
9890: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
98a0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
98b0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
98c0: 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20  stCheckLength(. 
98d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
98e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
98f0: 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  st,.  const char
9900: 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69   *zObject.){.  i
9910: 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e  nt mx = pParse->
9920: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
9930: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b  E_LIMIT_COLUMN];
9940: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
9950: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
9960: 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65  Expr==mx );.  te
9970: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
9980: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
9990: 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  =mx+1 );.  if( p
99a0: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
99b0: 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20  >nExpr>mx ){.   
99c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
99d0: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
99e0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73  ny columns in %s
99f0: 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d  ", zObject);.  }
9a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
9a10: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
9a20: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ssion list..*/.v
9a30: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
9a40: 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
9a50: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
9a60: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
9a70: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
9a80: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
9a90: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
9aa0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
9ab0: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
9ac0: 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  || pList->nExpr=
9ad0: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  =0 );.  for(pIte
9ae0: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
9af0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
9b00: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
9b10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
9b20: 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
9b30: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
9b40: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9b50: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
9b60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9b70: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
9b80: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9b90: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
9ba0: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
9bb0: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
9bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  ;.}../*.** These
9bd0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
9be0: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20  lker callbacks. 
9bf0: 20 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20   Walker.u.pi is 
9c00: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
9c10: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65  an integer.  The
9c20: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
9c30: 63 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70 72  checking an expr
9c40: 65 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a  ession to see.**
9c50: 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e 73   if it is a cons
9c60: 74 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b  tant.  Set *Walk
9c70: 65 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66 20  er.u.pi to 0 if 
9c80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9c90: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  s.** not constan
9ca0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  t..**.** These c
9cb0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73  allback routines
9cc0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70   are used to imp
9cd0: 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f  lement the follo
9ce0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
9cf0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9d00: 73 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73  stant().**     s
9d10: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
9d20: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a  tantNotJoin().**
9d30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9d40: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
9d50: 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61  tion().**.*/.sta
9d60: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
9d70: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
9d80: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
9d90: 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20   *pExpr){..  /* 
9da0: 49 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20  If pWalker->u.i 
9db0: 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65  is 3 then any te
9dc0: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
9dd0: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
9de0: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
9df0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9e00: 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71  s of a join disq
9e10: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
9e20: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
9e30: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
9e40: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
9e50: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
9e60: 2e 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73  .i==3 && ExprHas
9e70: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
9e80: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
9e90: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69      pWalker->u.i
9ea0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
9eb0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
9ec0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
9ed0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ->op ){.    /* C
9ee0: 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e  onsider function
9ef0: 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  s to be constant
9f00: 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72   if all their ar
9f10: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73  guments are cons
9f20: 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  tant.    ** and 
9f30: 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e  either pWalker->
9f40: 75 2e 69 3d 3d 32 20 6f 72 20 74 68 65 20 66 75  u.i==2 or the fu
9f50: 6e 63 74 69 6f 6e 20 61 73 20 74 68 65 20 53 51  nction as the SQ
9f60: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 0a  LITE_FUNC_CONST.
9f70: 20 20 20 20 2a 2a 20 66 6c 61 67 2e 20 2a 2f 0a      ** flag. */.
9f80: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
9f90: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  TION:.      if( 
9fa0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20  pWalker->u.i==2 
9fb0: 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
9fc0: 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73  ty(pExpr,EP_Cons
9fd0: 74 61 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 20  tant) ){.       
9fe0: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
9ff0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
a000: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
a010: 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
a020: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
a030: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
a040: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
a050: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
a060: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
a070: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
a080: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
a090: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a0a0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
a0b0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
a0c0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
a0d0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
a0e0: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
a0f0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
a100: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
a110: 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72  );.      pWalker
a120: 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20  ->u.i = 0;.     
a130: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
a140: 74 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  t;.    default:.
a150: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a160: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
a170: 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63  LECT ); /* selec
a180: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20  tNodeIsConstant 
a190: 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f  will disallow */
a1a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a1b0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
a1c0: 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65  XISTS ); /* sele
a1d0: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
a1e0: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
a1f0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  /.      return W
a200: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
a210: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  .}.static int se
a220: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
a230: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
a240: 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  er, Select *NotU
a250: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
a260: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
a270: 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  );.  pWalker->u.
a280: 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  i = 0;.  return 
a290: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61  WRC_Abort;.}.sta
a2a0: 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f  tic int exprIsCo
a2b0: 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  nst(Expr *p, int
a2c0: 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57 61   initFlag){.  Wa
a2d0: 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
a2e0: 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
a2f0: 29 29 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e  ));.  w.u.i = in
a300: 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70  itFlag;.  w.xExp
a310: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
a320: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
a330: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
a340: 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65  ack = selectNode
a350: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71  IsConstant;.  sq
a360: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
a370: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
a380: 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  .u.i;.}../*.** W
a390: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
a3a0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
a3b0: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
a3c0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
a3d0: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
a3e0: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
a3f0: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
a400: 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  lls..**.** For t
a410: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
a420: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
a430: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
a440: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
a450: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
a460: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
a470: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
a480: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
a490: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
a4a0: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
a4b0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
a4c0: 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  nt(Expr *p){.  r
a4d0: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
a4e0: 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t(p, 1);.}../*.*
a4f0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
a500: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
a510: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
a520: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
a530: 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20  nt.** that does 
a540: 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f  no originate fro
a550: 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
a560: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
a570: 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  oin..** Return 0
a580: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
a590: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
a5a0: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74  ction calls or t
a5b0: 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20  erms from.** an 
a5c0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
a5d0: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
a5e0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a5f0: 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29  NotJoin(Expr *p)
a600: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
a610: 73 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a  sConst(p, 3);.}.
a620: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
a630: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
a640: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
a650: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
a660: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
a670: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
a680: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
a690: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
a6a0: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
a6b0: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
a6c0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
a6d0: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
a6e0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
a6f0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
a700: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
a710: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
a720: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
a730: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
a740: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
a750: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
a760: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
a770: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
a780: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
a790: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
a7a0: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 29  xprIsConst(p, 2)
a7b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
a7c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  e expression p c
a7d0: 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  odes a constant 
a7e0: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
a7f0: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20  small enough.** 
a800: 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62  to fit in a 32-b
a810: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
a820: 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65  rn 1 and put the
a830: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
a840: 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61  teger.** in *pVa
a850: 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70  lue.  If the exp
a860: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
a870: 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
a880: 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a  it is too big.**
a890: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67   to fit in a sig
a8a0: 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
a8b0: 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64  er, return 0 and
a8c0: 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75   leave *pValue u
a8d0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
a8e0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
a8f0: 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69  teger(Expr *p, i
a900: 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69  nt *pValue){.  i
a910: 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nt rc = 0;..  /*
a920: 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   If an expressio
a930: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  n is an integer 
a940: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74  literal that fit
a950: 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  s in a signed 32
a960: 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65  -bit.  ** intege
a970: 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49  r, then the EP_I
a980: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c  ntValue flag wil
a990: 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
a9a0: 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73  een set */.  ass
a9b0: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49  ert( p->op!=TK_I
a9c0: 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c  NTEGER || (p->fl
a9d0: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
a9e0: 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  e)!=0.          
a9f0: 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e   || sqlite3GetIn
aa00: 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  t32(p->u.zToken,
aa10: 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69   &rc)==0 );..  i
aa20: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
aa30: 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
aa40: 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e   *pValue = p->u.
aa50: 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75  iValue;.    retu
aa60: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74  rn 1;.  }.  swit
aa70: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
aa80: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
aa90: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
aaa0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
aab0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c  r(p->pLeft, pVal
aac0: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
aad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
aae0: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
aaf0: 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20      int v;.     
ab00: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
ab10: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
ab20: 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20  ft, &v) ){.     
ab30: 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d     assert( v!=(-
ab40: 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b  2147483647-1) );
ab50: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
ab60: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
ab70: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
ab80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ab90: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62  }.    default: b
aba0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
abb0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
abc0: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
abd0: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
abe0: 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ce that the expr
abf0: 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55  ession can be NU
ac00: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  LL..**.** If the
ac10: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68   expression migh
ac20: 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20  t be NULL or if 
ac30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ac40: 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a  s too complex.**
ac50: 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20   to tell return 
ac60: 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  TRUE.  .**.** Th
ac70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
ac80: 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ed as an optimiz
ac90: 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f  ation, to skip O
aca0: 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73  P_IsNull opcodes
acb0: 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77  .** when we know
acc0: 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61   that a value ca
acd0: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48  nnot be NULL.  H
ace0: 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f  ence, a false po
acf0: 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72  sitive.** (retur
ad00: 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69  ning TRUE when i
ad10: 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65  n fact the expre
ad20: 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20  ssion can never 
ad30: 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a  be NULL) might.*
ad40: 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72  * be a small per
ad50: 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74  formance hit but
ad60: 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61   is otherwise ha
ad70: 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20  rmless.  On the 
ad80: 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61  other.** hand, a
ad90: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20   false negative 
ada0: 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45  (returning FALSE
adb0: 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
adc0: 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a   could be NULL).
add0: 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  ** will likely r
ade0: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
adf0: 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53  rrect answer.  S
ae00: 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  o when in doubt,
ae10: 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e   return.** TRUE.
ae20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
ae30: 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e  xprCanBeNull(con
ae40: 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75  st Expr *p){.  u
ae50: 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70  8 op;.  while( p
ae60: 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
ae70: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
ae80: 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65  US ){ p = p->pLe
ae90: 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ft; }.  op = p->
aea0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
aeb0: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
aec0: 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
aed0: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
aee0: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
aef0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
af00: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
af10: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
af20: 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74  _BLOB:.      ret
af30: 75 72 6e 20 30 3b 0a 20 20 20 20 64 65 66 61 75  urn 0;.    defau
af40: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
af50: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
af60: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
af70: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
af80: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61  sion is a consta
af90: 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  nt which would b
afa0: 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62  e.** unchanged b
afb0: 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69  y OP_Affinity wi
afc0: 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  th the affinity 
afd0: 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
afe0: 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ond.** argument.
aff0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b000: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
b010: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
b020: 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72  OP_Affinity oper
b030: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
b040: 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69  omitted.  When i
b050: 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46  n doubt return F
b060: 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e  ALSE.  A false n
b070: 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61  egative.** is ha
b080: 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65  rmless.  A false
b090: 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76   positive, howev
b0a0: 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69  er, can result i
b0b0: 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61  n the wrong.** a
b0c0: 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nswer..*/.int sq
b0d0: 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
b0e0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63  AffinityChange(c
b0f0: 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68  onst Expr *p, ch
b100: 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70  ar aff){.  u8 op
b110: 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c  ;.  if( aff==SQL
b120: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72  ITE_AFF_NONE ) r
b130: 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65  eturn 1;.  while
b140: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
b150: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
b160: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
b170: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
b180: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
b190: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
b1a0: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
b1b0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
b1c0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
b1d0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
b1e0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
b1f0: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
b200: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
b210: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
b220: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
b230: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
b240: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
b250: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
b260: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
b270: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
b280: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72  TRING: {.      r
b290: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
b2a0: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
b2b0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  }.    case TK_BL
b2c0: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  OB: {.      retu
b2d0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
b2e0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
b2f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b300: 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20  p->iTable>=0 ); 
b310: 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20   /* p cannot be 
b320: 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20  part of a CHECK 
b330: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
b340: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
b350: 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20  olumn<0.        
b360: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
b370: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
b380: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
b390: 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d  _NUMERIC);.    }
b3a0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
b3b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
b3c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
b3d0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
b3e0: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
b3f0: 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
b400: 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69  olumn name..*/.i
b410: 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
b420: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  d(const char *z)
b430: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  {.  if( sqlite3S
b440: 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49  trICmp(z, "_ROWI
b450: 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  D_")==0 ) return
b460: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
b470: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57  3StrICmp(z, "ROW
b480: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
b490: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
b4a0: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44  3StrICmp(z, "OID
b4b0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
b4c0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
b4d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
b4e0: 75 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  ue if we are abl
b4f0: 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72  e to the IN oper
b500: 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ator optimizatio
b510: 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20  n on a.** query 
b520: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
b530: 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  *       x IN (SE
b540: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
b550: 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54  Where the SELECT
b560: 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73  ... clause is as
b570: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
b580: 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  e parameter to t
b590: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a  his.** routine..
b5a0: 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74  **.** The Select
b5b0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 69   object passed i
b5c0: 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
b5d0: 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64 20  en preprocessed 
b5e0: 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73  and no.** errors
b5f0: 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64   have been found
b600: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
b610: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b620: 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 43  Y.static int isC
b630: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
b640: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53  (Select *p){.  S
b650: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
b660: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
b670: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
b680: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
b690: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
b6a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67            /* rig
b6b0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
b6c0: 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a  IN is SELECT */.
b6d0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
b6e0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b6f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
b700: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
b710: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65  T */.  if( p->se
b720: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
b730: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
b740: 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63  te) ){.    testc
b750: 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
b760: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
b770: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
b780: 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
b790: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
b7a0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
b7b0: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
b7c0: 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
b7d0: 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65  regate );.    re
b7e0: 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49  turn 0; /* No DI
b7f0: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61  STINCT keyword a
b800: 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  nd no aggregate 
b810: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d  functions */.  }
b820: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47  .  assert( p->pG
b830: 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20  roupBy==0 );    
b840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
b850: 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
b860: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
b870: 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
b880: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b890: 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20  /* Has no LIMIT 
b8a0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65  clause */.  asse
b8b0: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
b8c0: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
b8d0: 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d     /* No LIMIT m
b8e0: 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a  eans no OFFSET *
b8f0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  /.  if( p->pWher
b900: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
b910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
b920: 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
b930: 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d  e */.  pSrc = p-
b940: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
b950: 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66   pSrc!=0 );.  if
b960: 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
b970: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b980: 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74       /* Single t
b990: 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  erm in FROM clau
b9a0: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  se */.  if( pSrc
b9b0: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
b9c0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f   return 0;     /
b9d0: 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20  * FROM is not a 
b9e0: 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77  subquery or view
b9f0: 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72   */.  pTab = pSr
ba00: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
ba10: 69 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d  if( NEVER(pTab==
ba20: 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
ba30: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
ba40: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20  Select==0 );    
ba50: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
ba60: 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
ba70: 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73  view */.  if( Is
ba80: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
ba90: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
baa0: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
bab0: 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
bac0: 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ble */.  pEList 
bad0: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
bae0: 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  f( pEList->nExpr
baf0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
bb00: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c        /* One col
bb10: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
bb20: 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70  t set */.  if( p
bb30: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
bb40: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
bb50: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
bb60: 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75  Result is a colu
bb70: 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31  mn */.  return 1
bb80: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
bb90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
bba0: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  RY */../*.** Cod
bbb0: 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73  e an OP_Once ins
bbc0: 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c  truction and all
bbd0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
bbe0: 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e  its flag. Return
bbf0: 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73   the .** address
bc00: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
bc10: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ruction..*/.int 
bc20: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
bc30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
bc40: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
bc50: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
bc60: 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74  e);      /* Virt
bc70: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
bc80: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74  g coded */.  ret
bc90: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
bca0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp1(v, OP_Once
bcb0: 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b  , pParse->nOnce+
bcc0: 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  +);.}../*.** Thi
bcd0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
bce0: 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
bcf0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
bd00: 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f  IN (...) operato
bd10: 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72  r..** The pX par
bd20: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78  ameter is the ex
bd30: 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20  pression on the 
bd40: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
bd50: 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a  erator, which.**
bd60: 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
bd70: 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
bd80: 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71  ssions or a subq
bd90: 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
bda0: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
bdb0: 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  ine is to find o
bdc0: 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
bdd0: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61  e object that ca
bde0: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74  n.** be used eit
bdf0: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
be00: 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68  membership in th
be10: 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20  e RHS set or to 
be20: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
be30: 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  ** all members o
be40: 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73  f the RHS set, s
be50: 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74  kipping duplicat
be60: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73  es..**.** A curs
be70: 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  or is opened on 
be80: 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
be90: 74 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6f  t that the RHS o
bea0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
beb0: 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61  r.** and pX->iTa
bec0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ble is set to th
bed0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
bee0: 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
bef0: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
bf00: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
bf10: 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  n indicates the 
bf20: 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20  b-tree type, as 
bf30: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
bf40: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20   IN_INDEX_ROWID 
bf50: 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
bf60: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
bf70: 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
bf80: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
bf90: 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65  INDEX_ASC  - The
bfa0: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
bfb0: 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  ed on an ascendi
bfc0: 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49  ng index..**   I
bfd0: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
bfe0: 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  SC - The cursor 
bff0: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
c000: 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
c010: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
c020: 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65  EPH        - The
c030: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
c040: 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c  ed on a speciall
c050: 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  y created and.**
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74           populat
c080: 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ed epheremal tab
c090: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  le..**.** An exi
c0a0: 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67  sting b-tree mig
c0b0: 68 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68  ht be used if th
c0c0: 65 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e  e RHS expression
c0d0: 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a   pX is a simple.
c0e0: 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68  ** subquery such
c0f0: 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53   as:.**.**     S
c100: 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46  ELECT <column> F
c110: 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a  ROM <table>.**.*
c120: 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20  * If the RHS of 
c130: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
c140: 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d  is a list or a m
c150: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71  ore complex subq
c160: 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e  uery, then.** an
c170: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
c180: 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62   might need to b
c190: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
c1a0: 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65   the RHS and the
c1b0: 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20  n.** pX->iTable 
c1c0: 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  made to point to
c1d0: 20 74 68 65 20 65 70 68 65 72 6d 65 72 61 6c 20   the ephermeral 
c1e0: 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66  table instead of
c1f0: 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20   an.** existing 
c200: 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49  table.  .**.** I
c210: 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64  f the prNotFound
c220: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
c230: 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   then the b-tree
c240: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
c250: 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f   iterate.** thro
c260: 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62  ugh the set memb
c270: 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61 6e  ers, skipping an
c280: 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49 6e  y duplicates. In
c290: 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a 2a   this case an.**
c2a0: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
c2b0: 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e   must be used un
c2c0: 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65  less the selecte
c2d0: 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75  d <column> is gu
c2e0: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
c2f0: 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65  e unique - eithe
c300: 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
c310: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
c320: 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20  RY KEY or it.** 
c330: 68 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f 6e  has a UNIQUE con
c340: 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51 55  straint or UNIQU
c350: 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49  E index..**.** I
c360: 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64  f the prNotFound
c370: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
c380: 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d  t 0, then the b-
c390: 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
c3a0: 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73  d .** for fast s
c3b0: 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
c3c0: 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  sts. In this cas
c3d0: 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  e an epheremal t
c3e0: 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65  able must .** be
c3f0: 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f   used unless <co
c400: 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45  lumn> is an INTE
c410: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
c420: 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20  or an index can 
c430: 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77 69 74  .** be found wit
c440: 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74  h <column> as it
c450: 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  s left-most colu
c460: 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  mn..**.** When t
c470: 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69  he b-tree is bei
c480: 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62  ng used for memb
c490: 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68  ership tests, th
c4a0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
c4b0: 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 6b  on.** needs to k
c4c0: 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
c4d0: 6f 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ot the structure
c4e0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c   contains an SQL
c4f0: 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65 20   NULL .** value 
c500: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 72 72  in order to corr
c510: 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65 20 65  ectly evaluate e
c520: 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20  xpressions like 
c530: 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a  "X IN (Y, Z)"..*
c540: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
c550: 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  y chance that th
c560: 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f  e (...) might co
c570: 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c  ntain a NULL val
c580: 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65  ue at.** runtime
c590: 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65  , then a registe
c5a0: 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
c5b0: 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20  nd the register 
c5c0: 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a  number written.*
c5d0: 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  * to *prNotFound
c5e0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
c5f0: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
c600: 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20   (...) contains 
c610: 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c  a.** NULL value,
c620: 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e   then *prNotFoun
c630: 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  d is left unchan
c640: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ged..**.** If a 
c650: 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
c660: 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f  cated and its lo
c670: 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e  cation stored in
c680: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 68   *prNotFound, th
c690: 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69 61  en.** its initia
c6a0: 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e  l value is NULL.
c6b0: 20 20 49 66 20 74 68 65 20 28 2e 2e 2e 29 20 64    If the (...) d
c6c0: 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e 20 63  oes not remain c
c6d0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 74  onstant.** for t
c6e0: 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20 74  he duration of t
c6f0: 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20 74  he query (i.e. t
c700: 68 65 20 53 45 4c 45 43 54 20 77 69 74 68 69 6e  he SELECT within
c710: 20 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20 69 73   the (...).** is
c720: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
c730: 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 65  bquery) then the
c740: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c   value of the al
c750: 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74 65 72  located register
c760: 20 69 73 0a 2a 2a 20 72 65 73 65 74 20 74 6f 20   is.** reset to 
c770: 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d 65 20 74  NULL each time t
c780: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 72  he subquery is r
c790: 65 72 75 6e 2e 20 54 68 69 73 20 61 6c 6c 6f 77  erun. This allow
c7a0: 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  s the.** caller 
c7b0: 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64 65  to use vdbe code
c7c0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74   equivalent to t
c7d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
c7e0: 0a 2a 2a 20 20 20 69 66 28 20 72 65 67 69 73 74  .**   if( regist
c7f0: 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20  er==NULL ){.**  
c800: 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74     has_null = <t
c810: 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75  est if data stru
c820: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e  cture contains n
c830: 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67 69  ull>.**     regi
c840: 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a  ster = 1.**   }.
c850: 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  **.** in order t
c860: 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67 20  o avoid running 
c870: 74 68 65 20 3c 74 65 73 74 20 69 66 20 64 61 74  the <test if dat
c880: 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  a structure cont
c890: 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65  ains null>.** te
c8a0: 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  st more often th
c8b0: 61 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  an is necessary.
c8c0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
c8d0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
c8e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
c8f0: 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  InIndex(Parse *p
c900: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c  Parse, Expr *pX,
c910: 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64   int *prNotFound
c920: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20  ){.  Select *p; 
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
c950: 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68  LECT to the righ
c960: 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  t of IN operator
c970: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
c980: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c9a0: 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65  ype of RHS table
c9b0: 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a  . IN_INDEX_* */.
c9c0: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
c9d0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
c9e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
c9f0: 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62  r of the RHS tab
ca00: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
ca10: 42 65 55 6e 69 71 75 65 20 3d 20 28 70 72 4e 6f  BeUnique = (prNo
ca20: 74 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a  tFound==0);   /*
ca30: 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73   True if RHS mus
ca40: 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  t be unique */. 
ca50: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
ca60: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
ca70: 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  );     /* Virtua
ca80: 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
ca90: 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  coded */..  asse
caa0: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
cab0: 4e 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  N );..  /* Check
cac0: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78   to see if an ex
cad0: 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20  isting table or 
cae0: 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
caf0: 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66  d to.  ** satisf
cb00: 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68  y the query.  Th
cb10: 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65  is is preferable
cb20: 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61   to generating a
cb30: 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d   new .  ** ephem
cb40: 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  eral table..  */
cb50: 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61 73 50  .  p = (ExprHasP
cb60: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
cb70: 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e  IsSelect) ? pX->
cb80: 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a  x.pSelect : 0);.
cb90: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61    if( ALWAYS(pPa
cba0: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26  rse->nErr==0) &&
cbb0: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
cbc0: 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73  nOpt(p) ){.    s
cbd0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
cbe0: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
cbf0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
cc00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
cc10: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
cc40: 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  ble <table>. */.
cc50: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
cc80: 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e  pression <column
cc90: 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 43 6f  > */.    i16 iCo
cca0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccc0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
ccd0: 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20  mn <column> */. 
cce0: 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20     i16 iDb;     
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
cd10: 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54  abase idx for pT
cd20: 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ab */..    asser
cd30: 74 28 20 70 20 29 3b 20 20 20 20 20 20 20 20 20  t( p );         
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd50: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
cd60: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
cd70: 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
cd80: 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
cd90: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
cda0: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
cdb0: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
cdc0: 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
cdd0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  t( p->pEList->a[
cde0: 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f  0].pExpr!=0 ); /
cdf0: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
ce00: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
ce10: 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
ce20: 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b  t( p->pSrc!=0 );
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ce40: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
ce50: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
ce60: 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20  (p) */.    pTab 
ce70: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
ce80: 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20  pTab;.    pExpr 
ce90: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
cea0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f  ].pExpr;.    iCo
ceb0: 6c 20 3d 20 28 69 31 36 29 70 45 78 70 72 2d 3e  l = (i16)pExpr->
cec0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20  iColumn;.   .   
ced0: 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54   /* Code an OP_T
cee0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f  ransaction and O
cef0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
cf00: 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
cf10: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
cf20: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
cf30: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
cf40: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
cf50: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
cf60: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
cf70: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
cf80: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
cf90: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
cfa0: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
cfb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
cfc0: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
cfd0: 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e  m two places. In
cfe0: 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20   both cases the 
cff0: 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  vdbe.    ** has 
d000: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
d010: 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d  ocated. So assum
d020: 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  e sqlite3GetVdbe
d030: 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20  () is always.   
d040: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68   ** successful h
d050: 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
d060: 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69  assert(v);.    i
d070: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
d080: 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
d090: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
d0a0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 56 64  Parse);.      Vd
d0b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
d0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
d0d0: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
d0e0: 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
d0f0: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
d100: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
d110: 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20  NDEX_ROWID;..   
d120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d130: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
d140: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d150: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
d180: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
d190: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
d1a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
d1b0: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d   used by the com
d1c0: 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69  parison. If an i
d1d0: 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20  ndex is to.     
d1e0: 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70   ** be used in p
d1f0: 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74  lace of a temp-t
d200: 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65  able, it must be
d210: 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69   ordered accordi
d220: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  ng.      ** to t
d230: 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  his collation se
d240: 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20  quence.  */.    
d250: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20    CollSeq *pReq 
d260: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
d270: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
d280: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
d290: 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20   pExpr);..      
d2a0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
d2b0: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
d2c0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
d2d0: 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20  perform the .   
d2e0: 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
d2f0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
d300: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
d310: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20  the column. If. 
d320: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f       ** it is no
d330: 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  t, it is not pos
d340: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79  sible to use any
d350: 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f   index..      */
d360: 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e  .      int affin
d370: 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33  ity_ok = sqlite3
d380: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
d390: 70 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  pX, pTab->aCol[i
d3a0: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a  Col].affinity);.
d3b0: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
d3c0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
d3d0: 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26  dx && eType==0 &
d3e0: 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70  & affinity_ok; p
d3f0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
d400: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
d410: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
d420: 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20  ==iCol).        
d430: 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43   && sqlite3FindC
d440: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
d450: 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  b), pIdx->azColl
d460: 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20  [0], 0)==pReq.  
d470: 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74         && (!must
d480: 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64  BeUnique || (pId
d490: 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26  x->nKeyCol==1 &&
d4a0: 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
d4b0: 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20  OE_None)).      
d4c0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
d4d0: 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
d4e0: 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
d4f0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
d500: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
d510: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d520: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
d530: 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75   iTab, pIdx->tnu
d540: 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
d550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d560: 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
d570: 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
d580: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
d590: 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
d5a0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
d5b0: 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e     assert( IN_IN
d5c0: 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d  DEX_INDEX_DESC =
d5d0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
d5e0: 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20  _ASC+1 );.      
d5f0: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
d600: 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b  NDEX_INDEX_ASC +
d610: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
d620: 72 5b 30 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20  r[0];..         
d630: 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20   if( prNotFound 
d640: 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  && !pTab->aCol[i
d650: 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a  Col].notNull ){.
d660: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 4e              *prN
d670: 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72  otFound = ++pPar
d680: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
d690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d6a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
d6b0: 6c 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75  ll, 0, *prNotFou
d6c0: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nd);.          }
d6d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d6e0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d6f0: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
d700: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d710: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79  }.  }..  if( eTy
d720: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==0 ){.    /* 
d730: 43 6f 75 6c 64 20 6e 6f 74 20 66 6f 75 6e 64 20  Could not found 
d740: 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
d750: 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73  e or index to us
d760: 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74  e as the RHS b-t
d770: 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77  ree..    ** We w
d780: 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65  ill have to gene
d790: 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  rate an ephemera
d7a0: 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68  l table to do th
d7b0: 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20  e job..    */.  
d7c0: 20 20 75 33 32 20 73 61 76 65 64 4e 51 75 65 72    u32 savedNQuer
d7d0: 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
d7e0: 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20  nQueryLoop;.    
d7f0: 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  int rMayHaveNull
d800: 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20   = 0;.    eType 
d810: 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a  = IN_INDEX_EPH;.
d820: 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75      if( prNotFou
d830: 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e  nd ){.      *prN
d840: 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61  otFound = rMayHa
d850: 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  veNull = ++pPars
d860: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
d870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d880: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
d890: 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20  *prNotFound);.  
d8a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74    }else{.      t
d8b0: 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d  estcase( pParse-
d8c0: 3e 6e 51 75 65 72 79 4c 6f 6f 70 3e 30 20 29 3b  >nQueryLoop>0 );
d8d0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
d8e0: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20  QueryLoop = 0;. 
d8f0: 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65       if( pX->pLe
d900: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26  ft->iColumn<0 &&
d910: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
d920: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
d930: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ct) ){.        e
d940: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
d950: 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20  ROWID;.      }. 
d960: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d970: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
d980: 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61  arse, pX, rMayHa
d990: 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49  veNull, eType==I
d9a0: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a  N_INDEX_ROWID);.
d9b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
d9c0: 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51  ryLoop = savedNQ
d9d0: 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73  ueryLoop;.  }els
d9e0: 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c  e{.    pX->iTabl
d9f0: 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20  e = iTab;.  }.  
da00: 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a  return eType;.}.
da10: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
da20: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
da30: 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65  scalar subquerie
da40: 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62 71  s used as a subq
da50: 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c  uery expression,
da60: 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49   EXISTS,.** or I
da70: 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78  N operators.  Ex
da80: 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
da90: 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d    (SELECT a FROM
daa0: 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20   b)          -- 
dab0: 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
dac0: 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61  EXISTS (SELECT a
dad0: 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58   FROM b)   -- EX
dae0: 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a  ISTS subquery.**
daf0: 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31       x IN (4,5,1
db00: 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1)              
db10: 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
db20: 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68  ith list on righ
db30: 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20  t-hand side.**  
db40: 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
db50: 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d  a FROM b)     --
db60: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
db70: 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  h subquery on th
db80: 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68  e right.**.** Th
db90: 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
dba0: 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  r describes the 
dbb0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
dbc0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a  contains the IN.
dbd0: 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ** operator or s
dbe0: 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  ubquery..**.** I
dbf0: 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f  f parameter isRo
dc00: 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  wid is non-zero,
dc10: 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
dc20: 20 70 45 78 70 72 20 69 73 20 67 75 61 72 61 6e   pExpr is guaran
dc30: 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66  teed.** to be of
dc40: 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69   the form "<rowi
dc50: 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22  d> IN (?, ?, ?)"
dc60: 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20  , where <rowid> 
dc70: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a  is a reference.*
dc80: 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65  * to some intege
dc90: 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  r key column of 
dca0: 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20  a table B-Tree. 
dcb0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75 73  In this case, us
dcc0: 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42  e an.** intkey B
dcd0: 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74  -Tree to store t
dce0: 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e  he set of IN(...
dcf0: 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64  ) values instead
dd00: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
dd10: 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62   (slower) variab
dd20: 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42  le length keys B
dd30: 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -Tree..**.** If 
dd40: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20  rMayHaveNull is 
dd50: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d  non-zero, that m
dd60: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70  eans that the op
dd70: 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e  eration is an IN
dd80: 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43  .** (not a SELEC
dd90: 54 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64  T or EXISTS) and
dda0: 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6d 69   that the RHS mi
ddb0: 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  ght contains NUL
ddc0: 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f  Ls..** Furthermo
ddd0: 72 65 2c 20 74 68 65 20 49 4e 20 69 73 20 69 6e  re, the IN is in
dde0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
ddf0: 61 6e 64 20 74 68 61 74 20 77 65 20 72 65 61 6c  and that we real
de00: 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 69 74  ly want.** to it
de10: 65 72 61 74 65 20 6f 76 65 72 20 74 68 65 20 52  erate over the R
de20: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
de30: 72 61 74 6f 72 20 69 6e 20 6f 72 64 65 72 20 74  rator in order t
de40: 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63 61 74 65  o quickly locate
de50: 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65 73 70 6f  .** all correspo
de60: 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65 6d 65 6e  nding LHS elemen
de70: 74 73 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f  ts.  All this ro
de80: 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e  utine does is in
de90: 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20  itialize.** the 
dea0: 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20 62  register given b
deb0: 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 74  y rMayHaveNull t
dec0: 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67  o NULL.  Calling
ded0: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74   routines will t
dee0: 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f 66 20 63  ake.** care of c
def0: 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67  hanging this reg
df00: 69 73 74 65 72 20 76 61 6c 75 65 20 74 6f 20 6e  ister value to n
df10: 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52  on-NULL if the R
df20: 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e  HS is NULL-free.
df30: 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61  .**.** If rMayHa
df40: 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72 6f 2c 20  veNull is zero, 
df50: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
df60: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
df70: 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a 20 66 6f  being used.** fo
df80: 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
df90: 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 72  ting only.  Ther
dfa0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
dfb0: 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 0a 2a  initialize any.*
dfc0: 2a 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 69  * registers to i
dfd0: 6e 64 69 63 61 74 65 20 74 68 65 20 70 72 65 73  ndicate the pres
dfe0: 65 6e 63 65 20 6f 72 20 61 62 73 65 6e 63 65 20  ence or absence 
dff0: 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74 68 65 20  of NULLs on the 
e000: 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  RHS..**.** For a
e010: 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
e020: 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75  S operator, retu
e030: 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
e040: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a  that holds the.*
e050: 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49  * result.  For I
e060: 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69  N operators or i
e070: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
e080: 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  s, the return va
e090: 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66  lue is 0..*/.#if
e0a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e0b0: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
e0c0: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
e0d0: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
e0e0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
e0f0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
e100: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
e110: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
e120: 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c   The IN, SELECT,
e130: 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
e140: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d 61  tor */.  int rMa
e150: 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20 20  yHaveNull,      
e160: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61   /* Register tha
e170: 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  t records whethe
e180: 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e  r NULLs exist in
e190: 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73   RHS */.  int is
e1a0: 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
e1b0: 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48    /* If true, LH
e1c0: 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  S of IN operator
e1d0: 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29   is a rowid */.)
e1e0: 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72  {.  int testAddr
e1f0: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
e200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e210: 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
e220: 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52  ress */.  int rR
e230: 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74    /* Register st
e260: 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20  oring resulting 
e270: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
e280: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
e290: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56  arse);.  if( NEV
e2a0: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
e2b0: 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  n 0;.  sqlite3Ex
e2c0: 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
e2d0: 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  se);..  /* This 
e2e0: 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e  code must be run
e2f0: 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79   in its entirety
e300: 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69   every time it i
e310: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
e320: 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ** if any of the
e330: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
e340: 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
e350: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
e360: 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
e370: 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
e380: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
e390: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
e3a0: 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
e3b0: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
e3c0: 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
e3d0: 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
e3e0: 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
e3f0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
e400: 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
e410: 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
e420: 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
e430: 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
e440: 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
e450: 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
e460: 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
e470: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
e480: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
e490: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
e4a0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
e4b0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 74  Select) ){.    t
e4c0: 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  estAddr = sqlite
e4d0: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
e4e0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
e4f0: 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  v);.  }..#ifndef
e500: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
e510: 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73  LAIN.  if( pPars
e520: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
e530: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
e540: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e550: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
e560: 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20 25  ->db, "EXECUTE %
e570: 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22  s%s SUBQUERY %d"
e580: 2c 20 74 65 73 74 41 64 64 72 3e 3d 30 3f 22 22  , testAddr>=0?""
e590: 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a  :"CORRELATED ",.
e5a0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
e5b0: 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a  p==TK_IN?"LIST":
e5c0: 22 53 43 41 4c 41 52 22 2c 20 70 50 61 72 73 65  "SCALAR", pParse
e5d0: 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a  ->iNextSelectId.
e5e0: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
e5f0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
e600: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
e610: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
e620: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
e630: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64  NAMIC);.  }.#end
e640: 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  if..  switch( pE
e650: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
e660: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
e670: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
e680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
e690: 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68  * Affinity of th
e6a0: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
e6b0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
e6c0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
e6d0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e6e0: 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
e6f0: 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
e700: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
e710: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
e720: 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20  eft; /* the LHS 
e730: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
e740: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49  or */.      KeyI
e750: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
e760: 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69  0;      /* Key i
e770: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20  nformation */.. 
e780: 20 20 20 20 20 69 66 28 20 72 4d 61 79 48 61 76       if( rMayHav
e790: 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  eNull ){.       
e7a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e7b0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
e7c0: 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b  , rMayHaveNull);
e7d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e7e0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
e7f0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
e800: 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Left);..      /*
e810: 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73   Whether this is
e820: 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54   an 'x IN(SELECT
e830: 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49  ...)' or an 'x I
e840: 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20  N(<exprlist>)'. 
e850: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
e860: 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64  on it is handled
e870: 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20   the same way.  
e880: 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  An ephemeral tab
e890: 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  le is .      ** 
e8a0: 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67  filled with sing
e8b0: 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b  le-field index k
e8c0: 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67  eys representing
e8d0: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
e8e0: 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53     ** from the S
e8f0: 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
e900: 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
e910: 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
e920: 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
e930: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
e940: 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
e950: 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
e960: 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
e970: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
e980: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
e990: 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
e9a0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
e9b0: 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
e9c0: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
e9d0: 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
e9e0: 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
e9f0: 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
ea00: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
ea10: 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
ea20: 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
ea30: 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
ea40: 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
ea50: 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
ea60: 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
ea70: 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
ea80: 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
ea90: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
eaa0: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
eab0: 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a  affinity.      *
eac0: 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
ead0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
eae0: 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
eaf0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
eb00: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
eb10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
eb20: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45  penEphemeral, pE
eb30: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73  xpr->iTable, !is
eb40: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70 4b  Rowid);.      pK
eb50: 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64  eyInfo = isRowid
eb60: 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65   ? 0 : sqlite3Ke
eb70: 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
eb80: 65 2d 3e 64 62 2c 20 31 2c 20 31 29 3b 0a 0a 20  e->db, 1, 1);.. 
eb90: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
eba0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
ebb0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
ebc0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
ebd0: 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
ebe0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
ebf0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
ec00: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
ec10: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
ec20: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
ec30: 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
ec40: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
ec50: 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
ec60: 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
ec70: 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
ec80: 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73         SelectDes
ec90: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  t dest;.        
eca0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
ecb0: 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
ecc0: 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20  t( !isRowid );. 
ecd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
ece0: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
ecf0: 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78  st, SRT_Set, pEx
ed00: 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
ed10: 20 20 20 20 20 64 65 73 74 2e 61 66 66 53 64 73       dest.affSds
ed20: 74 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79  t = (u8)affinity
ed30: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ed40: 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ( (pExpr->iTable
ed50: 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45  &0x0000FFFF)==pE
ed60: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
ed70: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e         pExpr->x.
ed80: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
ed90: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 74 65 73  = 0;.        tes
eda0: 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d  tcase( pKeyInfo=
edb0: 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20  =0 ); /* Caused 
edc0: 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65  by OOM in sqlite
edd0: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20  3KeyInfoAlloc() 
ede0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
edf0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
ee00: 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  rse, pExpr->x.pS
ee10: 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b  elect, &dest) ){
ee20: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ee30: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
ee40: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
ee50: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ee60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ee70: 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
ee80: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
ee90: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
eea0: 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
eeb0: 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
eec0: 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
eed0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
eee0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
eef0: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
ef00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ef10: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
ef20: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ef30: 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
ef40: 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
ef50: 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
ef60: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
ef70: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [0] = sqlite3Bin
ef80: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
ef90: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
efa0: 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20  >pLeft,.        
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
eff0: 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
f000: 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
f010: 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20  pr->x.pList!=0) 
f020: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
f030: 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
f040: 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
f050: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
f060: 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
f070: 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
f080: 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
f090: 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
f0a0: 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
f0b0: 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
f0c0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
f0d0: 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
f0e0: 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
f0f0: 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
f100: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
f110: 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
f120: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
f130: 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
f140: 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
f150: 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
f160: 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
f170: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
f180: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
f190: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
f1a0: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
f1b0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
f1c0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
f1d0: 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72         int r1, r
f1e0: 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20  2, r3;..        
f1f0: 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
f200: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e  .          affin
f210: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
f220: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
f230: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
f240: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
f250: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f260: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
f270: 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
f280: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  ;.          pKey
f290: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d  Info->aColl[0] =
f2a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
f2b0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
f2c0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
f2d0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
f2e0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
f2f0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
f300: 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a   <exprlist>. */.
f310: 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
f320: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
f330: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
f340: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
f350: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
f360: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f370: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f380: 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20  Null, 0, r2);.  
f390: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73        for(i=pLis
f3a0: 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
f3b0: 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
f3c0: 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
f3d0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
f3e0: 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  2 = pItem->pExpr
f3f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
f400: 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20  iValToIns;..    
f410: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f420: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
f430: 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
f440: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
f450: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73            ** dis
f460: 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68  able the test th
f470: 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
f480: 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65   above that make
f490: 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20  s sure.         
f4a0: 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
f4b0: 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
f4c0: 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
f4d0: 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
f4e0: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
f4f0: 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
f500: 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
f510: 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
f520: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
f530: 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e     if( testAddr>
f540: 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
f550: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
f560: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
f570: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f580: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74  geToNoop(v, test
f590: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
f5a0: 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 2d 31     testAddr = -1
f5b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
f5c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
f5d0: 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
f5e0: 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
f5f0: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
f600: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
f610: 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26     if( isRowid &
f620: 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
f630: 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61  nteger(pE2, &iVa
f640: 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20  lToIns) ){.     
f650: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f660: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
f670: 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d  nsertInt, pExpr-
f680: 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61  >iTable, r2, iVa
f690: 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20  lToIns);.       
f6a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f6b0: 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
f6c0: 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
f6d0: 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31  (pParse, pE2, r1
f6e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
f6f0: 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20  f( isRowid ){.  
f700: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f710: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f720: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
f730: 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
f760: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
f770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  .              V
f780: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f7a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f7b0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45  v, OP_Insert, pE
f7c0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
f7d0: 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r3);.          
f7e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f7f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f800: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
f810: 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
f820: 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
f830: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
f840: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
f850: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
f860: 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29  e(pParse, r3, 1)
f870: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
f880: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f890: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
f8a0: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
f8b0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20  , r2);.         
f8c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
f8d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f8e0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
f8f0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
f900: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
f910: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
f920: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
f930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f940: 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
f950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f960: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
f970: 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79  dr, (void *)pKey
f980: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
f990: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f9a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
f9b0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
f9c0: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
f9d0: 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75  ELECT:.    defau
f9e0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  lt: {.      /* I
f9f0: 66 20 74 68 69 73 20 68 61 73 20 74 6f 20 62 65  f this has to be
fa00: 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54   a scalar SELECT
fa10: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
fa20: 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20   to put the.    
fa30: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68    ** value of th
fa40: 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d  is select in a m
fa50: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
fa60: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
fa70: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
fa80: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
fa90: 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69  iColumn.  If thi
faa0: 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20  s is an EXISTS, 
fab0: 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61  write.      ** a
fac0: 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74  n integer 0 (not
fad0: 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65   exists) or 1 (e
fae0: 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65  xists) into a me
faf0: 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20  mory cell.      
fb00: 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ** and record th
fb10: 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  at memory cell i
fb20: 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
fb30: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
fb40: 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20   *pSel;         
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb60: 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
fb70: 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
fb80: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
fb90: 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  t dest;         
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fbb0: 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68  How to deal with
fbc0: 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a   SELECt result *
fbd0: 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
fbe0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
fbf0: 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
fc00: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
fc10: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
fc20: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
fc30: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
fc40: 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e  XISTS || pExpr->
fc50: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
fc60: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
fc70: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
fc80: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
fc90: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53  ect) );.      pS
fca0: 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
fcb0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c  elect;.      sql
fcc0: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
fcd0: 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70  it(&dest, 0, ++p
fce0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  Parse->nMem);.  
fcf0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
fd00: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
fd10: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
fd20: 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
fd30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fd40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
fd50: 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  ll, 0, dest.iSDP
fd60: 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
fd70: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
fd80: 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73  nit subquery res
fd90: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65  ult"));.      }e
fda0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73  lse{.        des
fdb0: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78  t.eDest = SRT_Ex
fdc0: 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71  ists;.        sq
fdd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fde0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
fdf0: 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b  , dest.iSDParm);
fe00: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
fe10: 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45  ment((v, "Init E
fe20: 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b  XISTS result"));
fe30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
fe40: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
fe50: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
fe60: 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  l->pLimit);.    
fe70: 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
fe80: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
fe90: 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52  arse, TK_INTEGER
fea0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fec0: 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69 74            &sqlit
fed0: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b  e3IntTokens[1]);
fee0: 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69  .      pSel->iLi
fef0: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  mit = 0;.      i
ff00: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
ff10: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26  (pParse, pSel, &
ff20: 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
ff30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
ff40: 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20   }.      rReg = 
ff50: 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
ff60: 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
ff70: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
ff80: 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
ff90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ffa0: 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64   }..  if( testAd
ffb0: 64 72 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  dr>=0 ){.    sql
ffc0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ffd0: 28 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20  (v, testAddr);. 
ffe0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
fff0: 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
10000 20 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72   1);..  return r
10010 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Reg;.}.#endif /*
10020 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
10030 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  QUERY */..#ifnde
10040 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
10050 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
10060 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
10070 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n IN expression.
10080 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
10090 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
100a0 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75        x IN (valu
100b0 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a  e, value, ...).*
100c0 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61  *.** The left-ha
100d0 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73  nd side (LHS) is
100e0 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
100f0 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74  sion.  The right
10100 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29  -hand side (RHS)
10110 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20  .** is an array 
10120 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
10130 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70  values.  The exp
10140 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
10150 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a  if the LHS is.**
10160 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
10170 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
10180 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70  value of the exp
10190 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f  ression is unkno
101a0 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20  wn (NULL).** if 
101b0 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20  the LHS is NULL 
101c0 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  or if the LHS is
101d0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77   not contained w
101e0 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e  ithin the RHS an
101f0 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e  d the.** RHS con
10200 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
10210 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  e NULL values..*
10220 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10230 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
10240 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 64 65   will jump to de
10250 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65  stIfFalse if the
10260 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20   LHS is not .** 
10270 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
10280 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75   the RHS.  If du
10290 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61  e to NULLs we ca
102a0 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69  nnot determine i
102b0 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20  f the LHS.** is 
102c0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
102d0 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74   RHS then jump t
102e0 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
102f0 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
10300 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  tained.** within
10310 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61   the RHS then fa
10320 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73  ll through..*/.s
10330 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
10340 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
10350 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10360 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
10370 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
10380 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
10390 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
103a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
103b0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
103c0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
103d0 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
103e0 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
103f0 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
10400 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
10410 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
10420 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
10430 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
10440 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
10450 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
10460 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
10470 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
10480 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
10490 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
104a0 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
104b0 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
104c0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
104d0 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74 6f 20  son affinity to 
104e0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  use */.  int eTy
104f0 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
10500 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48  * Type of the RH
10510 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20  S */.  int r1;  
10520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10530 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
10540 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65  gister */.  Vdbe
10550 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
10560 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75    /* Statement u
10570 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10580 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  n */..  /* Compu
10590 74 65 20 74 68 65 20 52 48 53 2e 20 20 20 41 66  te the RHS.   Af
105a0 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 74  ter this step, t
105b0 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
105c0 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d  rsor.  ** pExpr-
105d0 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e  >iTable will con
105e0 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
105f0 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
10600 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20  e RHS..  */.  v 
10610 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10620 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
10630 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20  );       /* OOM 
10640 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74  detected prior t
10650 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  o this routine *
10660 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
10670 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49  ent((v, "begin I
10680 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79  N expr"));.  eTy
10690 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
106a0 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
106b0 70 45 78 70 72 2c 20 26 72 52 68 73 48 61 73 4e  pExpr, &rRhsHasN
106c0 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  ull);..  /* Figu
106d0 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e  re out the affin
106e0 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72  ity to use to cr
106f0 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20  eate a key from 
10700 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
10710 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
10720 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20  on. affinityStr 
10730 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20  stores a static 
10740 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
10750 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f  for.  ** P4 of O
10760 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20  P_MakeRecord..  
10770 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20 3d 20  */.  affinity = 
10780 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
10790 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a  ty(pExpr);..  /*
107a0 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74   Code the LHS, t
107b0 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
107c0 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
107d0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
107e0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
107f0 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20 73 71  arse);.  r1 = sq
10800 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
10810 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
10820 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10830 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10840 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   r1);..  /* If t
10850 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20  he LHS is NULL, 
10860 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
10870 69 73 20 65 69 74 68 65 72 20 66 61 6c 73 65 20  is either false 
10880 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e  or NULL dependin
10890 67 0a 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65  g.  ** on whethe
108a0 72 20 74 68 65 20 52 48 53 20 69 73 20 65 6d 70  r the RHS is emp
108b0 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65  ty or not, respe
108c0 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ctively..  */.  
108d0 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  if( destIfNull==
108e0 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
108f0 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66     /* Shortcut f
10900 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
10910 73 65 20 77 68 65 72 65 20 74 68 65 20 66 61 6c  se where the fal
10920 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63  se and NULL outc
10930 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  omes are.    ** 
10940 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20  the same. */.   
10950 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10960 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
10970 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29   r1, destIfNull)
10980 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
10990 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
109a0 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69  int addr1 = sqli
109b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
109c0 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29   OP_NotNull, r1)
109d0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
109e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
109f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
10a00 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  ewind, pExpr->iT
10a10 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
10a20 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  e);.    VdbeCove
10a30 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
10a40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10a50 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
10a60 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  stIfNull);.    s
10a70 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10a80 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
10a90 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  }..  if( eType==
10aa0 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29  IN_INDEX_ROWID )
10ab0 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
10ac0 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69   case, the RHS i
10ad0 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  s the ROWID of t
10ae0 61 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20  able b-tree.    
10af0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
10b00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
10b10 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64 65  ustBeInt, r1, de
10b20 73 74 49 66 46 61 6c 73 65 29 3b 20 56 64 62 65  stIfFalse); Vdbe
10b30 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10b40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10b50 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
10b60 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ts, pExpr->iTabl
10b70 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  e, destIfFalse, 
10b80 72 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  r1);.    VdbeCov
10b90 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73  erage(v);.  }els
10ba0 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  e{.    /* In thi
10bb0 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20  s case, the RHS 
10bc0 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  is an index b-tr
10bd0 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ee..    */.    s
10be0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10bf0 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
10c00 20 72 31 2c 20 31 2c 20 30 2c 20 26 61 66 66 69   r1, 1, 0, &affi
10c10 6e 69 74 79 2c 20 31 29 3b 0a 0a 20 20 20 20 2f  nity, 1);..    /
10c20 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d 65 6d  * If the set mem
10c30 62 65 72 73 68 69 70 20 74 65 73 74 20 66 61 69  bership test fai
10c40 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ls, then the res
10c50 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20 20  ult of the .    
10c60 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20  ** "x IN (...)" 
10c70 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20  expression must 
10c80 62 65 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e  be either 0 or N
10c90 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a  ULL. If the set.
10ca0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
10cb0 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  no NULL values, 
10cc0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
10cd0 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65 74  is 0. If the set
10ce0 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   .    ** contain
10cf0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
10d00 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
10d10 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
10d20 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73  e.    ** express
10d30 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c  ion is also NULL
10d40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10d50 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20   rRhsHasNull==0 
10d60 7c 7c 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d  || destIfFalse==
10d70 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  destIfNull ){.  
10d80 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
10d90 63 68 20 72 75 6e 73 20 69 66 20 69 74 20 69 73  ch runs if it is
10da0 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c   known at compil
10db0 65 20 74 69 6d 65 20 74 68 61 74 20 74 68 65 20  e time that the 
10dc0 52 48 53 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e  RHS.      ** can
10dd0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c  not contain NULL
10de0 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61   values. This ha
10df0 70 70 65 6e 73 20 61 73 20 74 68 65 20 72 65 73  ppens as the res
10e00 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ult.      ** of 
10e10 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  a "NOT NULL" con
10e20 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64  straint in the d
10e30 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
10e40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
10e50 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20  * Also run this 
10e60 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69  branch if NULL i
10e70 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
10e80 46 41 4c 53 45 0a 20 20 20 20 20 20 2a 2a 20 66  FALSE.      ** f
10e90 6f 72 20 74 68 69 73 20 70 61 72 74 69 63 75 6c  or this particul
10ea0 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  ar IN operator..
10eb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
10ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10ed0 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
10ee0 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
10ef0 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  e, destIfFalse, 
10f00 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64  r1, 1);.      Vd
10f10 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
10f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10f30 2f 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63  /* In this branc
10f40 68 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  h, the RHS of th
10f50 65 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61  e IN might conta
10f60 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20  in a NULL and.  
10f70 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65      ** the prese
10f80 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e  nce of a NULL on
10f90 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61   the RHS makes a
10fa0 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
10fb0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74 63  he.      ** outc
10fc0 6f 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ome..      */.  
10fd0 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a      int j1, j2;.
10fe0 0a 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  .      /* First 
10ff0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
11000 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
11010 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e  ined in the RHS.
11020 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a    If so,.      *
11030 2a 20 74 68 65 6e 20 74 68 65 20 70 72 65 73 65  * then the prese
11040 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20  nce of NULLs in 
11050 74 68 65 20 52 48 53 20 64 6f 65 73 20 6e 6f 74  the RHS does not
11060 20 6d 61 74 74 65 72 2c 20 73 6f 20 6a 75 6d 70   matter, so jump
11070 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 61  .      ** over a
11080 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74  ll of the code t
11090 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a 20 20 20  hat follows..   
110a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 31 20 3d     */.      j1 =
110b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
110c0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
110d0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
110e0 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  , 0, r1, 1);.   
110f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
11100 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 48 65  v);..      /* He
11110 72 65 20 77 65 20 62 65 67 69 6e 20 67 65 6e 65  re we begin gene
11120 72 61 74 69 6e 67 20 63 6f 64 65 20 74 68 61 74  rating code that
11130 20 72 75 6e 73 20 69 66 20 74 68 65 20 4c 48 53   runs if the LHS
11140 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   is not.      **
11150 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
11160 6e 20 74 68 65 20 52 48 53 2e 20 20 47 65 6e 65  n the RHS.  Gene
11170 72 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  rate additional 
11180 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 20 20  code that.      
11190 2a 2a 20 74 65 73 74 73 20 74 68 65 20 52 48 53  ** tests the RHS
111a0 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20 49 66 20   for NULLs.  If 
111b0 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  the RHS contains
111c0 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a 20 20 20   a NULL then.   
111d0 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65     ** jump to de
111e0 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
111f0 65 72 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 73  ere are no NULLs
11200 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
11210 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74  .      ** jump t
11220 6f 20 64 65 73 74 49 66 46 61 6c 73 65 2e 0a 20  o destIfFalse.. 
11230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
11240 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11250 76 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73 48 61  v, OP_If, rRhsHa
11260 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  sNull, destIfNul
11270 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
11280 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
11290 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
112a0 4f 50 5f 49 66 4e 6f 74 2c 20 72 52 68 73 48 61  OP_IfNot, rRhsHa
112b0 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c  sNull, destIfFal
112c0 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
112d0 65 28 76 29 3b 0a 20 20 20 20 20 20 6a 32 20 3d  e(v);.      j2 =
112e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
112f0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
11300 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
11310 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  , 0, rRhsHasNull
11320 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  , 1);.      Vdbe
11330 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
11340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11350 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
11360 65 72 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75  er, 0, rRhsHasNu
11370 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
11380 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11390 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
113a0 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
113b0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
113c0 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20  ere(v, j2);.    
113d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
113e0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
113f0 72 2c 20 31 2c 20 72 52 68 73 48 61 73 4e 75 6c  r, 1, rRhsHasNul
11400 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
11410 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11420 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
11430 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 2f  fNull);..      /
11440 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20 61  * The OP_Found a
11450 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69  t the top of thi
11460 73 20 62 72 61 6e 63 68 20 6a 75 6d 70 73 20 68  s branch jumps h
11470 65 72 65 20 77 68 65 6e 20 74 72 75 65 2c 20 0a  ere when true, .
11480 20 20 20 20 20 20 2a 2a 20 63 61 75 73 69 6e 67        ** causing
11490 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e 20   the overall IN 
114a0 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
114b0 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74 68  ation to fall th
114c0 72 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  rough..      */.
114d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
114e0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
114f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
11500 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11510 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
11520 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
11530 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
11540 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
11550 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
11560 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  r"));.}.#endif /
11570 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
11580 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
11590 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d   Duplicate an 8-
115a0 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74  byte value.*/.st
115b0 61 74 69 63 20 63 68 61 72 20 2a 64 75 70 38 62  atic char *dup8b
115c0 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f  ytes(Vdbe *v, co
115d0 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20  nst char *in){. 
115e0 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c   char *out = sql
115f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
11600 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
11610 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20  , 8);.  if( out 
11620 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75  ){.    memcpy(ou
11630 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20  t, in, 8);.  }. 
11640 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a   return out;.}..
11650 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11660 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
11670 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  NT./*.** Generat
11680 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
11690 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
116a0 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  he floating poin
116b0 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72  t.** value descr
116c0 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31  ibed by z[0..n-1
116d0 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
116e0 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iMem..**.** The 
116f0 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20  z[] string will 
11700 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20  probably not be 
11710 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
11720 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b    But the .** z[
11730 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20  n] character is 
11740 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
11750 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
11760 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a  does not look.**
11770 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e   like the contin
11780 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75  uation of the nu
11790 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
117a0 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64  void codeReal(Vd
117b0 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
117c0 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65  r *z, int negate
117d0 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
117e0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21  .  if( ALWAYS(z!
117f0 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  =0) ){.    doubl
11800 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61  e value;.    cha
11810 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74  r *zV;.    sqlit
11820 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65  e3AtoF(z, &value
11830 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
11840 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
11850 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  8);.    assert( 
11860 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61  !sqlite3IsNaN(va
11870 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e  lue) ); /* The n
11880 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65  ew AtoF never re
11890 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20  turns NaN */.   
118a0 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20   if( negateFlag 
118b0 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
118c0 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62  ;.    zV = dup8b
118d0 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26  ytes(v, (char*)&
118e0 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  value);.    sqli
118f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11900 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65   OP_Real, 0, iMe
11910 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41  m, 0, zV, P4_REA
11920 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  L);.  }.}.#endif
11930 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
11940 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
11950 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
11960 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72  he integer descr
11970 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a  ibe by.** text z
11980 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
11990 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
119a0 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  ** Expr.u.zToken
119b0 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20   is always UTF8 
119c0 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  and zero-termina
119d0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
119e0 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28  oid codeInteger(
119f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
11a00 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
11a10 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  negFlag, int iMe
11a20 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  m){.  Vdbe *v = 
11a30 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
11a40 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
11a50 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
11a60 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
11a70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a  Expr->u.iValue;.
11a80 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30      assert( i>=0
11a90 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46   );.    if( negF
11aa0 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20  lag ) i = -i;.  
11ab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11ac0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
11ad0 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d  r, i, iMem);.  }
11ae0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b  else{.    int c;
11af0 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a  .    i64 value;.
11b00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11b10 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  z = pExpr->u.zTo
11b20 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ken;.    assert(
11b30 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d   z!=0 );.    c =
11b40 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a   sqlite3Atoi64(z
11b50 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65  , &value, sqlite
11b60 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51  3Strlen30(z), SQ
11b70 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
11b80 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d  if( c==0 || (c==
11b90 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b  2 && negFlag) ){
11ba0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b  .      char *zV;
11bb0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
11bc0 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d  ag ){ value = c=
11bd0 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e  =2 ? SMALLEST_IN
11be0 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a  T64 : -value; }.
11bf0 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62        zV = dup8b
11c00 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26  ytes(v, (char*)&
11c10 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71  value);.      sq
11c20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
11c30 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20  v, OP_Int64, 0, 
11c40 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f  iMem, 0, zV, P4_
11c50 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73  INT64);.    }els
11c60 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
11c70 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
11c80 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74  OINT.      sqlit
11c90 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11ca0 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e  e, "oversized in
11cb0 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65  teger: %s%s", ne
11cc0 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22  gFlag ? "-" : ""
11cd0 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , z);.#else.    
11ce0 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c    codeReal(v, z,
11cf0 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b   negFlag, iMem);
11d00 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
11d10 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  }.}../*.** Clear
11d20 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a   a cache entry..
11d30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
11d40 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50  acheEntryClear(P
11d50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
11d60 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
11d70 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d  p){.  if( p->tem
11d80 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20  pReg ){.    if( 
11d90 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
11da0 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
11db0 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
11dc0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54        pParse->aT
11dd0 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
11de0 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e  TempReg++] = p->
11df0 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iReg;.    }.    
11e00 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
11e10 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65    }.}.../*.** Re
11e20 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  cord in the colu
11e30 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20  mn cache that a 
11e40 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d  particular colum
11e50 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74  n from a.** part
11e60 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20  icular table is 
11e70 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74  stored in a part
11e80 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e  icular register.
11e90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11ea0 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50  ExprCacheStore(P
11eb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
11ec0 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c  t iTab, int iCol
11ed0 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
11ee0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c  nt i;.  int minL
11ef0 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75  ru;.  int idxLru
11f00 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
11f10 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65  ache *p;..  asse
11f20 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f  rt( iReg>0 );  /
11f30 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65  * Register numbe
11f40 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f  rs are always po
11f50 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65  sitive */.  asse
11f60 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20  rt( iCol>=-1 && 
11f70 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f  iCol<32768 );  /
11f80 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20  * Finite column 
11f90 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a  numbers */..  /*
11fa0 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75   The SQLITE_Colu
11fb0 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73  mnCache flag dis
11fc0 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ables the column
11fd0 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73   cache.  This is
11fe0 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74   used.  ** for t
11ff0 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f  esting only - to
12000 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c   verify that SQL
12010 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20  ite always gets 
12020 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
12030 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69    ** with and wi
12040 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e  thout the column
12050 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69   cache..  */.  i
12060 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
12070 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  isabled(pParse->
12080 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d  db, SQLITE_Colum
12090 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e  nCache) ) return
120a0 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65  ;..  /* First re
120b0 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69  place any existi
120c0 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20  ng entry..  **. 
120d0 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
120e0 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e  e way the column
120f0 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e   cache is curren
12100 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65  tly used, we are
12110 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a   guaranteed.  **
12120 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74   that the object
12130 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65   will never alre
12140 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e  ady be in cache.
12150 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75    Verify this gu
12160 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69  arantee..  */.#i
12170 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66  fndef NDEBUG.  f
12180 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
12190 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
121a0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
121b0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
121c0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67   assert( p->iReg
121d0 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65  ==0 || p->iTable
121e0 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f  !=iTab || p->iCo
121f0 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20  lumn!=iCol );.  
12200 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46  }.#endif..  /* F
12210 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f  ind an empty slo
12220 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74  t and replace it
12230 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
12240 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
12250 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
12260 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
12270 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
12280 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Reg==0 ){.      
12290 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72  p->iLevel = pPar
122a0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
122b0 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65  .      p->iTable
122c0 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70   = iTab;.      p
122d0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
122e0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
122f0 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d  = iReg;.      p-
12300 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
12310 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
12320 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
12330 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
12340 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12350 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74  Replace the last
12360 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a   recently used *
12370 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37  /.  minLru = 0x7
12380 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72  fffffff;.  idxLr
12390 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  u = -1;.  for(i=
123a0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
123b0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
123c0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
123d0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
123e0 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b  p->lru<minLru ){
123f0 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20  .      idxLru = 
12400 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20  i;.      minLru 
12410 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a  = p->lru;.    }.
12420 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53    }.  if( ALWAYS
12430 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20  (idxLru>=0) ){. 
12440 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
12450 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75  aColCache[idxLru
12460 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c  ];.    p->iLevel
12470 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
12480 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69  eLevel;.    p->i
12490 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
124a0 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
124b0 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67  Col;.    p->iReg
124c0 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e   = iReg;.    p->
124d0 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
124e0 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
124f0 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
12500 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d     return;.  }.}
12510 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
12520 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73 20   that registers 
12530 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52  between iReg..iR
12540 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65  eg+nReg-1 are be
12550 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
12560 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72 61  .** Purge the ra
12570 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
12580 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e   from the column
12590 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20   cache..*/.void 
125a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
125b0 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  Remove(Parse *pP
125c0 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
125d0 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
125e0 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 20   i;.  int iLast 
125f0 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d 20  = iReg + nReg - 
12600 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  1;.  struct yCol
12610 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
12620 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
12630 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
12640 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
12650 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
12660 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t r = p->iReg;. 
12670 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20 26     if( r>=iReg &
12680 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20  & r<=iLast ){.  
12690 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
126a0 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
126b0 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
126c0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
126d0 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74  /*.** Remember t
126e0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d  he current colum
126f0 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e  n cache context.
12700 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65    Any new entrie
12710 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64  s added.** added
12720 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   to the column c
12730 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
12740 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64  call are removed
12750 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72   when the.** cor
12760 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f  responding pop o
12770 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
12780 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
12790 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ush(Parse *pPars
127a0 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43  e){.  pParse->iC
127b0 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66  acheLevel++;.#if
127c0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
127d0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
127e0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
127f0 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
12800 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
12810 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70  PUSH to %d\n", p
12820 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
12830 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  el);.  }.#endif.
12840 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
12850 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20  from the column 
12860 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65  cache any entrie
12870 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65  s that were adde
12880 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74  d since the.** t
12890 68 65 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75  he previous N Pu
128a0 73 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  sh operations.  
128b0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
128c0 72 65 73 74 6f 72 65 20 74 68 65 20 63 61 63 68  restore the cach
128d0 65 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74  e.** to the stat
128e0 65 20 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75  e it was in N Pu
128f0 73 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69  shes ago..*/.voi
12900 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
12910 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61  hePop(Parse *pPa
12920 72 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  rse, int N){.  i
12930 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
12940 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61  ColCache *p;.  a
12950 73 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20  ssert( N>0 );.  
12960 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
12970 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29  iCacheLevel>=N )
12980 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  ;.  pParse->iCac
12990 68 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 23 69  heLevel -= N;.#i
129a0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
129b0 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
129c0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
129d0 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
129e0 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
129f0 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20  "POP  to %d\n", 
12a00 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
12a10 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
12a20 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
12a30 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
12a40 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
12a50 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
12a60 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
12a70 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50   && p->iLevel>pP
12a80 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
12a90 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  l ){.      cache
12aa0 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
12ab0 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e, p);.      p->
12ac0 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  iReg = 0;.    }.
12ad0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
12ae0 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d  n a cached colum
12af0 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b  n is reused, mak
12b00 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20  e sure that its 
12b10 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e  register is.** n
12b20 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62  o longer availab
12b30 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67  le as a temp reg
12b40 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23  ister.  ticket #
12b50 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65  3879:  that same
12b60 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67  .** register mig
12b70 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ht be in the cac
12b80 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  he in multiple p
12b90 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72  laces, so be sur
12ba0 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d  e to.** get them
12bb0 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   all..*/.static 
12bc0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
12bd0 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
12be0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12bf0 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
12c00 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
12c10 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
12c20 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
12c30 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
12c40 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
12c50 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
12c60 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
12c70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d   ){.      p->tem
12c80 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
12c90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
12ca0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78  erate code to ex
12cb0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
12cc0 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  of the iCol-th c
12cd0 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
12ce0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12cf0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
12d00 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62  mnOfTable(.  Vdb
12d10 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20  e *v,        /* 
12d20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63  The VDBE under c
12d30 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
12d40 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
12d50 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f   /* The table co
12d60 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
12d70 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ue */.  int iTab
12d80 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74  Cur,    /* The t
12d90 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72  able cursor.  Or
12da0 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66   the PK cursor f
12db0 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
12dc0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
12dd0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
12de0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20  f the column to 
12df0 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74  extract */.  int
12e00 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
12e10 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
12e20 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69  e into this regi
12e30 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ster */.){.  if(
12e40 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d   iCol<0 || iCol=
12e50 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
12e60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12e70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
12e80 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f  d, iTabCur, regO
12e90 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
12ea0 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
12eb0 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
12ec0 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
12ed0 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  umn;.    int x =
12ee0 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21   iCol;.    if( !
12ef0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
12f00 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69  {.      x = sqli
12f10 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
12f20 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b  (sqlite3PrimaryK
12f30 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69  eyIndex(pTab), i
12f40 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
12f50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f60 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72  3(v, op, iTabCur
12f70 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  , x, regOut);.  
12f80 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
12f90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
12fa0 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
12fb0 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75  Tab, iCol, regOu
12fc0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
12fd0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12fe0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
12ff0 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
13000 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
13010 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74  able pTab and st
13020 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
13030 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74  alue in a regist
13040 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a  er.  An effort.*
13050 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f  * is made to sto
13060 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
13070 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
13080 69 52 65 67 2c 20 62 75 74 20 74 68 69 73 20 69  iReg, but this i
13090 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74  s.** not guarant
130a0 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69  eed.  The locati
130b0 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  on of the column
130c0 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
130d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ed..**.** There 
130e0 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
130f0 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69  cursor to pTab i
13100 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68  n iTable when th
13110 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
13120 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f   called.  If iCo
13130 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65  lumn<0 then code
13140 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68   is generated th
13150 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20  at extracts the 
13160 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rowid..*/.int sq
13170 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
13180 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
13190 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
131a0 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
131b0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
131c0 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
131d0 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
131e0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
131f0 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
13200 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
13210 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
13220 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
13230 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
13240 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
13250 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
13260 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
13270 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
13280 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg,        /* St
13290 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
132a0 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
132b0 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c         /* P5 val
132c0 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e  ue for OP_Column
132d0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
132e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
132f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
13300 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
13310 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  ;..  for(i=0, p=
13320 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
13330 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
13340 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
13350 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
13360 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c  eg>0 && p->iTabl
13370 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e  e==iTable && p->
13380 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  iColumn==iColumn
13390 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75   ){.      p->lru
133a0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
133b0 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  eCnt++;.      sq
133c0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
133d0 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65  nRegister(pParse
133e0 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20  , p->iReg);.    
133f0 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67    return p->iReg
13400 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20  ;.    }.  }  .  
13410 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
13420 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
13430 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
13440 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c  e(v, pTab, iTabl
13450 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
13460 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20  );.  if( p5 ){. 
13470 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
13480 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20  angeP5(v, p5);. 
13490 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73   }else{   .    s
134a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
134b0 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61  tore(pParse, iTa
134c0 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
134d0 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eg);.  }.  retur
134e0 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
134f0 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d   Clear all colum
13500 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e  n cache entries.
13510 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13520 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 50  ExprCacheClear(P
13530 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
13540 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
13550 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
13560 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
13570 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
13580 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
13590 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
135a0 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
135b0 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23  CLEAR\n");.  }.#
135c0 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c  endif.  for(i=0,
135d0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
135e0 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
135f0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
13600 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
13610 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63  >iReg ){.      c
13620 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
13630 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
13640 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20   p->iReg = 0;.  
13650 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
13660 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
13670 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74   that an affinit
13680 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63  y change has occ
13690 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a  urred on iCount.
136a0 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61  ** registers sta
136b0 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72  rting with iStar
136c0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
136d0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
136e0 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20  ityChange(Parse 
136f0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74  *pParse, int iSt
13700 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29  art, int iCount)
13710 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
13720 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
13730 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e  e, iStart, iCoun
13740 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t);.}../*.** Gen
13750 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  erate code to mo
13760 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ve content from 
13770 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
13780 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
13790 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
137a0 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20  To+nReg-1. Keep 
137b0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
137c0 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a   up-to-date..*/.
137d0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
137e0 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a  CodeMove(Parse *
137f0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
13800 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20  m, int iTo, int 
13810 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nReg){.  int i;.
13820 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
13830 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  he *p;.  assert(
13840 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67   iFrom>=iTo+nReg
13850 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d   || iFrom+nReg<=
13860 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  iTo );.  sqlite3
13870 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
13880 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76  e->pVdbe, OP_Mov
13890 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e  e, iFrom, iTo, n
138a0 52 65 67 2d 31 29 3b 0a 20 20 66 6f 72 28 69 3d  Reg-1);.  for(i=
138b0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
138c0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
138d0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
138e0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
138f0 78 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  x = p->iReg;.   
13900 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26   if( x>=iFrom &&
13910 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b   x<iFrom+nReg ){
13920 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 2b  .      p->iReg +
13930 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20  = iTo-iFrom;.   
13940 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65   }.  }.}..#if de
13950 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
13960 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
13970 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
13980 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
13990 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65  n true if any re
139a0 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61  gister in the ra
139b0 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28  nge iFrom..iTo (
139c0 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73  inclusive).** is
139d0 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
139e0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
139f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
13a00 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 77 69  utine is used wi
13a10 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e  thin assert() an
13a20 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  d testcase() mac
13a30 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20  ros only.** and 
13a40 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
13a50 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c  in a normal buil
13a60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
13a70 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
13a80 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
13a90 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
13aa0 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   iTo){.  int i;.
13ab0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
13ac0 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
13ad0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
13ae0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
13af0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
13b00 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   p++){.    int r
13b10 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
13b20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20  if( r>=iFrom && 
13b30 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20  r<=iTo ) return 
13b40 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a  1;    /*NO_TEST*
13b50 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  /.  }.  return 0
13b60 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
13b70 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51  LITE_DEBUG || SQ
13b80 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
13b90 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  ST */../*.** Con
13ba0 76 65 72 74 20 61 6e 20 65 78 70 72 65 73 73 69  vert an expressi
13bb0 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f  on node to a TK_
13bc0 52 45 47 49 53 54 45 52 0a 2a 2f 0a 73 74 61 74  REGISTER.*/.stat
13bd0 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65  ic void exprToRe
13be0 67 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20  gister(Expr *p, 
13bf0 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e  int iReg){.  p->
13c00 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  op2 = p->op;.  p
13c10 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
13c20 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20  ER;.  p->iTable 
13c30 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c  = iReg;.  ExprCl
13c40 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45  earProperty(p, E
13c50 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  P_Skip);.}../*.*
13c60 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13c70 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
13c80 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
13c90 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
13ca0 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65  xpression.  Atte
13cb0 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  mpt to store the
13cc0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
13cd0 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a  ster "target"..*
13ce0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
13cf0 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75  ister where resu
13d00 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  lts are stored..
13d10 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20  **.** With this 
13d20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69  routine, there i
13d30 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74  s no guarantee t
13d40 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c  hat results will
13d50 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e  .** be stored in
13d60 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
13d70 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74  sult might be st
13d80 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68  ored in some oth
13d90 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  er.** register i
13da0 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65  f it is convenie
13db0 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68  nt to do so.  Th
13dc0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
13dd0 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b  on.** must check
13de0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
13df0 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65   and move the re
13e00 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73  sults to the des
13e10 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72  ired.** register
13e20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13e30 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50  ExprCodeTarget(P
13e40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
13e50 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
13e60 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
13e70 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
13e80 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e  e;  /* The VM un
13e90 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
13ea0 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65  /* The opcode be
13ed0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
13ee0 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65  nt inReg = targe
13ef0 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  t;       /* Resu
13f00 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lts stored in re
13f10 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a  gister inReg */.
13f20 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
13f30 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
13f40 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
13f50 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
13f60 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
13f70 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20   regFree2 = 0;  
13f80 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
13f90 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
13fa0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
13fb0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  er */.  int r1, 
13fc0 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20  r2, r3, r4;     
13fd0 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67    /* Various reg
13fe0 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f  ister numbers */
13ff0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
14000 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20   pParse->db; /* 
14010 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
14020 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
14030 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20  r tempX;        
14040 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
14050 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  ary expression n
14060 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
14070 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61  ( target>0 && ta
14080 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d  rget<=pParse->nM
14090 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  em );.  if( v==0
140a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
140b0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
140c0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
140d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
140e0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
140f0 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c  .    op = TK_NUL
14100 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
14110 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
14120 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70    }.  switch( op
14130 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
14140 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
14150 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67      AggInfo *pAg
14160 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  gInfo = pExpr->p
14170 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  AggInfo;.      s
14180 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
14190 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49  l *pCol = &pAggI
141a0 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  nfo->aCol[pExpr-
141b0 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66  >iAgg];.      if
141c0 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  ( !pAggInfo->dir
141d0 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ectMode ){.     
141e0 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
141f0 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20  >iMem>0 );.     
14200 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d     inReg = pCol-
14210 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62  >iMem;.        b
14220 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
14230 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
14240 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
14250 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14260 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14270 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66  _Column, pAggInf
14280 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61  o->sortingIdxPTa
14290 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
142a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142b0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
142c0 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
142d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
142e0 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f      }.      /* O
142f0 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
14300 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
14310 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20  COLUMN case */. 
14320 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14330 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
14340 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70   int iTab = pExp
14350 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
14360 20 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20   if( iTab<0 ){. 
14370 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
14380 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20  e->ckBase>0 ){. 
14390 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
143a0 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e  rating CHECK con
143b0 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65  straints or inse
143c0 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69  rting into parti
143d0 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  al index */.    
143e0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
143f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70  xpr->iColumn + p
14400 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20  Parse->ckBase;. 
14410 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14420 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14430 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
14440 74 69 6e 67 20 66 72 6f 6d 20 61 20 70 61 72 74  ting from a part
14450 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ial index */.   
14460 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50         iTab = pP
14470 61 72 73 65 2d 3e 69 50 61 72 74 49 64 78 54 61  arse->iPartIdxTa
14480 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  b;.        }.   
14490 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
144a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
144b0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
144c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
144d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
14500 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20  iTab, target,.  
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
14530 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20  pr->op2);.      
14540 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14550 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
14560 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
14570 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45  teger(pParse, pE
14580 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  xpr, 0, target);
14590 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
145a0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
145b0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
145c0 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
145d0 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
145e0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
145f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
14600 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
14610 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  ;.      codeReal
14620 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (v, pExpr->u.zTo
14630 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ken, 0, target);
14640 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14650 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
14660 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
14670 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
14680 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14690 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
146a0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ue) );.      sql
146b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
146c0 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
146d0 20 74 61 72 67 65 74 2c 20 30 2c 20 70 45 78 70   target, 0, pExp
146e0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b  r->u.zToken, 0);
146f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14700 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14710 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
14720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14730 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
14740 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
14750 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
14760 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
14770 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
14780 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
14790 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
147a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
147b0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  ;.      char *zB
147c0 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lob;.      asser
147d0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
147e0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
147f0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
14800 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
14810 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27  u.zToken[0]=='x'
14820 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   || pExpr->u.zTo
14830 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  ken[0]=='X' );. 
14840 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
14850 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d  pr->u.zToken[1]=
14860 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
14870 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   = &pExpr->u.zTo
14880 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20  ken[2];.      n 
14890 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
148a0 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  0(z) - 1;.      
148b0 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c  assert( z[n]=='\
148c0 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f  '' );.      zBlo
148d0 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f  b = sqlite3HexTo
148e0 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65  Blob(sqlite3Vdbe
148f0 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Db(v), z, n);.  
14900 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14910 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
14920 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30  , n/2, target, 0
14930 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41  , zBlob, P4_DYNA
14940 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  MIC);.      brea
14950 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
14960 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
14970 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  ABLE: {.      as
14980 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
14990 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
149a0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
149b0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
149c0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29  r->u.zToken!=0 )
149d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
149e0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
149f0 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  0]!=0 );.      s
14a00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14a10 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c  (v, OP_Variable,
14a20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
14a30 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14a40 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  if( pExpr->u.zTo
14a50 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20  ken[1]!=0 ){.   
14a60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
14a70 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
14a80 3d 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20  ='?' .          
14a90 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78     || strcmp(pEx
14aa0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50  pr->u.zToken, pP
14ab0 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70  arse->azVar[pExp
14ac0 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d  r->iColumn-1])==
14ad0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
14ae0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
14af0 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e  (v, -1, pParse->
14b00 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f  azVar[pExpr->iCo
14b10 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54  lumn-1], P4_STAT
14b20 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
14b30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14b40 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
14b50 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  STER: {.      in
14b60 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Reg = pExpr->iTa
14b70 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ble;.      break
14b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14b90 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20   TK_AS: {.      
14ba0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
14bb0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
14bc0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14bd0 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
14be0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14bf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14c00 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73  MIT_CAST.    cas
14c10 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20  e TK_CAST: {.   
14c20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
14c30 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
14c40 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74   CAST(pLeft AS t
14c50 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69  oken) */.      i
14c60 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20  nt aff, to_op;. 
14c70 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
14c80 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
14c90 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
14ca0 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
14cb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14cc0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
14cd0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
14ce0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 66  lue) );.      af
14cf0 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  f = sqlite3Affin
14d00 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75  ityType(pExpr->u
14d10 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20  .zToken, 0);.   
14d20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d     to_op = aff -
14d30 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
14d40 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20   + OP_ToText;.  
14d50 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
14d60 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20  p==OP_ToText    
14d70 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
14d80 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20  FF_TEXT    );.  
14d90 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
14da0 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20  p==OP_ToBlob    
14db0 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
14dc0 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20  FF_NONE    );.  
14dd0 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
14de0 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20  p==OP_ToNumeric 
14df0 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
14e00 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
14e10 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
14e20 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20  p==OP_ToInt     
14e30 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
14e40 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  FF_INTEGER );.  
14e50 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
14e60 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20  p==OP_ToReal    
14e70 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
14e80 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20  FF_REAL    );.  
14e90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
14ea0 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29  _op==OP_ToText )
14eb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14ec0 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c  ( to_op==OP_ToBl
14ed0 6f 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ob );.      test
14ee0 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
14ef0 54 6f 4e 75 6d 65 72 69 63 20 29 3b 0a 20 20 20  ToNumeric );.   
14f00 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
14f10 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a  op==OP_ToInt );.
14f20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14f30 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c  to_op==OP_ToReal
14f40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e   );.      if( in
14f50 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20  Reg!=target ){. 
14f60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14f70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
14f80 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
14f90 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  get);.        in
14fa0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
14fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14fc0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14fd0 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a   to_op, inReg);.
14fe0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14ff0 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
15000 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
15010 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20   inReg) );.     
15020 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15030 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
15040 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31  pParse, inReg, 1
15050 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15060 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
15070 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
15080 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
15090 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
150a0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
150b0 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
150c0 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
150d0 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
150e0 45 51 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  EQ: {.      r1 =
150f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15100 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
15110 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
15120 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
15130 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15140 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
15150 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
15160 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
15170 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
15180 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
15190 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
151a0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
151b0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e        r1, r2, in
151c0 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52  Reg, SQLITE_STOR
151d0 45 50 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EP2);.      asse
151e0 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
151f0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
15200 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
15210 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
15220 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
15230 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
15240 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
15250 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
15260 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
15270 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
15280 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
15290 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
152a0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
152b0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
152c0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
152d0 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
152e0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
152f0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
15300 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
15310 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
15320 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
15330 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
15340 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
15350 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
15360 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
15370 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
15380 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
15390 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
153a0 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
153b0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
153c0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
153d0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
153e0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
153f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15400 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
15410 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
15420 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15430 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
15440 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15450 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
15460 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
15470 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15480 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15490 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
154a0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
154b0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
154c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
154d0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
154e0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
154f0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
15500 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f   TK_NE;.      co
15510 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
15520 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
15530 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
15540 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
15550 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
15560 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
15570 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  P2 | SQLITE_NULL
15580 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
15590 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
155a0 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56  =TK_EQ);.      V
155b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
155c0 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20   op==TK_NE);.   
155d0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
155e0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
155f0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
15600 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
15610 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15620 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
15630 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
15640 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
15650 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
15660 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
15670 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
15680 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
15690 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
156a0 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
156b0 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
156c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
156d0 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
156e0 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
156f0 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
15700 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
15710 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20  _AND==OP_And ); 
15720 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
15730 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ase( op==TK_AND 
15740 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15750 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
15760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
15770 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f  stcase( op==TK_O
15780 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
15790 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
157a0 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  dd );           
157b0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
157c0 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61  _PLUS );.      a
157d0 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
157e0 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20  =OP_Subtract ); 
157f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15800 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
15810 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
15820 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
15830 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
15840 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
15850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
15860 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
15870 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74  And );      test
15880 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
15890 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
158a0 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
158b0 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20  P_BitOr );      
158c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
158d0 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20  TK_BITOR );.    
158e0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
158f0 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
15900 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
15910 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b   op==TK_SLASH );
15920 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
15930 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
15940 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74  ftLeft );   test
15950 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48  case( op==TK_LSH
15960 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
15970 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
15980 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
15990 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
159a0 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
159b0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
159c0 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
159d0 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
159e0 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
159f0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
15a00 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
15a10 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
15a20 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
15a30 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
15a40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
15a50 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
15a60 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
15a70 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
15a80 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
15a90 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
15aa0 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
15ab0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
15ac0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
15ad0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
15ae0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
15af0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15b00 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
15b10 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
15b20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
15b30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
15b40 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
15b50 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
15b60 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
15b70 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
15b80 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74  rse, pLeft, 1, t
15b90 61 72 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20  arget);.#ifndef 
15ba0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
15bb0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
15bc0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74   }else if( pLeft
15bd0 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
15be0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
15bf0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
15c00 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
15c10 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
15c20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c    codeReal(v, pL
15c30 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31  eft->u.zToken, 1
15c40 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69  , target);.#endi
15c50 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
15c60 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20         tempX.op 
15c70 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20  = TK_INTEGER;.  
15c80 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67        tempX.flag
15c90 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c  s = EP_IntValue|
15ca0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20  EP_TokenOnly;.  
15cb0 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56        tempX.u.iV
15cc0 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  alue = 0;.      
15cd0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
15ce0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
15cf0 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46  e, &tempX, &regF
15d00 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ree1);.        r
15d10 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
15d20 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
15d30 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
15d40 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
15d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15d60 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
15d70 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
15d80 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  et);.        tes
15d90 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
15da0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
15db0 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
15dc0 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
15dd0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15de0 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
15df0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
15e00 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
15e10 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
15e20 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
15e30 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b  op==TK_BITNOT );
15e40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
15e50 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b  K_NOT==OP_Not );
15e60 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
15e70 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b  e( op==TK_NOT );
15e80 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
15e90 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15ea0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15eb0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
15ec0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15ed0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
15ee0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
15ef0 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c  arget;.      sql
15f00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15f10 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29  , op, r1, inReg)
15f20 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15f30 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
15f40 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
15f50 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
15f60 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
15f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
15f80 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
15f90 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ll );   testcase
15fa0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
15fb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15fc0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
15fd0 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63  NotNull ); testc
15fe0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
15ff0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
16000 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16010 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
16020 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
16030 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
16040 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
16050 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
16060 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
16070 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
16080 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
16090 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
160a0 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
160b0 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
160c0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
160d0 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
160e0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
160f0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
16100 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
16110 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16120 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67   OP_AddImm, targ
16130 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73  et, -1);.      s
16140 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
16150 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
16160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16170 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
16180 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
16190 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f    AggInfo *pInfo
161a0 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
161b0 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
161c0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
161d0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
161e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
161f0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
16200 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16210 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16220 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
16230 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70  regate: %s()", p
16240 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
16250 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16260 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49        inReg = pI
16270 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72  nfo->aFunc[pExpr
16280 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20  ->iAgg].iMem;.  
16290 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
162a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
162b0 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
162c0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
162d0 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a  *pFarg;       /*
162e0 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   List of functio
162f0 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
16300 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20       int nFarg; 
16310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16320 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f  umber of functio
16330 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
16340 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
16350 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ef;         /* T
16360 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  he function defi
16370 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  nition object */
16380 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20  .      int nId; 
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
163a0 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66   Length of the f
163b0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20  unction name in 
163c0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63  bytes */.      c
163d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
163e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
163f0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
16400 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73      u32 constMas
16410 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61  k = 0;     /* Ma
16420 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  sk of function a
16430 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72  rguments that ar
16440 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20  e constant */.  
16450 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
16460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
16470 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
16480 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
16490 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  (db);      /* Th
164a0 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
164b0 75 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74  used by this dat
164c0 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
164d0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
164e0 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61  0;    /* A colla
164f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
16500 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
16510 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
16520 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
16530 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
16540 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
16550 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
16560 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
16570 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20     pFarg = 0;.  
16580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16590 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72     pFarg = pExpr
165a0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
165b0 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d   }.      nFarg =
165c0 20 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e   pFarg ? pFarg->
165d0 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20  nExpr : 0;.     
165e0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
165f0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
16600 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
16610 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78  .      zId = pEx
16620 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
16630 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65      nId = sqlite
16640 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a  3Strlen30(zId);.
16650 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
16660 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
16670 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  (db, zId, nId, n
16680 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Farg, enc, 0);. 
16690 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
166a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
166b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
166c0 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e  se, "unknown fun
166d0 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20  ction: %.*s()", 
166e0 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
166f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16700 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65  }..      /* Atte
16710 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70  mpt a direct imp
16720 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
16730 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c  he built-in COAL
16740 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20  ESCE() and.     
16750 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e   ** IFNULL() fun
16760 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76  ctions.  This av
16770 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79  oids unnecessary
16780 20 65 76 61 6c 61 74 69 6f 6e 20 6f 66 0a 20 20   evalation of.  
16790 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73      ** arguments
167a0 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20   past the first 
167b0 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
167c0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
167d0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
167e0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
167f0 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a  UNC_COALESCE ){.
16800 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43          int endC
16810 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65  oalesce = sqlite
16820 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
16830 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
16840 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20  t( nFarg>=2 );. 
16850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
16860 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
16870 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
16880 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16890 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46     for(i=1; i<nF
168a0 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
168b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
168c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
168d0 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e  Null, target, en
168e0 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
168f0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
16900 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
16910 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
16920 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
16930 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20  target, 1);.    
16940 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16950 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
16960 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
16970 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
16980 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
16990 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
169a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
169b0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
169c0 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
169d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
169e0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
169f0 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c  Label(v, endCoal
16a00 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62  esce);.        b
16a10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
16a20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49       /* The UNLI
16a30 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20  KELY() function 
16a40 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65  is a no-op.  The
16a50 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76   result is the v
16a60 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  alue.      ** of
16a70 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
16a80 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
16a90 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
16aa0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
16ab0 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29  _FUNC_UNLIKELY )
16ac0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
16ad0 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20  ( nFarg>=1 );.  
16ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16af0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
16b00 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
16b10 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
16b20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
16b30 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
16b40 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
16b50 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32          if( i<32
16b60 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
16b70 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d  sConstant(pFarg-
16b80 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
16b90 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
16ba0 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20  se( i==31 );.   
16bb0 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
16bc0 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29   |= MASKBIT32(i)
16bd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16be0 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
16bf0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
16c00 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29  E_FUNC_NEEDCOLL)
16c10 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  !=0 && !pColl ){
16c20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
16c30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16c40 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46  llSeq(pParse, pF
16c50 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
16c60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16c70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
16c80 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arg ){.        i
16c90 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a  f( constMask ){.
16ca0 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70            r1 = p
16cb0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
16cc0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
16cd0 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a  >nMem += nFarg;.
16ce0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16cf0 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71           r1 = sq
16d00 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
16d10 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29  e(pParse, nFarg)
16d20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
16d30 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67       /* For leng
16d40 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28  th() and typeof(
16d50 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68  ) functions with
16d60 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65   a column argume
16d70 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  nt,.        ** s
16d80 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65  et the P5 parame
16d90 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f  ter to the OP_Co
16da0 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f  lumn opcode to O
16db0 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a  PFLAG_LENGTHARG.
16dc0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50          ** or OP
16dd0 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72  FLAG_TYPEOFARG r
16de0 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20  espectively, to 
16df0 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72  avoid unnecessar
16e00 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a  y data.        *
16e10 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20  * loading..     
16e20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
16e30 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
16e40 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e  gs & (SQLITE_FUN
16e50 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f  C_LENGTH|SQLITE_
16e60 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30  FUNC_TYPEOF))!=0
16e70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
16e80 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20   exprOp;.       
16e90 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
16ea0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
16eb0 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e   assert( pFarg->
16ec0 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
16ed0 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f  .          exprO
16ee0 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  p = pFarg->a[0].
16ef0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20  pExpr->op;.     
16f00 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d       if( exprOp=
16f10 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78  =TK_COLUMN || ex
16f20 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  prOp==TK_AGG_COL
16f30 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
16f40 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
16f50 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f  E_FUNC_LENGTH==O
16f60 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
16f70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
16f80 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
16f90 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41  NC_TYPEOF==OPFLA
16fa0 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20  G_TYPEOFARG );. 
16fb0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
16fc0 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46  ase( pDef->funcF
16fd0 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45  lags & OPFLAG_LE
16fe0 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
16ff0 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b         pFarg->a[
17000 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20  0].pExpr->op2 = 
17010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17020 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61     pDef->funcFla
17030 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e  gs & (OPFLAG_LEN
17040 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59  GTHARG|OPFLAG_TY
17050 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
17060 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
17070 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17080 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
17090 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69  arse);     /* Ti
170a0 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
170b0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  e */.        sql
170c0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
170d0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61  List(pParse, pFa
170e0 72 67 2c 20 72 31 2c 20 0a 20 20 20 20 20 20 20  rg, r1, .       
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17100 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
17110 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f  ECEL_DUP|SQLITE_
17120 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20  ECEL_FACTOR);.  
17130 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17140 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
17150 2c 20 31 29 3b 20 20 20 2f 2a 20 54 69 63 6b 65  , 1);   /* Ticke
17160 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a  t 2ea2425d34be *
17170 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
17180 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20         r1 = 0;. 
17190 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
171a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
171b0 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a  ALTABLE.      /*
171c0 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f   Possibly overlo
171d0 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ad the function 
171e0 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  if the first arg
171f0 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a  ument is.      *
17200 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * a virtual tabl
17210 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20  e column..      
17220 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
17230 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
17240 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47  (LIKE, GLOB, REG
17250 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20  EXP, and MATCH) 
17260 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  use the.      **
17270 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
17280 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c  , not the first,
17290 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
172a0 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20   to test to.    
172b0 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
172c0 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  s a column in a 
172d0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
172e0 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63  This is done bec
172f0 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  ause.      ** th
17300 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f  e left operand o
17310 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  f infix function
17320 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77  s (the operand w
17330 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20  e want to.      
17340 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c  ** control overl
17350 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20  oading) ends up 
17360 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
17370 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  gument to the.  
17380 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
17390 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
173a0 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65   "A glob B" is e
173b0 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
173c0 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41      ** "glob(B,A
173d0 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75  ).  We want to u
173e0 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67  se the A in "A g
173f0 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20  lob B" to test. 
17400 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63       ** for func
17410 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67  tion overloading
17420 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68  .  But we use th
17430 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f  e B term in "glo
17440 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a  b(B,A)"..      *
17450 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  /.      if( nFar
17460 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e  g>=2 && (pExpr->
17470 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78  flags & EP_Infix
17480 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
17490 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
174a0 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
174b0 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46  ion(db, pDef, nF
174c0 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d  arg, pFarg->a[1]
174d0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
174e0 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30  else if( nFarg>0
174f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
17500 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
17510 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
17520 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
17530 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
17540 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  r);.      }.#end
17550 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  if.      if( pDe
17560 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
17570 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
17580 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  OLL ){.        i
17590 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
175a0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
175b0 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l; .        sqli
175c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
175d0 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
175e0 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
175f0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
17600 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17610 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17620 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
17630 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c  , constMask, r1,
17640 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17660 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34   (char*)pDef, P4
17670 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
17680 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
17690 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72  geP5(v, (u8)nFar
176a0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46  g);.      if( nF
176b0 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b  arg && constMask
176c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
176d0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
176e0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
176f0 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  1, nFarg);.     
17700 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
17710 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
17720 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
17730 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
17740 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
17750 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
17760 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17770 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
17780 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17790 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
177a0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
177b0 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
177c0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
177d0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
177e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
177f0 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
17800 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
17810 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
17820 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
17830 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
17840 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
17850 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
17860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17870 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
17880 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
17890 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
178a0 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
178b0 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
178c0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
178d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
178e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
178f0 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
17900 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17910 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
17920 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
17930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17940 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
17950 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30  ddImm, target, 0
17960 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17970 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
17980 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
17990 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
179a0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
179b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
179c0 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20  RY */...    /*. 
179d0 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45     **    x BETWE
179e0 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a  EN y AND z.    *
179f0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  *.    ** This is
17a00 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
17a10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
17a20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20  x>=y AND x<=z.  
17a30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73    **.    ** X is
17a40 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
17a50 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
17a60 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Y is stored in p
17a70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
17a80 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20  ].pExpr..    ** 
17a90 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Z is stored in p
17aa0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
17ab0 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a  ].pExpr..    */.
17ac0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
17ad0 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
17ae0 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
17af0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73  ->pLeft;.      s
17b00 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
17b10 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45  tem *pLItem = pE
17b20 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b  xpr->x.pList->a;
17b30 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
17b40 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
17b50 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d  xpr;..      r1 =
17b60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17b70 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65  Temp(pParse, pLe
17b80 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
17b90 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
17ba0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
17bb0 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26  Parse, pRight, &
17bc0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
17bd0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
17be0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
17bf0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
17c00 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  e2==0 );.      r
17c10 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  3 = sqlite3GetTe
17c20 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
17c30 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65       r4 = sqlite
17c40 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
17c50 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  se);.      codeC
17c60 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
17c70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
17c80 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _Ge,.           
17c90 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72         r1, r2, r
17ca0 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  3, SQLITE_STOREP
17cb0 32 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67  2);  VdbeCoverag
17cc0 65 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 49 74  e(v);.      pLIt
17cd0 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67  em++;.      pRig
17ce0 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
17cf0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
17d00 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17d10 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
17d20 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
17d30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
17d40 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  p(pParse, pRight
17d50 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
17d60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
17d70 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
17d80 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
17d90 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
17da0 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c  ight, OP_Le, r1,
17db0 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f   r2, r4, SQLITE_
17dc0 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
17dd0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17df0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
17e00 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72 67  nd, r3, r4, targ
17e10 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
17e20 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
17e30 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20  (pParse, r3);.  
17e40 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17e50 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17e60 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72 65  , r4);.      bre
17e70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
17e80 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a  se TK_COLLATE: .
17e90 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
17ea0 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  S: {.      inReg
17eb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17ec0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
17ed0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
17ee0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
17ef0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
17f00 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a  case TK_TRIGGER:
17f10 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
17f20 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f  he opcode is TK_
17f30 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68  TRIGGER, then th
17f40 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
17f50 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  a reference.    
17f60 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e    ** to a column
17f70 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72   in the new.* or
17f80 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
17f90 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74  bles available t
17fa0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67  o.      ** trigg
17fb0 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20  er programs. In 
17fc0 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69  this case Expr.i
17fd0 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
17fe0 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20  1 for the.      
17ff0 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  ** new.* pseudo-
18000 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20  table, or 0 for 
18010 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
18020 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f  -table. Expr.iCo
18030 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  lumn.      ** is
18040 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   set to the colu
18050 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f  mn of the pseudo
18060 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20  -table to read, 
18070 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20  or to -1 to.    
18080 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f    ** read the ro
18090 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20  wid field..     
180a0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
180b0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69   expression is i
180c0 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
180d0 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63   an OP_Param opc
180e0 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20  ode. The p1.    
180f0 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69    ** parameter i
18100 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61  s set to 0 for a
18110 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65  n old.rowid refe
18120 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b  rence, or to (i+
18130 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  1).      ** to r
18140 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72  eference another
18150 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f   column of the o
18160 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
18170 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20  e, where .      
18180 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65  ** i is the inde
18190 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  x of the column.
181a0 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64   For a new.rowid
181b0 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69   reference, p1 i
181c0 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74  s.      ** set t
181d0 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e  o (n+1), where n
181e0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
181f0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63  f columns in eac
18200 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  h pseudo-table..
18210 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72        ** For a r
18220 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
18230 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20  other column in 
18240 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f  the new.* pseudo
18250 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20  -table, p1.     
18260 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e   ** is set to (n
18270 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61  +2+i), where n a
18280 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69  nd i are as defi
18290 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20  ned previously. 
182a0 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61  For.      ** exa
182b0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62  mple, if the tab
182c0 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67  le on which trig
182d0 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66  gers are being f
182e0 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a  ired is.      **
182f0 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20   declared as:.  
18300 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
18310 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
18320 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a  1(a, b);.      *
18330 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  *.      ** Then 
18340 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  p1 is interprete
18350 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
18360 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
18370 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20    p1==0   ->    
18380 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31  old.rowid     p1
18390 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==3   ->    new.
183a0 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20  rowid.      **  
183b0 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f   p1==1   ->    o
183c0 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d  ld.a         p1=
183d0 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61  =4   ->    new.a
183e0 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
183f0 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20  2   ->    old.b 
18400 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20          p1==5   
18410 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20  ->    new.b     
18420 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
18430 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
18440 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
18450 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70     int p1 = pExp
18460 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61  r->iTable * (pTa
18470 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b  b->nCol+1) + 1 +
18480 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
18490 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
184a0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
184b0 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
184c0 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73  e==1 );.      as
184d0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
184e0 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70  lumn>=-1 && pExp
184f0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d  r->iColumn<pTab-
18500 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61  >nCol );.      a
18510 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b  ssert( pTab->iPK
18520 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  ey<0 || pExpr->i
18530 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50  Column!=pTab->iP
18540 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Key );.      ass
18550 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31  ert( p1>=0 && p1
18560 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32  <(pTab->nCol*2+2
18570 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ) );..      sqli
18580 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18590 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74   OP_Param, p1, t
185a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64  arget);.      Vd
185b0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
185c0 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20  s.%s -> $%d",.  
185d0 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54        (pExpr->iT
185e0 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22  able ? "new" : "
185f0 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28  old"),.        (
18600 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
18610 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78   ? "rowid" : pEx
18620 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  pr->pTab->aCol[p
18630 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a  Expr->iColumn].z
18640 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74  Name),.        t
18650 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a  arget.      ));.
18660 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18670 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
18680 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  INT.      /* If 
18690 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52  the column has R
186a0 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74  EAL affinity, it
186b0 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62   may currently b
186c0 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20  e stored as an. 
186d0 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e       ** integer.
186e0 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69   Use OP_RealAffi
186f0 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72  nity to make sur
18700 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  e it is really r
18710 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  eal.  */.      i
18720 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
18730 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  n>=0 .       && 
18740 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  pTab->aCol[pExpr
18750 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  ->iColumn].affin
18760 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
18770 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20  REAL.      ){.  
18780 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18790 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
187a0 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67  alAffinity, targ
187b0 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  et);.      }.#en
187c0 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
187d0 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
187e0 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20      ** Form A:. 
187f0 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57     **   CASE x W
18800 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
18810 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
18820 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
18830 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
18840 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
18850 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   B:.    **   CAS
18860 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  E WHEN e1 THEN r
18870 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
18880 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
18890 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
188a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
188b0 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20  orm A is can be 
188c0 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
188d0 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
188e0 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77  form B as follow
188f0 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  s:.    **   CASE
18900 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20   WHEN x=e1 THEN 
18910 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45  r1 WHEN x=e2 THE
18920 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20  N r2 ....    ** 
18930 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e         WHEN x=eN
18940 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
18950 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
18960 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74  * X (if it exist
18970 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  s) is in pExpr->
18980 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
18990 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65  is in the last e
189a0 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d  lement of pExpr-
189b0 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70  >x.pList if pExp
189c0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
189d0 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e  r is.    ** odd.
189e0 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20    The Y is also 
189f0 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68  optional.  If th
18a00 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
18a10 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a  ents in x.pList.
18a20 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20      ** is even, 
18a30 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65  then Y is omitte
18a40 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72  d and the "other
18a50 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73 20  wise" result is 
18a60 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20  NULL..    ** Ei 
18a70 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  is in pExpr->pLi
18a80 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52  st->a[i*2] and R
18a90 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73  i is pExpr->pLis
18aa0 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20  t->a[i*2+1]..   
18ab0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
18ac0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70  esult of the exp
18ad0 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52  ression is the R
18ae0 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  i for the first 
18af0 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20  matching Ei,.   
18b00 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20   ** or if there 
18b10 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45  is no matching E
18b20 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d  i, the ELSE term
18b30 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20   Y, or if there 
18b40 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53  is.    ** no ELS
18b50 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20  E term, NULL..  
18b60 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
18b70 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b  : assert( op==TK
18b80 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20  _CASE ); {.     
18b90 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20   int endLabel;  
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
18bc0 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45   for end of CASE
18bd0 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69   stmt */.      i
18be0 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20  nt nextCase;    
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c00 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
18c10 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61  or next WHEN cla
18c20 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
18c30 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20   nExpr;         
18c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18c50 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57  * 2x number of W
18c60 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
18c70 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c90 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
18ca0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  nter */.      Ex
18cb0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cd0 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20  /* List of WHEN 
18ce0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73  terms */.      s
18cf0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
18d00 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20  tem *aListelem; 
18d10 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45   /* Array of WHE
18d20 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
18d30 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b   Expr opCompare;
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d50 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20     /* The X==Ei 
18d60 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
18d70 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65        /* The X e
18da0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
18db0 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d     Expr *pTest =
18dc0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18dd0 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66       /* X==Ei (f
18de0 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45  orm A) or just E
18df0 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20  i (form B) */.  
18e00 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e      VVA_ONLY( in
18e10 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20  t iCacheLevel = 
18e20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
18e30 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73  vel; )..      as
18e40 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
18e50 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
18e60 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70  _xIsSelect) && p
18e70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b  Expr->x.pList );
18e80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
18e90 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
18ea0 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
18eb0 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
18ec0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
18ed0 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
18ee0 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
18ef0 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
18f00 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65  r;.      endLabe
18f10 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
18f20 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
18f30 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78     if( (pX = pEx
18f40 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
18f50 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d  .        tempX =
18f60 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65   *pX;.        te
18f70 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
18f80 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
18f90 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73       exprToRegis
18fa0 74 65 72 28 26 74 65 6d 70 58 2c 20 73 71 6c 69  ter(&tempX, sqli
18fb0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
18fc0 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67  pParse, pX, &reg
18fd0 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20  Free1));.       
18fe0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
18ff0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
19000 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d    opCompare.op =
19010 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20   TK_EQ;.        
19020 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20  opCompare.pLeft 
19030 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20  = &tempX;.      
19040 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
19050 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  pare;.        /*
19060 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66   Ticket b351d95f
19070 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65  9cd5ef17e9d9dbae
19080 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31  18f5ca8611190001
19090 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  :.        ** The
190a0 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65   value in regFre
190b0 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f  e1 might get SCo
190c0 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66  py-ed into the f
190d0 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  ile result..    
190e0 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73      ** So make s
190f0 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67  ure that the reg
19100 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69  Free1 register i
19110 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72  s not reused for
19120 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a   other.        *
19130 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70  * purposes and p
19140 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74  ossibly overwrit
19150 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ten.  */.       
19160 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
19170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
19180 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b  (i=0; i<nExpr-1;
19190 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
191a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
191b0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
191c0 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b         if( pX ){
191d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
191e0 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20  t( pTest!=0 );. 
191f0 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61           opCompa
19200 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73  re.pRight = aLis
19210 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
19220 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
19230 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d           pTest =
19240 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
19250 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
19260 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20         nextCase 
19270 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19280 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
19290 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
192a0 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  st->op==TK_COLUM
192b0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
192c0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
192d0 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e  pParse, pTest, n
192e0 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f  extCase, SQLITE_
192f0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
19300 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
19310 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
19320 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
19330 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
19340 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
19350 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  arse, aListelem[
19360 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  i+1].pExpr, targ
19370 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
19380 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19390 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e  , OP_Goto, 0, en
193a0 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  dLabel);.       
193b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
193c0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
193d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
193e0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
193f0 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20  (v, nextCase);. 
19400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19410 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b   (nExpr&1)!=0 ){
19420 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19430 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
19440 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
19450 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
19460 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
19470 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c  [nExpr-1].pExpr,
19480 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
19490 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
194a0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
194b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
194c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
194d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
194e0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
194f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
19500 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
19510 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
19520 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20  e->nErr>0 .     
19530 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
19540 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43  >iCacheLevel==iC
19550 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20  acheLevel );.   
19560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
19570 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
19580 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62  dLabel);.      b
19590 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
195a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
195b0 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65  TRIGGER.    case
195c0 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
195d0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
195e0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52  ->affinity==OE_R
195f0 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20  ollback .       
19600 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
19610 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
19620 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
19630 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
19640 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20  OE_Fail.        
19650 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
19660 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
19670 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
19680 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72  if( !pParse->pTr
19690 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20  iggerTab ){.    
196a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
196b0 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196d0 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
196e0 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
196f0 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
19700 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
19710 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
19720 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
19730 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
19740 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
19750 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
19760 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
19770 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
19780 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
19790 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
197a0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69  alue) );.      i
197b0 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
197c0 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b  ty==OE_Ignore ){
197d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
197e0 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
197f0 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61          v, OP_Ha
19800 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f  lt, SQLITE_OK, O
19810 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78  E_Ignore, 0, pEx
19820 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b  pr->u.zToken,0);
19830 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
19840 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
19850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
19860 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
19870 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c  aint(pParse, SQL
19880 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
19890 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20  RIGGER,.        
198a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198b0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
198c0 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e  inity, pExpr->u.
198d0 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20  zToken, 0, 0);. 
198e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72       }..      br
198f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
19900 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  f.  }.  sqlite3R
19910 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19920 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
19930 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
19940 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19950 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65   regFree2);.  re
19960 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f  turn inReg;.}../
19970 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20  *.** Factor out 
19980 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20  the code of the 
19990 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
199a0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69   to initializati
199b0 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  on time..*/.void
199c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
199d0 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20  AtInit(.  Parse 
199e0 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
199f0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
19a00 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
19a10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
19a20 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20  ression to code 
19a30 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e  when the VDBE in
19a40 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69  itializes */.  i
19a50 6e 74 20 72 65 67 44 65 73 74 2c 20 20 20 20 20  nt regDest,     
19a60 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61   /* Store the va
19a70 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
19a80 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 75  ster */.  u8 reu
19a90 73 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20 54  sable       /* T
19aa0 72 75 65 20 69 66 20 74 68 69 73 20 65 78 70 72  rue if this expr
19ab0 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61 62  ession is reusab
19ac0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  le */.){.  ExprL
19ad0 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  ist *p;.  assert
19ae0 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
19af0 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d  pParse) );.  p =
19b00 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
19b10 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 73  xpr;.  pExpr = s
19b20 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
19b30 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
19b40 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   0);.  p = sqlit
19b50 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
19b60 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70  (pParse, p, pExp
19b70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  r);.  if( p ){. 
19b80 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
19b90 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
19ba0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  = &p->a[p->nExpr
19bb0 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  -1];.     pItem-
19bc0 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
19bd0 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20 20   = regDest;.    
19be0 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
19bf0 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20 7d   = reusable;.  }
19c00 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  .  pParse->pCons
19c10 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  tExpr = p;.}../*
19c20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19c30 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  e to evaluate an
19c40 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
19c50 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
19c60 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69  s.** into a regi
19c70 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ster.  Return th
19c80 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
19c90 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75  r where the resu
19ca0 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  lts.** are store
19cb0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
19cc0 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
19cd0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
19ce0 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61   that can be dea
19cf0 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65  llocated,.** the
19d00 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62  n write its numb
19d10 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20  er into *pReg.  
19d20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
19d30 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a  gister is not.**
19d40 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68   a temporary, th
19d50 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20  en set *pReg to 
19d60 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  zero..**.** If p
19d70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61  Expr is a consta
19d80 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
19d90 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65  utine might gene
19da0 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64  rate this.** cod
19db0 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65  e to fill the re
19dc0 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e  gister in the in
19dd0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63  itialization sec
19de0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56  tion of the.** V
19df0 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20  DBE program, in 
19e00 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20  order to factor 
19e10 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76  it out of the ev
19e20 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a  aluation loop..*
19e30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
19e40 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20  rCodeTemp(Parse 
19e50 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
19e60 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29  Expr, int *pReg)
19e70 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45  {.  int r2;.  pE
19e80 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
19e90 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78  rSkipCollate(pEx
19ea0 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74  pr);.  if( Const
19eb0 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
19ec0 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  .   && pExpr->op
19ed0 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20  !=TK_REGISTER.  
19ee0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
19ef0 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
19f00 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20  (pExpr).  ){.   
19f10 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 70   ExprList *p = p
19f20 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
19f30 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  r;.    int i;.  
19f40 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20    *pReg  = 0;.  
19f50 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
19f60 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
19f70 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
19f80 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d      for(pItem=p-
19f90 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20  >a, i=p->nExpr; 
19fa0 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d  i>0; pItem++, i-
19fb0 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -){.        if( 
19fc0 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
19fd0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
19fe0 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
19ff0 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20  pr,pExpr,-1)==0 
1a000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1a010 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f  urn pItem->u.iCo
1a020 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20  nstExprReg;.    
1a030 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a040 20 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b 70    }.    r2 = ++p
1a050 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1a060 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a070 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
1a080 45 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20 20  Expr, r2, 1);.  
1a090 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
1a0a0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
1a0b0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1a0c0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1a0d0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1a0e0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
1a0f0 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31  ;.    if( r2==r1
1a100 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20   ){.      *pReg 
1a110 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = r1;.    }else{
1a120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1a130 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1a140 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
1a150 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  *pReg = 0;.    }
1a160 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
1a170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1a180 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1a190 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
1a1a0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
1a1b0 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
1a1c0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
1a1d0 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
1a1e0 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
1a1f0 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
1a200 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
1a210 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  arget..*/.void s
1a220 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
1a230 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1a240 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
1a250 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
1a260 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
1a270 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
1a280 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
1a290 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
1a2a0 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
1a2b0 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
1a2c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a2d0 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
1a2e0 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
1a2f0 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
1a300 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a310 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
1a320 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1a330 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1a340 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
1a350 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  ( pParse->pVdbe 
1a360 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
1a370 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1a380 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
1a390 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e  rget && pParse->
1a3a0 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73  pVdbe ){.      s
1a3b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a3c0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1a3d0 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
1a3e0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a   target);.    }.
1a3f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
1a400 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1a410 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
1a420 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
1a430 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
1a440 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
1a450 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
1a460 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
1a470 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
1a480 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
1a490 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68 65   target.  If the
1a4a0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
1a4b0 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
1a4c0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
1a4d0 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f  ght choose to co
1a4e0 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  de the expressio
1a4f0 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  n at initializat
1a500 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
1a510 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1a520 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73  eFactorable(Pars
1a530 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1a540 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1a550 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  et){.  if( pPars
1a560 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1a570 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
1a580 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29  sConstant(pExpr)
1a590 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1a5a0 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
1a5b0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1a5c0 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  get, 0);.  }else
1a5d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1a5e0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1a5f0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1a600 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1a610 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
1a620 61 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e  alutes the given
1a630 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
1a640 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a  puts the result.
1a650 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
1a660 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  arget..**.** Als
1a670 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
1a680 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1a690 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f  results into ano
1a6a0 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67  ther "cache" reg
1a6b0 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64  ister.** and mod
1a6c0 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
1a6d0 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  on so that the n
1a6e0 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  ext time it is e
1a6f0 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65  valuated,.** the
1a700 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70   result is a cop
1a710 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72  y of the cache r
1a720 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
1a730 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1a740 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69  sed for expressi
1a750 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65  ons that are use
1a760 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
1a770 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20  imes.  They are 
1a780 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61  evaluated once a
1a790 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  nd the results o
1a7a0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1a7b0 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a  .** are reused..
1a7c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1a7d0 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
1a7e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1a7f0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1a800 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
1a810 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1a820 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a  be;.  int iMem;.
1a830 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1a840 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
1a850 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
1a860 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c  EGISTER );.  sql
1a870 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1a880 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1a890 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b  et);.  iMem = ++
1a8a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1a8b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a8c0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61  2(v, OP_Copy, ta
1a8d0 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65  rget, iMem);.  e
1a8e0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45  xprToRegister(pE
1a8f0 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 23  xpr, iMem);.}..#
1a900 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1a910 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1a920 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e  PLAIN)./*.** Gen
1a930 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65  erate a human-re
1a940 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69  adable explanati
1a950 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  on of an express
1a960 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  ion tree..*/.voi
1a970 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e  d sqlite3Explain
1a980 45 78 70 72 28 56 64 62 65 20 2a 70 4f 75 74 2c  Expr(Vdbe *pOut,
1a990 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
1a9a0 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
1a9b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a9c0 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
1a9d0 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  oded */.  const 
1a9e0 63 68 61 72 20 2a 7a 42 69 6e 4f 70 20 3d 20 30  char *zBinOp = 0
1a9f0 3b 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 6f 70  ;   /* Binary op
1aa00 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  erator */.  cons
1aa10 74 20 63 68 61 72 20 2a 7a 55 6e 69 4f 70 20 3d  t char *zUniOp =
1aa20 20 30 3b 20 20 20 2f 2a 20 55 6e 61 72 79 20 6f   0;   /* Unary o
1aa30 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 66 28  perator */.  if(
1aa40 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
1aa50 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
1aa60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
1aa70 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
1aa80 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1aa90 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1aaa0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1aab0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1aac0 69 6e 74 66 28 70 4f 75 74 2c 20 22 41 47 47 7b  intf(pOut, "AGG{
1aad0 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  %d:%d}",.       
1aae0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
1aaf0 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
1ab00 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
1ab10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ab20 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
1ab30 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
1ab40 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20  Table<0 ){.     
1ab50 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20     /* This only 
1ab60 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64  happens when cod
1ab70 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72  ing check constr
1ab80 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  aints */.       
1ab90 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1aba0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 4f 4c  rintf(pOut, "COL
1abb0 55 4d 4e 28 25 64 29 22 2c 20 70 45 78 70 72 2d  UMN(%d)", pExpr-
1abc0 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1abd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1abe0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1abf0 69 6e 74 66 28 70 4f 75 74 2c 20 22 7b 25 64 3a  intf(pOut, "{%d:
1ac00 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %d}",.          
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1ac30 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1ac40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ac50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ac60 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
1ac70 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  R: {.      if( p
1ac80 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
1ac90 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
1aca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1acb0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1acc0 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69  "%d", pExpr->u.i
1acd0 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 65  Value);.      }e
1ace0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1acf0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1ad00 66 28 70 4f 75 74 2c 20 22 25 73 22 2c 20 70 45  f(pOut, "%s", pE
1ad10 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1ad20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1ad30 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1ad40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1ad50 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
1ad60 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
1ad70 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1ad80 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1ad90 75 74 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e  ut,"%s", pExpr->
1ada0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1adb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1adc0 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
1add0 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
1ade0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1adf0 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 51 22 2c  rintf(pOut,"%Q",
1ae00 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1ae10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ae20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1ae30 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
1ae40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1ae50 69 6e 74 66 28 70 4f 75 74 2c 22 4e 55 4c 4c 22  intf(pOut,"NULL"
1ae60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ae70 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1ae80 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
1ae90 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
1aea0 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
1aeb0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1aec0 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 22 2c  rintf(pOut,"%s",
1aed0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1aee0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1aef0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1af00 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
1af10 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1af20 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1af30 70 4f 75 74 2c 22 56 41 52 49 41 42 4c 45 28 25  pOut,"VARIABLE(%
1af40 73 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20  s,%d)",.        
1af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af60 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b     pExpr->u.zTok
1af70 65 6e 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  en, pExpr->iColu
1af80 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
1af90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1afa0 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
1afb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1afc0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1afd0 22 52 45 47 49 53 54 45 52 28 25 64 29 22 2c 20  "REGISTER(%d)", 
1afe0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
1aff0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b000 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1b010 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
1b020 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1b030 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1b040 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b050 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1b060 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
1b070 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
1b080 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
1b090 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
1b0a0 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
1b0b0 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
1b0c0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1b0d0 2a 7a 41 66 66 20 3d 20 22 75 6e 6b 22 3b 0a 20  *zAff = "unk";. 
1b0e0 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
1b0f0 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
1b100 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1b110 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
1b120 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
1b130 54 45 58 54 3a 20 20 20 20 7a 41 66 66 20 3d 20  TEXT:    zAff = 
1b140 22 54 45 58 54 22 3b 20 20 20 20 20 62 72 65 61  "TEXT";     brea
1b150 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1b160 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a  SQLITE_AFF_NONE:
1b170 20 20 20 20 7a 41 66 66 20 3d 20 22 4e 4f 4e 45      zAff = "NONE
1b180 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1b190 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1b1a0 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 7a  E_AFF_NUMERIC: z
1b1b0 41 66 66 20 3d 20 22 4e 55 4d 45 52 49 43 22 3b  Aff = "NUMERIC";
1b1c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1b1d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1b1e0 5f 49 4e 54 45 47 45 52 3a 20 7a 41 66 66 20 3d  _INTEGER: zAff =
1b1f0 20 22 49 4e 54 45 47 45 52 22 3b 20 20 62 72 65   "INTEGER";  bre
1b200 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1b210 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
1b220 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 52 45 41  :    zAff = "REA
1b230 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  L";     break;. 
1b240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1b250 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1b260 66 28 70 4f 75 74 2c 20 22 43 41 53 54 2d 25 73  f(pOut, "CAST-%s
1b270 28 22 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20 20  (", zAff);.     
1b280 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1b290 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  xpr(pOut, pExpr-
1b2a0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
1b2b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b2c0 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a  ntf(pOut, ")");.
1b2d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b2e0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1b2f0 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
1b300 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1b310 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1b320 4c 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  LT";     break;.
1b330 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
1b340 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c       zBinOp = "L
1b350 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
1b360 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
1b370 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 54      zBinOp = "GT
1b380 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1b390 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
1b3a0 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 45 22     zBinOp = "GE"
1b3b0 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1b3c0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
1b3d0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4e 45 22 3b    zBinOp = "NE";
1b3e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b3f0 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
1b400 20 7a 42 69 6e 4f 70 20 3d 20 22 45 51 22 3b 20   zBinOp = "EQ"; 
1b410 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1b420 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20  ase TK_IS:      
1b430 7a 42 69 6e 4f 70 20 3d 20 22 49 53 22 3b 20 20  zBinOp = "IS";  
1b440 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1b450 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a  se TK_ISNOT:   z
1b460 42 69 6e 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b  BinOp = "ISNOT";
1b470 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1b480 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 42  e TK_AND:     zB
1b490 69 6e 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20  inOp = "AND";   
1b4a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1b4b0 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42 69   TK_OR:      zBi
1b4c0 6e 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20  nOp = "OR";     
1b4d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1b4e0 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69 6e  TK_PLUS:    zBin
1b4f0 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20 62  Op = "ADD";    b
1b500 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b510 4b 5f 53 54 41 52 3a 20 20 20 20 7a 42 69 6e 4f  K_STAR:    zBinO
1b520 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 62 72  p = "MUL";    br
1b530 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1b540 5f 4d 49 4e 55 53 3a 20 20 20 7a 42 69 6e 4f 70  _MINUS:   zBinOp
1b550 20 3d 20 22 53 55 42 22 3b 20 20 20 20 62 72 65   = "SUB";    bre
1b560 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1b570 52 45 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20  REM:     zBinOp 
1b580 3d 20 22 52 45 4d 22 3b 20 20 20 20 62 72 65 61  = "REM";    brea
1b590 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
1b5a0 49 54 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20 3d  ITAND:  zBinOp =
1b5b0 20 22 42 49 54 41 4e 44 22 3b 20 62 72 65 61 6b   "BITAND"; break
1b5c0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
1b5d0 54 4f 52 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20  TOR:   zBinOp = 
1b5e0 22 42 49 54 4f 52 22 3b 20 20 62 72 65 61 6b 3b  "BITOR";  break;
1b5f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
1b600 53 48 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  SH:   zBinOp = "
1b610 44 49 56 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  DIV";    break;.
1b620 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
1b630 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c  FT:  zBinOp = "L
1b640 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20  SHIFT"; break;. 
1b650 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
1b660 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 53  T:  zBinOp = "RS
1b670 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  HIFT"; break;.  
1b680 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
1b690 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 43 4f 4e  :  zBinOp = "CON
1b6a0 43 41 54 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  CAT"; break;..  
1b6b0 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
1b6c0 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 4d 49  :  zUniOp = "UMI
1b6d0 4e 55 53 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  NUS"; break;.   
1b6e0 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
1b6f0 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 50 4c 55    zUniOp = "UPLU
1b700 53 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  S";  break;.    
1b710 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20  case TK_BITNOT: 
1b720 20 7a 55 6e 69 4f 70 20 3d 20 22 42 49 54 4e 4f   zUniOp = "BITNO
1b730 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
1b740 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20  ase TK_NOT:     
1b750 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 22 3b 20  zUniOp = "NOT"; 
1b760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1b770 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a  se TK_ISNULL:  z
1b780 55 6e 69 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22  UniOp = "ISNULL"
1b790 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
1b7a0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 55  e TK_NOTNULL: zU
1b7b0 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22  niOp = "NOTNULL"
1b7c0 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61  ; break;..    ca
1b7d0 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b  se TK_COLLATE: {
1b7e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b7f0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1b800 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1b810 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b820 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1b830 2e 43 4f 4c 4c 41 54 45 28 25 73 29 22 2c 70 45  .COLLATE(%s)",pE
1b840 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1b850 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b860 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
1b870 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
1b880 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
1b890 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
1b8a0 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
1b8b0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
1b8c0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1b8d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78   */.      if( Ex
1b8e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1b8f0 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
1b900 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
1b910 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
1b920 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
1b930 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
1b940 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
1b950 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41      if( op==TK_A
1b960 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  GG_FUNCTION ){. 
1b970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1b980 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1b990 2c 20 22 41 47 47 5f 46 55 4e 43 54 49 4f 4e 25  , "AGG_FUNCTION%
1b9a0 64 3a 25 73 28 22 2c 0a 20 20 20 20 20 20 20 20  d:%s(",.        
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9c0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 2c       pExpr->op2,
1b9d0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1b9e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1b9f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ba00 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1ba10 74 2c 20 22 46 55 4e 43 54 49 4f 4e 3a 25 73 28  t, "FUNCTION:%s(
1ba20 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
1ba30 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  en);.      }.   
1ba40 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
1ba50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ba60 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
1ba70 4f 75 74 2c 20 70 46 61 72 67 29 3b 0a 20 20 20  Out, pFarg);.   
1ba80 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1ba90 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1baa0 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20  pOut, ")");.    
1bab0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1bac0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bad0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1bae0 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 20  case TK_EXISTS: 
1baf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1bb00 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1bb10 74 2c 20 22 45 58 49 53 54 53 28 22 29 3b 0a 20  t, "EXISTS(");. 
1bb20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1bb30 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20  ainSelect(pOut, 
1bb40 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1bb50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bb60 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1bb70 75 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 62  ut,")");.      b
1bb80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1bb90 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
1bba0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1bbb0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1bbc0 74 2c 20 22 28 22 29 3b 0a 20 20 20 20 20 20 73  t, "(");.      s
1bbd0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c  qlite3ExplainSel
1bbe0 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  ect(pOut, pExpr-
1bbf0 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
1bc00 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1bc10 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29  nPrintf(pOut, ")
1bc20 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1bc30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bc40 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73  TK_IN: {.      s
1bc50 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1bc60 6e 74 66 28 70 4f 75 74 2c 20 22 49 4e 28 22 29  ntf(pOut, "IN(")
1bc70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1bc80 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1bc90 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1bca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bcb0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1bcc0 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 69 66 28   ",");.      if(
1bcd0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1bce0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1bcf0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
1bd00 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
1bd10 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70  elect(pOut, pExp
1bd20 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
1bd30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bd40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1bd50 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c  inExprList(pOut,
1bd60 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
1bd70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bd80 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1bd90 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b  intf(pOut, ")");
1bda0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1bdb0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1bdc0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1bdd0 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20  RY */..    /*.  
1bde0 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
1bdf0 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
1be00 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
1be10 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
1be20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
1be30 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
1be40 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
1be50 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
1be60 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
1be70 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1be80 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
1be90 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
1bea0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1beb0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
1bec0 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
1bed0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1bee0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
1bef0 20 2a 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   *pX = pExpr->pL
1bf00 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
1bf10 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pY = pExpr->x.p
1bf20 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1bf30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 5a  ;.      Expr *pZ
1bf40 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1bf50 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
1bf60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1bf70 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1bf80 22 42 45 54 57 45 45 4e 28 22 29 3b 0a 20 20 20  "BETWEEN(");.   
1bf90 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1bfa0 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 58 29 3b  nExpr(pOut, pX);
1bfb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1bfc0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1bfd0 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71  , ",");.      sq
1bfe0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1bff0 28 70 4f 75 74 2c 20 70 59 29 3b 0a 20 20 20 20  (pOut, pY);.    
1c000 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c010 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22  Printf(pOut, ","
1c020 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c030 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1c040 2c 20 70 5a 29 3b 0a 20 20 20 20 20 20 73 71 6c  , pZ);.      sql
1c050 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1c060 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20  f(pOut, ")");.  
1c070 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c080 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49  .    case TK_TRI
1c090 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  GGER: {.      /*
1c0a0 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69   If the opcode i
1c0b0 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68  s TK_TRIGGER, th
1c0c0 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
1c0d0 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  n is a reference
1c0e0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63  .      ** to a c
1c0f0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
1c100 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75  .* or old.* pseu
1c110 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61  do-tables availa
1c120 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
1c130 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
1c140 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45  . In this case E
1c150 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65  xpr.iTable is se
1c160 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20  t to 1 for the. 
1c170 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73       ** new.* ps
1c180 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30  eudo-table, or 0
1c190 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70   for the old.* p
1c1a0 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70  seudo-table. Exp
1c1b0 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  r.iColumn.      
1c1c0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
1c1d0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70   column of the p
1c1e0 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72  seudo-table to r
1c1f0 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f  ead, or to -1 to
1c200 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74  .      ** read t
1c210 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a  he rowid field..
1c220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1c230 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1c240 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 28 25 64  ntf(pOut, "%s(%d
1c250 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  )", .          p
1c260 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
1c270 4e 45 57 22 20 3a 20 22 4f 4c 44 22 2c 20 70 45  NEW" : "OLD", pE
1c280 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1c290 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c2a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  }.    case TK_CA
1c2b0 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SE: {.      sqli
1c2c0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1c2d0 28 70 4f 75 74 2c 20 22 43 41 53 45 28 22 29 3b  (pOut, "CASE(");
1c2e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1c2f0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1c300 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c310 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c320 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1c330 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ",");.      sqli
1c340 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
1c350 73 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  st(pOut, pExpr->
1c360 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
1c370 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1c380 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c390 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
1c3a0 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
1c3b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c3c0 7a 54 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20  zType = "unk";. 
1c3d0 20 20 20 20 20 73 77 69 74 63 68 28 20 70 45 78       switch( pEx
1c3e0 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a  pr->affinity ){.
1c3f0 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f          case OE_
1c400 52 6f 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70  Rollback:   zTyp
1c410 65 20 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20  e = "rollback"; 
1c420 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1c430 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20  case OE_Abort:  
1c440 20 20 20 20 7a 54 79 70 65 20 3d 20 22 61 62 6f      zType = "abo
1c450 72 74 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  rt";     break;.
1c460 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f          case OE_
1c470 46 61 69 6c 3a 20 20 20 20 20 20 20 7a 54 79 70  Fail:       zTyp
1c480 65 20 3d 20 22 66 61 69 6c 22 3b 20 20 20 20 20  e = "fail";     
1c490 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1c4a0 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20  case OE_Ignore: 
1c4b0 20 20 20 20 7a 54 79 70 65 20 3d 20 22 69 67 6e      zType = "ign
1c4c0 6f 72 65 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ore";    break;.
1c4d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1c4e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1c4f0 74 66 28 70 4f 75 74 2c 20 22 52 41 49 53 45 2d  tf(pOut, "RAISE-
1c500 25 73 28 25 73 29 22 2c 20 7a 54 79 70 65 2c 20  %s(%s)", zType, 
1c510 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1c520 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c530 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1c540 20 20 69 66 28 20 7a 42 69 6e 4f 70 20 29 7b 0a    if( zBinOp ){.
1c550 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c560 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
1c570 73 28 22 2c 20 7a 42 69 6e 4f 70 29 3b 0a 20 20  s(", zBinOp);.  
1c580 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c590 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1c5a0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
1c5b0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1c5c0 74 66 28 70 4f 75 74 2c 22 2c 22 29 3b 0a 20 20  tf(pOut,",");.  
1c5d0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c5e0 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1c5f0 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 73  ->pRight);.    s
1c600 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1c610 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20  ntf(pOut,")");. 
1c620 20 7d 65 6c 73 65 20 69 66 28 20 7a 55 6e 69 4f   }else if( zUniO
1c630 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
1c640 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1c650 75 74 2c 22 25 73 28 22 2c 20 7a 55 6e 69 4f 70  ut,"%s(", zUniOp
1c660 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1c670 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1c680 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c690 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c6a0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22  nPrintf(pOut,")"
1c6b0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
1c6c0 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1c6d0 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1c6e0 50 4c 41 49 4e 29 20 2a 2f 0a 0a 23 69 66 20 64  PLAIN) */..#if d
1c6f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1c700 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
1c710 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  N)./*.** Generat
1c720 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
1c730 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  le explanation o
1c740 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
1c750 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
1c760 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1c770 4c 69 73 74 28 56 64 62 65 20 2a 70 4f 75 74 2c  List(Vdbe *pOut,
1c780 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1c790 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1c7a0 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c  ( pList==0 || pL
1c7b0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 7b  ist->nExpr==0 ){
1c7c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1c7d0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1c7e0 22 28 65 6d 70 74 79 2d 6c 69 73 74 29 22 29 3b  "(empty-list)");
1c7f0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1c800 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e  else if( pList->
1c810 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
1c820 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1c830 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e  pr(pOut, pList->
1c840 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  a[0].pExpr);.  }
1c850 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1c860 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 4f 75  3ExplainPush(pOu
1c870 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  t);.    for(i=0;
1c880 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1c890 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1c8a0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1c8b0 66 28 70 4f 75 74 2c 20 22 69 74 65 6d 5b 25 64  f(pOut, "item[%d
1c8c0 5d 20 3d 20 22 2c 20 69 29 3b 0a 20 20 20 20 20  ] = ", i);.     
1c8d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1c8e0 75 73 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 20  ush(pOut);.     
1c8f0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1c900 78 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d  xpr(pOut, pList-
1c910 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1c920 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c930 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 20  inPop(pOut);.   
1c940 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
1c950 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
1c960 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c970 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1c980 20 41 53 20 25 73 22 2c 20 70 4c 69 73 74 2d 3e   AS %s", pList->
1c990 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
1c9a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1c9b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62 53 70 61 6e  List->a[i].bSpan
1c9c0 49 73 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  IsTab ){.       
1c9d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1c9e0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 20 28 25  rintf(pOut, " (%
1c9f0 73 29 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  s)", pList->a[i]
1ca00 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
1ca10 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70 4c 69  .      if( i<pLi
1ca20 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  st->nExpr-1 ){. 
1ca30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ca40 70 6c 61 69 6e 4e 4c 28 70 4f 75 74 29 3b 0a 20  plainNL(pOut);. 
1ca50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ca60 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1ca70 6f 70 28 70 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a  op(pOut);.  }.}.
1ca80 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1ca90 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1caa0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1cab0 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
1cac0 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
1cad0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
1cae0 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
1caf0 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71   list into a seq
1cb00 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
1cb10 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  rs beginning at 
1cb20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  target..**.** Re
1cb30 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1cb40 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c  of elements eval
1cb50 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uated..**.** The
1cb60 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
1cb70 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
1cb80 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f  he arguments fro
1cb90 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65  m being.** fille
1cba0 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79  d using OP_SCopy
1cbb0 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20  .  OP_Copy must 
1cbc0 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  be used instead.
1cbd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
1cbe0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72  E_ECEL_FACTOR ar
1cbf0 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f  gument allows co
1cc00 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
1cc10 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72   to be.** factor
1cc20 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74  ed out into init
1cc30 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e  ialization code.
1cc40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
1cc50 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1cc60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1cc70 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
1cc80 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1cc90 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
1cca0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1ccb0 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f  on list to be co
1ccc0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72  ded */.  int tar
1ccd0 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57  get,        /* W
1cce0 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65  here to write re
1ccf0 73 75 6c 74 73 20 2a 2f 0a 20 20 75 38 20 66 6c  sults */.  u8 fl
1cd00 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
1cd10 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66   SQLITE_ECEL_* f
1cd20 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lags */.){.  str
1cd30 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1cd40 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1cd50 69 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f  i, n;.  u8 copyO
1cd60 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c  p = (flags & SQL
1cd70 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20  ITE_ECEL_DUP) ? 
1cd80 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f  OP_Copy : OP_SCo
1cd90 70 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  py;.  assert( pL
1cda0 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ist!=0 );.  asse
1cdb0 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
1cdc0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1cdd0 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f  ->pVdbe!=0 );  /
1cde0 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69  * Never gets thi
1cdf0 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20  s far otherwise 
1ce00 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  */.  n = pList->
1ce10 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f  nExpr;.  if( !Co
1ce20 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
1ce30 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e  se) ) flags &= ~
1ce40 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
1ce50 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  OR;.  for(pItem=
1ce60 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1ce70 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
1ce80 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
1ce90 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
1cea0 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  r;.    if( (flag
1ceb0 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
1cec0 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71  FACTOR)!=0 && sq
1ced0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1cee0 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
1cef0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1cf00 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
1cf10 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
1cf20 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  i, 0);.    }else
1cf30 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65  {.      int inRe
1cf40 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1cf50 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1cf60 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
1cf70 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  i);.      if( in
1cf80 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b  Reg!=target+i ){
1cf90 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
1cfa0 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 56 64  *pOp;.        Vd
1cfb0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1cfc0 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 69  pVdbe;.        i
1cfd0 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f  f( copyOp==OP_Co
1cfe0 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  py.         && (
1cff0 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47  pOp=sqlite3VdbeG
1d000 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70  etOp(v, -1))->op
1d010 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  code==OP_Copy.  
1d020 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
1d030 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52  1+pOp->p3+1==inR
1d040 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
1d050 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31  Op->p2+pOp->p3+1
1d060 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20  ==target+i.     
1d070 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1d080 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20  pOp->p3++;.     
1d090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d0a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d0b0 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
1d0c0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69   inReg, target+i
1d0d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d0e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1d0f0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
1d100 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1d110 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
1d120 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
1d130 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
1d140 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
1d150 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
1d160 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
1d170 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
1d180 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
1d190 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
1d1a0 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
1d1b0 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
1d1c0 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20  ** elementation 
1d1d0 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of x..*/.static 
1d1e0 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74  void exprCodeBet
1d1f0 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  ween(.  Parse *p
1d200 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
1d210 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1d220 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1d230 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1d240 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42  r,      /* The B
1d250 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f  ETWEEN expressio
1d260 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  n */.  int dest,
1d270 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1d280 20 68 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d   here if the jum
1d290 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  p is taken */.  
1d2a0 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20  int jumpIfTrue, 
1d2b0 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75    /* Take the ju
1d2c0 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45  mp if the BETWEE
1d2d0 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69  N is true */.  i
1d2e0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
1d2f0 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
1d300 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
1d310 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
1d320 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20   Expr exprAnd;  
1d330 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70     /* The AND op
1d340 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20  erator in  x>=y 
1d350 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45  AND x<=z  */.  E
1d360 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20  xpr compLeft;   
1d370 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74   /* The  x>=y  t
1d380 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  erm */.  Expr co
1d390 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68  mpRight;   /* Th
1d3a0 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f  e  x<=z  term */
1d3b0 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20  .  Expr exprX;  
1d3c0 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20       /* The  x  
1d3d0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
1d3e0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1d3f0 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72  = 0; /* Temporar
1d400 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a  y use register *
1d410 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  /..  assert( !Ex
1d420 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1d430 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1d440 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20  t) );.  exprX = 
1d450 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
1d460 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
1d470 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e  _AND;.  exprAnd.
1d480 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
1d490 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69  t;.  exprAnd.pRi
1d4a0 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
1d4b0 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20  ;.  compLeft.op 
1d4c0 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c  = TK_GE;.  compL
1d4d0 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
1d4e0 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  rX;.  compLeft.p
1d4f0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
1d500 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
1d510 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  pr;.  compRight.
1d520 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
1d530 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
1d540 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
1d550 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
1d560 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
1d570 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54  ].pExpr;.  exprT
1d580 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58  oRegister(&exprX
1d590 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
1d5a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
1d5b0 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
1d5c0 29 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49 66 54  );.  if( jumpIfT
1d5d0 72 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rue ){.    sqlit
1d5e0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1d5f0 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
1d600 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1d610 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1d620 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1d630 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
1d640 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
1d650 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Null);.  }.  sql
1d660 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1d670 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1d680 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75  ee1);..  /* Ensu
1d690 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74  re adequate test
1d6a0 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74   coverage */.  t
1d6b0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1d6c0 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1d6d0 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1d6e0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
1d6f0 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1d700 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1d710 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1d720 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
1d730 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1d740 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1d750 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1d760 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1d770 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1d780 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1d790 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1d7a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1d7b0 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1d7c0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1d7d0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1d7e0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d7f0 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1d800 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1d810 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
1d820 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1d830 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1d840 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1d850 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1d860 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1d870 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1d880 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1d890 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  0 );.}../*.** Ge
1d8a0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1d8b0 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
1d8c0 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
1d8d0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
1d8e0 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
1d8f0 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
1d900 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
1d910 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
1d920 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
1d930 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
1d940 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
1d950 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
1d960 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
1d970 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
1d980 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
1d990 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
1d9a0 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
1d9b0 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
1d9c0 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a  flag is SQLITE_J
1d9d0 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  UMPIFNULL..**.**
1d9e0 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
1d9f0 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
1da00 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65  hat certain toke
1da10 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b  n values (ex: TK
1da20 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20  _EQ).** are the 
1da30 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76  same as opcode v
1da40 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71  alues (ex: OP_Eq
1da50 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  ) that implement
1da60 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
1da70 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  ng.** operation.
1da80 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e    Special commen
1da90 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64  ts in vdbe.c and
1daa0 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
1dab0 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20  wk script in.** 
1dac0 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73  the make process
1dad0 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c   cause these val
1dae0 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41  ues to align.  A
1daf0 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20  ssert()s in the 
1db00 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65  code.** below ve
1db10 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
1db20 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65  mbers are aligne
1db30 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  d correctly..*/.
1db40 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1db50 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
1db60 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1db70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
1db80 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
1db90 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1dba0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
1dbb0 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
1dbc0 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
1dbd0 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
1dbe0 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
1dbf0 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
1dc00 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
1dc10 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
1dc20 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
1dc30 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20  NEVER(v==0) )   
1dc40 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78    return;  /* Ex
1dc50 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
1dc60 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
1dc70 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  r */.  if( NEVER
1dc80 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74  (pExpr==0) ) ret
1dc90 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20  urn;  /* No way 
1dca0 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
1dcb0 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  */.  op = pExpr-
1dcc0 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
1dcd0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1dce0 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _AND: {.      in
1dcf0 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
1dd00 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1dd10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dd20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1dd30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1dd40 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1dd50 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1dd60 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  d2,jumpIfNull^SQ
1dd70 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1dd80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1dd90 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1dda0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1ddb0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1ddc0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1ddd0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1dde0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1ddf0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1de00 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
1de10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1de20 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
1de30 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
1de40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1de50 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74  TK_OR: {.      t
1de60 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1de70 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1de80 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1de90 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1dea0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
1deb0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1dec0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1ded0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1dee0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1def0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1df00 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1df10 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1df20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1df30 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1df40 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  e, 1);.      bre
1df50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1df60 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
1df70 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1df80 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1df90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1dfa0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1dfb0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1dfc0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1dfd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dfe0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
1dff0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1e000 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1e010 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1e020 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1e030 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1e040 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  Q: {.      testc
1e050 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1e060 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
1e070 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e080 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1e090 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1e0a0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1e0b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e0c0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1e0d0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1e0e0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
1e0f0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1e100 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1e110 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1e120 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1e130 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
1e140 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1e150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1e160 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
1e170 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
1e180 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e190 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
1e1a0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1e1b0 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
1e1c0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
1e1d0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e1e0 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
1e1f0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
1e200 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
1e210 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
1e220 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1e230 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
1e240 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
1e250 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
1e260 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
1e270 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1e280 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Ge);.      a
1e290 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
1e2a0 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
1e2b0 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f  ==OP_Eq); VdbeCo
1e2c0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e2d0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Eq);.      ass
1e2e0 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
1e2f0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1e300 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ne); VdbeCove
1e310 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1e320 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Ne);.      testc
1e330 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1e340 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1e350 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1e360 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e370 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1e380 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1e390 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20  K_ISNOT: {.     
1e3a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e3b0 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IS );.      te
1e3c0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1e3d0 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  SNOT );.      r1
1e3e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e3f0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e400 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1e410 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1e420 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1e430 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e440 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1e450 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1e460 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
1e470 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
1e480 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  E;.      codeCom
1e490 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1e4a0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
1e4b0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51  r1, r2, dest, SQ
1e4e0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
1e4f0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1e500 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29  If(v, op==TK_EQ)
1e510 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1e520 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1e530 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _NE);.      test
1e540 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1e550 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1e560 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1e570 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1e580 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e590 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
1e5a0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
1e5b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e5c0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
1e5d0 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
1e5e0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
1e5f0 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
1e600 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
1e610 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
1e620 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1e630 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
1e640 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1e650 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e660 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1e670 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1e680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e690 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
1e6a0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
1e6b0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1e6c0 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
1e6d0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1e6e0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
1e6f0 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
1e700 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1e710 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1e720 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e730 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
1e740 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1e750 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1e760 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
1e770 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
1e780 70 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d  pr, dest, 1, jum
1e790 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1e7a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1e7b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e7c0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
1e7d0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
1e7e0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
1e7f0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
1e800 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1e810 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
1e820 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f  l = jumpIfNull ?
1e830 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61   dest : destIfFa
1e840 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse;.      sqlit
1e850 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
1e860 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1e870 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e  IfFalse, destIfN
1e880 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1e890 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e8a0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
1e8b0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1e8c0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1e8d0 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
1e8e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e8f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1e900 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1e910 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
1e920 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
1e930 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1e940 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1e950 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20  oto, 0, dest);. 
1e960 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
1e970 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
1e980 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1e990 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* No-op */.   
1e9a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e9b0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1e9c0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e9d0 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
1e9e0 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
1e9f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1ea00 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65  v, OP_If, r1, de
1ea10 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
1ea20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
1ea30 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1ea40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1ea50 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1ea60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ea70 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1ea80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1ea90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1eaa0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1eab0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1eac0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
1ead0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1eae0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1eaf0 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
1eb00 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1eb10 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
1eb20 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
1eb30 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
1eb40 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
1eb50 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
1eb60 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
1eb70 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
1eb80 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
1eb90 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
1eba0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1ebb0 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
1ebc0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
1ebd0 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
1ebe0 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
1ebf0 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
1ec00 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
1ec10 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
1ec20 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
1ec30 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
1ec40 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
1ec50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ec60 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
1ec70 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1ec80 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
1ec90 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1eca0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1ecb0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1ecc0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
1ecd0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
1ece0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1ecf0 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
1ed00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
1ed10 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
1ed20 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
1ed30 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1ed40 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
1ed50 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78   ) return; /* Ex
1ed60 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
1ed70 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
1ed80 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  r */.  if( pExpr
1ed90 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b  ==0 )    return;
1eda0 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
1edb0 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
1edc0 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
1edd0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
1ede0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
1edf0 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
1ee00 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
1ee10 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
1ee20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
1ee30 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
1ee40 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
1ee50 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
1ee60 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
1ee70 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
1ee80 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1eea0 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
1eeb0 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
1eec0 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
1eed0 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
1eee0 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
1eef0 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
1ef00 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
1ef10 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1ef30 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
1ef40 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
1ef50 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
1ef60 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
1ef70 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
1ef80 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
1ef90 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
1efa0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
1efb0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
1efc0 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
1efd0 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
1efe0 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
1eff0 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
1f000 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
1f010 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
1f020 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
1f030 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1f040 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
1f050 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
1f060 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
1f070 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
1f080 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
1f090 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
1f0a0 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
1f0b0 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
1f0c0 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
1f0d0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1f0e0 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
1f0f0 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
1f100 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1f110 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
1f120 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
1f130 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
1f140 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
1f150 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
1f160 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1f170 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
1f180 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
1f190 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1f1a0 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
1f1b0 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
1f1c0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
1f1d0 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
1f1e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1f1f0 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
1f200 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
1f210 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1f220 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
1f230 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
1f240 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
1f250 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1f260 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1f270 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1f280 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f290 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1f2a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f2b0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1f2c0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1f2d0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1f2e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1f2f0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1f300 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1f310 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
1f320 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1f330 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f340 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
1f350 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f360 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f370 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
1f380 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
1f390 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1f3a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f3b0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f3c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f3d0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1f3e0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1f3f0 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  2, jumpIfNull^SQ
1f400 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1f410 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f420 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1f430 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1f440 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1f450 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1f460 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1f470 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1f480 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1f490 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
1f4a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f4b0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
1f4c0 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
1f4d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f4e0 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
1f4f0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1f500 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1f510 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1f520 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1f530 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1f540 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1f550 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f560 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
1f570 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
1f580 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
1f590 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
1f5a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
1f5b0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
1f5c0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1f5d0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1f5e0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1f5f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f600 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f610 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1f620 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1f630 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f640 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f650 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1f660 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
1f670 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1f680 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
1f690 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1f6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f6b0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
1f6c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1f6d0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
1f6e0 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
1f6f0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
1f700 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f710 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
1f720 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
1f730 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
1f740 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
1f750 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1f760 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
1f770 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
1f780 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
1f790 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
1f7a0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1f7b0 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
1f7c0 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
1f7d0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1f7e0 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
1f7f0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1f800 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
1f810 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
1f820 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f830 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
1f840 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
1f850 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  q);.      assert
1f860 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
1f870 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f880 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ne); VdbeCoverag
1f890 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29  eIf(v,op==OP_Ne)
1f8a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f8b0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1f8c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f8d0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1f8e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f8f0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1f900 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
1f910 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  SNOT: {.      te
1f920 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
1f930 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
1f940 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
1f950 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
1f960 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1f970 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f980 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f990 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1f9a0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1f9b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f9c0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f9d0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1f9e0 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  ee2);.      op =
1f9f0 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   (pExpr->op==TK_
1fa00 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b  IS) ? TK_NE : TK
1fa10 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  _EQ;.      codeC
1fa20 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1fa30 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
1fa40 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
1fa70 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
1fa80 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1fa90 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45  geIf(v, op==TK_E
1faa0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
1fab0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1fac0 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65  TK_NE);.      te
1fad0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1fae0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1faf0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1fb00 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1fb10 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1fb20 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
1fb30 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
1fb40 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
1fb50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1fb60 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1fb70 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1fb80 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
1fb90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1fba0 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
1fbb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1fbc0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20  p==TK_ISNULL ); 
1fbd0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1fbe0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
1fbf0 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
1fc00 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
1fc10 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LL );  VdbeCover
1fc20 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1fc30 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
1fc40 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1fc50 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
1fc60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1fc70 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
1fc80 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1fc90 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1fca0 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
1fcb0 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
1fcc0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 30  , pExpr, dest, 0
1fcd0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1fce0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fcf0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1fd00 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1fd10 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
1fd20 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49  .      if( jumpI
1fd30 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  fNull ){.       
1fd40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fd50 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
1fd60 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20  , dest, dest);. 
1fd70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fd80 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
1fd90 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
1fda0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1fdb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1fdc0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
1fdd0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
1fde0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
1fdf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1fe00 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1fe10 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
1fe20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1fe30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1fe40 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1fe50 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
1fe60 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
1fe70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1fe80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1fe90 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20  oto, 0, dest);. 
1fea0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
1feb0 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45  xprAlwaysTrue(pE
1fec0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
1fed0 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
1fee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fef0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1ff00 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ff10 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
1ff20 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e1);.        sql
1ff30 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1ff40 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20  , OP_IfNot, r1, 
1ff50 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1ff60 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  !=0);.        Vd
1ff70 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1ff80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ff90 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1ffa0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ffb0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1ffc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ffd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ffe0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
1fff0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
20000 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
20010 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
20020 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
20030 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Free2);.}../*.**
20040 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
20050 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
20060 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
20070 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  Return 0 if the 
20080 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
20090 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ns are completel
200a0 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65  y identical.  Re
200b0 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64  turn 1 if they d
200c0 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79  iffer only.** by
200d0 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
200e0 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c  tor at the top l
200f0 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20  evel.  Return 2 
20100 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  if there are dif
20110 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65  ferences.** othe
20120 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c  r than the top-l
20130 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65  evel COLLATE ope
20140 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
20150 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f  any subelement o
20160 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54  f pB has Expr.iT
20170 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20  able==(-1) then 
20180 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  it is allowed.**
20190 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61   to compare equa
201a0 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65  l to an equivale
201b0 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41  nt element in pA
201c0 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c   with Expr.iTabl
201d0 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54  e==iTab..**.** T
201e0 68 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74  he pA side might
201f0 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47   be using TK_REG
20200 49 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20  ISTER.  If that 
20210 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
20220 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69  pB is.** not usi
20230 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62  ng TK_REGISTER b
20240 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
20250 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e  equivalent, then
20260 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e   still return 0.
20270 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
20280 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
20290 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e  ll return 2 even
202a0 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
202b0 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c  essions.** reall
202c0 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  y are equivalent
202d0 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  .  If we cannot 
202e0 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65  prove that the e
202f0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
20300 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20  * identical, we 
20310 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f  return 2 just to
20320 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66   be safe.  So if
20330 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
20340 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e   returns 2, then
20350 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c   you do not real
20360 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74  ly know for cert
20370 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  ain if the two.*
20380 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
20390 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
203a0 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20   if you get a 0 
203b0 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65  or 1 return, the
203c0 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20  n you.** can be 
203d0 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73  sure the express
203e0 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
203f0 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65  e.  In the place
20400 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20  s where.** this 
20410 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c  routine is used,
20420 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72   it does not hur
20430 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72  t to get an extr
20440 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75  a 2 - that.** ju
20450 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  st might result 
20460 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79  in some slightly
20470 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42   slower code.  B
20480 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  ut returning.** 
20490 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f  an incorrect 0 o
204a0 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  r 1 could lead t
204b0 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e  o a malfunction.
204c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
204d0 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20  xprCompare(Expr 
204e0 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69  *pA, Expr *pB, i
204f0 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20  nt iTab){.  u32 
20500 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20  combinedFlags;. 
20510 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42   if( pA==0 || pB
20520 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
20530 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32  n pB==pA ? 0 : 2
20540 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64  ;.  }.  combined
20550 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67  Flags = pA->flag
20560 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20  s | pB->flags;. 
20570 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
20580 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
20590 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d   ){.    if( (pA-
205a0 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73  >flags&pB->flags
205b0 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30  &EP_IntValue)!=0
205c0 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65   && pA->u.iValue
205d0 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29  ==pB->u.iValue )
205e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
205f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
20600 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
20610 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29  pA->op!=pB->op )
20620 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
20630 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
20640 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
20650 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
20660 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20  , iTab)<2 ){.   
20670 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20680 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f   }.    if( pB->o
20690 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
206a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
206b0 61 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66  are(pA, pB->pLef
206c0 74 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20  t, iTab)<2 ){.  
206d0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
206e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
206f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
20700 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op!=TK_COLUMN &&
20710 20 41 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21 3d   ALWAYS(pA->op!=
20720 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26  TK_AGG_COLUMN) &
20730 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  & pA->u.zToken )
20740 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
20750 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42  (pA->u.zToken,pB
20760 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29  ->u.zToken)!=0 )
20770 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
20780 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  A->op==TK_COLLAT
20790 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d  E ? 1 : 2;.    }
207a0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e  .  }.  if( (pA->
207b0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
207c0 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73  nct)!=(pB->flags
207d0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20   & EP_Distinct) 
207e0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
207f0 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e  ( ALWAYS((combin
20800 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b  edFlags & EP_Tok
20810 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20  enOnly)==0) ){. 
20820 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46     if( combinedF
20830 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
20840 65 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ect ) return 2;.
20850 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
20860 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
20870 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  Left, pB->pLeft,
20880 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
20890 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
208a0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
208b0 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
208c0 69 67 68 74 2c 20 69 54 61 62 29 20 29 20 72 65  ight, iTab) ) re
208d0 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
208e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
208f0 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69  ompare(pA->x.pLi
20900 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c  st, pB->x.pList,
20910 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
20920 32 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  2;.    if( ALWAY
20930 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  S((combinedFlags
20940 20 26 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d   & EP_Reduced)==
20950 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  0) ){.      if( 
20960 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
20970 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
20980 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 2;.      if( p
20990 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
209a0 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26  Table .       &&
209b0 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54   (pA->iTable!=iT
209c0 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e  ab || NEVER(pB->
209d0 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65  iTable>=0)) ) re
209e0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
209f0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
20a00 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
20a10 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
20a20 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  cts.  Return 0 i
20a30 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
20a40 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e  ical and .** non
20a50 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69  -zero if they di
20a60 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
20a70 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
20a80 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
20a90 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
20aa0 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
20ab0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
20ac0 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
20ad0 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
20ae0 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
20af0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
20b00 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  b..**.** This ro
20b10 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75  utine might retu
20b20 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  rn non-zero for 
20b30 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c  equivalent ExprL
20b40 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e  ists.  The.** on
20b50 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77  ly consequence w
20b60 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20  ill be disabled 
20b70 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20  optimizations.  
20b80 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
20b90 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72  .** must never r
20ba0 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
20bb0 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
20bc0 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  cts are differen
20bd0 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75  t, or.** a malfu
20be0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  nction will resu
20bf0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  lt..**.** Two NU
20c00 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20  LL pointers are 
20c10 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
20c20 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
20c30 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a  a NULL pointer.*
20c40 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73  * always differs
20c50 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   from a non-NULL
20c60 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
20c70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
20c80 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74  Compare(ExprList
20c90 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a   *pA, ExprList *
20ca0 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  pB, int iTab){. 
20cb0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
20cc0 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72  ==0 && pB==0 ) r
20cd0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
20ce0 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20  A==0 || pB==0 ) 
20cf0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
20d00 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e  pA->nExpr!=pB->n
20d10 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b  Expr ) return 1;
20d20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
20d30 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
20d40 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20     Expr *pExprA 
20d50 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pA->a[i].pExpr
20d60 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  ;.    Expr *pExp
20d70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45  rB = pB->a[i].pE
20d80 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  xpr;.    if( pA-
20d90 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21  >a[i].sortOrder!
20da0 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  =pB->a[i].sortOr
20db0 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  der ) return 1;.
20dc0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
20dd0 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72  xprCompare(pExpr
20de0 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29  A, pExprB, iTab)
20df0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
20e00 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
20e10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
20e20 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76  e if we can prov
20e30 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61  e the pE2 will a
20e40 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66  lways be true if
20e50 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e   pE1 is.** true.
20e60 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
20e70 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70  f we cannot comp
20e80 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f  lete the proof o
20e90 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a  r if pE2 might.*
20ea0 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61  * be false.  Exa
20eb0 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
20ec0 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE1: x==5      
20ed0 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE2: x==5      
20ee0 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74         Result: t
20ef0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
20f00 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20  x>0        pE2: 
20f10 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
20f20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
20f30 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20  *     pE1: x=21 
20f40 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20        pE2: x=21 
20f50 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75  OR y=43     Resu
20f60 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
20f70 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20  pE1: x!=123     
20f80 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
20f90 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  LL    Result: tr
20fa0 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
20fb0 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78  !=?1      pE2: x
20fc0 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
20fd0 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
20fe0 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55      pE1: x IS NU
20ff0 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f  LL  pE2: x IS NO
21000 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
21010 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
21020 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70  E1: x IS ?2    p
21030 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
21040 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c  L    Reuslt: fal
21050 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  se.**.** When co
21060 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d  mparing TK_COLUM
21070 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20  N nodes between 
21080 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20  pE1 and pE2, if 
21090 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e  pE2 has.** Expr.
210a0 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73  iTable<0 then as
210b0 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d  sume a table num
210c0 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61  ber given by iTa
210d0 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e  b..**.** When in
210e0 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66   doubt, return f
210f0 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67  alse.  Returning
21100 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76 65   true might give
21110 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a   a performance.*
21120 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20  * improvement.  
21130 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20  Returning false 
21140 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70 65  might cause a pe
21150 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
21160 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77  ion, but.** it w
21170 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20  ill always give 
21180 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
21190 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20  er and is hence 
211a0 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a  always safe..*/.
211b0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
211c0 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70 72 20  mpliesExpr(Expr 
211d0 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c  *pE1, Expr *pE2,
211e0 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66   int iTab){.  if
211f0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
21200 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69  pare(pE1, pE2, i
21210 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Tab)==0 ){.    r
21220 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
21230 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f  f( pE2->op==TK_O
21240 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33  R.   && (sqlite3
21250 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
21260 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c  pE1, pE2->pLeft,
21270 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20   iTab).         
21280 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78      || sqlite3Ex
21290 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
212a0 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20  1, pE2->pRight, 
212b0 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20  iTab) ).  ){.   
212c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
212d0 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
212e0 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73  _NOTNULL.   && s
212f0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
21300 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45  e(pE1->pLeft, pE
21310 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d  2->pLeft, iTab)=
21320 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f  =0.   && (pE1->o
21330 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20  p!=TK_ISNULL && 
21340 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a  pE1->op!=TK_IS).
21350 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
21360 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
21370 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  0;.}../*.** An i
21380 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
21390 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
213a0 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
213b0 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
213c0 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65   to count refere
213d0 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f  nces to table co
213e0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67  lumns in the arg
213f0 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a  uments of an .**
21400 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
21410 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ion, in order to
21420 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
21430 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
21440 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69  nThisSrc() routi
21450 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72  ne..*/.struct Sr
21460 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69  cCount {.  SrcLi
21470 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f  st *pSrc;   /* O
21480 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52  ne particular FR
21490 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e  OM clause in a n
214a0 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20  ested query */. 
214b0 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20   int nThis;     
214c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
214d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
214e0 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74  umns in pSrcList
214f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72   */.  int nOther
21500 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
21510 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
21520 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68  o columns in oth
21530 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20  er FROM clauses 
21540 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  */.};../*.** Cou
21550 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
21560 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
21570 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
21580 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75  c int exprSrcCou
21590 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
215a0 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
215b0 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52  {.  /* The NEVER
215c0 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  () on the second
215d0 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65   term is because
215e0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
215f0 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20  UsesThisSrc().  
21600 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c  ** is always cal
21610 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74  led before sqlit
21620 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
21630 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f  regates() and so
21640 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c   the.  ** TK_COL
21650 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65  UMNs have not ye
21660 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  t been converted
21670 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
21680 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71  UMN.  If.  ** sq
21690 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
216a0 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73  sThisSrc() is us
216b0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69  ed differently i
216c0 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
216d0 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77  e.  ** NEVER() w
216e0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ill need to be r
216f0 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28  emoved. */.  if(
21700 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
21710 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70  OLUMN || NEVER(p
21720 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
21730 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20  _COLUMN) ){.    
21740 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
21750 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20  t SrcCount *p = 
21760 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43  pWalker->u.pSrcC
21770 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  ount;.    SrcLis
21780 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
21790 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  c;.    for(i=0; 
217a0 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
217b0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
217c0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
217d0 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
217e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
217f0 20 20 20 69 66 28 20 69 3c 70 53 72 63 2d 3e 6e     if( i<pSrc->n
21800 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Src ){.      p->
21810 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nThis++;.    }el
21820 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74  se{.      p->nOt
21830 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  her++;.    }.  }
21840 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
21850 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
21860 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
21870 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  y of the argumen
21880 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20  ts to the pExpr 
21890 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e  Function referen
218a0 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20  ce.** pSrcList. 
218b0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
218c0 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72  they do.  Also r
218d0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
218e0 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  e function.** ha
218f0 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f  s no arguments o
21900 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74  r has only const
21910 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
21920 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
21930 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e  pExpr.** referen
21940 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20  ces columns but 
21950 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  not columns of t
21960 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70  ables found in p
21970 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  SrcList..*/.int 
21980 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
21990 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20  sesThisSrc(Expr 
219a0 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20  *pExpr, SrcList 
219b0 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61  *pSrcList){.  Wa
219c0 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74  lker w;.  struct
219d0 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20   SrcCount cnt;. 
219e0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
219f0 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
21a00 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ION );.  memset(
21a10 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
21a20 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
21a30 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f  back = exprSrcCo
21a40 75 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43  unt;.  w.u.pSrcC
21a50 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63  ount = &cnt;.  c
21a60 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69  nt.pSrc = pSrcLi
21a70 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20  st;.  cnt.nThis 
21a80 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65  = 0;.  cnt.nOthe
21a90 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  r = 0;.  sqlite3
21aa0 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c  WalkExprList(&w,
21ab0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
21ac0 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e  ;.  return cnt.n
21ad0 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f  This>0 || cnt.nO
21ae0 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ther==0;.}../*.*
21af0 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
21b00 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
21b10 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61  nfo->aCol[] arra
21b20 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
21b30 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
21b40 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
21b50 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
21b60 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
21b70 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
21b80 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43   int addAggInfoC
21b90 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64  olumn(sqlite3 *d
21ba0 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
21bb0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
21bc0 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c  Info->aCol = sql
21bd0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
21be0 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20  e(.       db,.  
21bf0 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
21c00 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
21c10 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c  pInfo->aCol[0]),
21c20 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
21c30 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  nColumn,.       
21c40 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
21c50 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
21c60 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
21c70 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
21c80 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61  fo->aFunc[] arra
21c90 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
21ca0 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
21cb0 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
21cc0 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
21cd0 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
21ce0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
21cf0 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46   int addAggInfoF
21d00 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  unc(sqlite3 *db,
21d10 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
21d20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
21d30 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69  fo->aFunc = sqli
21d40 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
21d50 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20  (.       db, .  
21d60 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e       pInfo->aFun
21d70 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  c,.       sizeof
21d80 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  (pInfo->aFunc[0]
21d90 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
21da0 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->nFunc,.       
21db0 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
21dc0 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
21dd0 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78   This is the xEx
21de0 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  prCallback for a
21df0 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49   tree walker.  I
21e00 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20  t is used to.** 
21e10 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65  implement sqlite
21e20 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
21e30 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
21e40 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
21e50 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
21e60 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
21e70 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
21e80 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
21e90 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72  Aggregate(Walker
21ea0 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
21eb0 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
21ec0 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
21ed0 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  *pNC = pWalker->
21ee0 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a  u.pNC;.  Parse *
21ef0 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
21f00 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20  arse;.  SrcList 
21f10 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
21f20 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67  >pSrcList;.  Agg
21f30 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
21f40 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a   pNC->pAggInfo;.
21f50 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
21f60 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
21f70 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
21f80 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
21f90 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  MN: {.      test
21fa0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
21fb0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
21fc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21fd0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
21fe0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
21ff0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
22000 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  if the column is
22010 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
22020 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
22030 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  M.      ** claus
22040 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
22050 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  te query */.    
22060 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72    if( ALWAYS(pSr
22070 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  cList!=0) ){.   
22080 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
22090 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
220a0 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20  = pSrcList->a;. 
220b0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
220c0 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
220d0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
220e0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
220f0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
22100 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61  Col;.          a
22110 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
22120 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
22130 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
22140 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
22150 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
22160 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
22170 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
22180 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
22190 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
221a0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70   it means that p
221b0 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61  Expr refers to a
221c0 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
221d0 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e     ** that is in
221e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
221f0 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
22200 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20  e query.  .     
22210 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
22220 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e        ** Make an
22230 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63   entry for the c
22240 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66  olumn in pAggInf
22250 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65  o->aCol[] if the
22260 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
22270 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72  * is not an entr
22280 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  y there already.
22290 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
222a0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
222b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  k;.            p
222c0 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  Col = pAggInfo->
222d0 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  aCol;.          
222e0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67    for(k=0; k<pAg
222f0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
22300 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  k++, pCol++){.  
22310 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22320 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  pCol->iTable==pE
22330 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22350 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   pCol->iColumn==
22360 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
22370 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22380 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
22390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
223a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
223b0 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49     if( (k>=pAggI
223c0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20  nfo->nColumn).  
223d0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b             && (k
223e0 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c   = addAggInfoCol
223f0 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  umn(pParse->db, 
22400 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20  pAggInfo))>=0 . 
22410 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
22420 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
22430 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
22440 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[k];.         
22450 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20       pCol->pTab 
22460 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
22470 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22480 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70  l->iTable = pExp
22490 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
224a0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
224b0 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
224c0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
224d0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65         pCol->iMe
224e0 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
224f0 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
22500 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
22510 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
22520 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
22530 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
22540 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
22550 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
22560 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBy ){.         
22570 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b         int j, n;
22580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22590 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d   ExprList *pGB =
225a0 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
225b0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBy;.           
225c0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
225d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d  List_item *pTerm
225e0 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20   = pGB->a;.     
225f0 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70             n = p
22600 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  GB->nExpr;.     
22610 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
22620 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54  =0; j<n; j++, pT
22630 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
22640 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
22650 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
22660 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
22670 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
22680 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
22690 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
226a0 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
226b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226c0 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45   pE->iColumn==pE
226d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
22700 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  rColumn = j;.   
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22720 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22730 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22740 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22750 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22760 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22770 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
22780 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
22790 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
227a0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70  SorterColumn = p
227b0 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e  AggInfo->nSortin
227c0 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  gColumn++;.     
227d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
227e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
227f0 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
22800 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f   now an entry fo
22810 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49  r pExpr in pAggI
22820 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74  nfo->aCol[] (eit
22830 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  her.            
22840 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61  ** because it wa
22850 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f  s there before o
22860 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  r because we jus
22870 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20  t created it).. 
22880 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f             ** Co
22890 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20  nvert the pExpr 
228a0 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43  to be a TK_AGG_C
228b0 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20  OLUMN referring 
228c0 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  to that.        
228d0 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d      ** pAggInfo-
228e0 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20  >aCol[] entry.. 
228f0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
22900 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
22910 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
22920 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
22930 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
22940 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
22950 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
22960 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
22970 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b  = TK_AGG_COLUMN;
22980 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
22990 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
229a0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  k;.            b
229b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
229c0 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72  } /* endif pExpr
229d0 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
229e0 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20  >iCursor */.    
229f0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f      } /* end loo
22a00 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  p over pSrcList 
22a10 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
22a20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
22a30 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  e;.    }.    cas
22a40 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
22a50 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28  N: {.      if( (
22a60 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
22a70 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a  C_InAggFunc)==0.
22a80 20 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65         && pWalke
22a90 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d  r->walkerDepth==
22aa0 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20  pExpr->op2.     
22ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
22ac0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
22ad0 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63  Expr is a duplic
22ae0 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61  ate of another a
22af0 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20  ggregate .      
22b00 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68    ** function th
22b10 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  at is already in
22b20 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74   the pAggInfo st
22b30 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20  ructure.        
22b40 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  */.        struc
22b50 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
22b60 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f  pItem = pAggInfo
22b70 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  ->aFunc;.       
22b80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
22b90 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
22ba0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
22bb0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
22bc0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74  3ExprCompare(pIt
22bd0 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72  em->pExpr, pExpr
22be0 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , -1)==0 ){.    
22bf0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22c00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22c10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
22c20 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46   i>=pAggInfo->nF
22c30 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unc ){.         
22c40 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69   /* pExpr is ori
22c50 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e  ginal.  Make a n
22c60 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67  ew entry in pAgg
22c70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20  Info->aFunc[].  
22c80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
22c90 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
22ca0 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  C(pParse->db);. 
22cb0 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64           i = add
22cc0 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72  AggInfoFunc(pPar
22cd0 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
22ce0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
22cf0 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   i>=0 ){.       
22d00 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
22d10 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
22d20 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
22d30 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t) );.          
22d40 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49    pItem = &pAggI
22d50 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20  nfo->aFunc[i];. 
22d60 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
22d70 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
22d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
22d90 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  em->iMem = ++pPa
22da0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
22db0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
22dc0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22dd0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
22de0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ue) );.         
22df0 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20     pItem->pFunc 
22e00 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
22e10 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
22e20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22e30 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54       pExpr->u.zT
22e40 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53 74 72  oken, sqlite3Str
22e50 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a  len30(pExpr->u.z
22e60 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20 20  Token),.        
22e70 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
22e80 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70  ->x.pList ? pExp
22e90 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
22ea0 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a  r : 0, enc, 0);.
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22ec0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
22ed0 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  P_Distinct ){.  
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
22ef0 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70  m->iDistinct = p
22f00 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
22f10 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
22f20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22f30 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
22f40 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
22f50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
22f60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22f70 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72     /* Make pExpr
22f80 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70   point to the ap
22f90 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e  propriate pAggIn
22fa0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72  fo->aFunc[] entr
22fb0 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  y.        */.   
22fc0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
22fd0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
22fe0 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
22ff0 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
23000 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74  .        ExprSet
23010 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
23020 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
23030 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
23040 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20  iAgg = (i16)i;. 
23050 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
23060 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
23070 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
23080 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
23090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
230a0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
230b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
230c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
230d0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
230e0 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  }.static int ana
230f0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
23100 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70  Select(Walker *p
23110 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
23120 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53  pSelect){.  UNUS
23130 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61  ED_PARAMETER(pWa
23140 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f  lker);.  UNUSED_
23150 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63  PARAMETER(pSelec
23160 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  t);.  return WRC
23170 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
23180 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
23190 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
231a0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
231b0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
231c0 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
231d0 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
231e0 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41  to be added to A
231f0 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  ggInfo object th
23200 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f  at pNC->pAggInfo
23210 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  .** points to.  
23220 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  Additional entri
23230 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74  es are made on t
23240 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  he AggInfo objec
23250 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72  t as.** necessar
23260 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
23270 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
23280 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
23290 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
232a0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
232b0 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
232c0 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
232d0 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
232e0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
232f0 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
23300 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
23310 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
23320 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
23330 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
23340 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
23350 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
23360 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65  egate;.  w.xSele
23370 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  ctCallback = ana
23380 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
23390 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e  Select;.  w.u.pN
233a0 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72  C = pNC;.  asser
233b0 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  t( pNC->pSrcList
233c0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
233d0 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
233e0 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  pr);.}../*.** Ca
233f0 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ll sqlite3ExprAn
23400 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
23410 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72  ) for every expr
23420 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20  ession in an.** 
23430 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
23440 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
23450 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
23460 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
23470 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61   is found, the a
23480 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73  nalysis is cut s
23490 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hort..*/.void sq
234a0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
234b0 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74  AggList(NameCont
234c0 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69  ext *pNC, ExprLi
234d0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74  st *pList){.  st
234e0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
234f0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
23500 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   i;.  if( pList 
23510 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d  ){.    for(pItem
23520 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
23530 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
23540 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
23550 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23560 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
23570 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45  s(pNC, pItem->pE
23580 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
23590 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
235a0 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72  e a single new r
235b0 65 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20  egister for use 
235c0 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74  to hold some int
235d0 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
235e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
235f0 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65  GetTempReg(Parse
23600 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
23610 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
23620 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  g==0 ){.    retu
23630 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65  rn ++pParse->nMe
23640 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  m;.  }.  return 
23650 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
23660 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  [--pParse->nTemp
23670 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Reg];.}../*.** D
23680 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69  eallocate a regi
23690 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61  ster, making ava
236a0 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
236b0 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a   for some other.
236c0 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a  ** purpose..**.*
236d0 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
236e0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  is currently bei
236f0 6e 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ng used by the c
23700 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65  olumn cache, the
23710 6e 0a 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61  n.** the dalloca
23720 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64  tion is deferred
23730 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d   until the colum
23740 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61  n cache line tha
23750 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65  t uses.** the re
23760 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73  gister becomes s
23770 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tale..*/.void sq
23780 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
23790 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
237a0 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
237b0 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72  if( iReg && pPar
237c0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
237d0 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
237e0 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
237f0 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
23800 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
23810 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70      for(i=0, p=p
23820 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
23830 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
23840 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
23850 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  {.      if( p->i
23860 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
23870 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
23880 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
23890 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
238a0 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61   }.    pParse->a
238b0 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
238c0 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52  nTempReg++] = iR
238d0 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
238e0 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61   Allocate or dea
238f0 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20  llocate a block 
23900 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74  of nReg consecut
23910 69 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f  ive registers.*/
23920 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
23930 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
23940 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67  pParse, int nReg
23950 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
23960 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61   i = pParse->iRa
23970 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50  ngeReg;.  n = pP
23980 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b  arse->nRangeReg;
23990 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29  .  if( nReg<=n )
239a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 75  {.    assert( !u
239b0 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
239c0 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d  (pParse, i, i+n-
239d0 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  1) );.    pParse
239e0 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e  ->iRangeReg += n
239f0 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
23a00 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52  >nRangeReg -= nR
23a10 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eg;.  }else{.   
23a20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65   i = pParse->nMe
23a30 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
23a40 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20  >nMem += nReg;. 
23a50 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
23a60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
23a70 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61  easeTempRange(Pa
23a80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
23a90 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
23aa0 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
23ab0 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
23ac0 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a  e, iReg, nReg);.
23ad0 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73    if( nReg>pPars
23ae0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a  e->nRangeReg ){.
23af0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
23b00 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20  geReg = nReg;.  
23b10 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
23b20 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  Reg = iReg;.  }.
23b30 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c  }../*.** Mark al
23b40 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  l temporary regi
23b50 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75  sters as being u
23b60 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72  navailable for r
23b70 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  euse..*/.void sq
23b80 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
23b90 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  gCache(Parse *pP
23ba0 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
23bb0 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  >nTempReg = 0;. 
23bc0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
23bd0 65 67 20 3d 20 30 3b 0a 7d 0a                    eg = 0;.}.