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

Artifact 44714c8f0e553de54e9648815ef940b20eb6fb4b:


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 29 3b 0a 20 20 7d  ->u.zToken);.  }
05c0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f  .#endif.  if( (o
05d0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
05e0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   || op==TK_COLUM
05f0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49  N || op==TK_REGI
0600: 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45 78  STER) .   && pEx
0610: 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b  pr->pTab!=0.  ){
0620: 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52  .    /* op==TK_R
0630: 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72  EGISTER && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
0650: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
0660: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
0670: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0680: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0690: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
06a0: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
06b0: 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ster */.    int 
06c0: 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  j = pExpr->iColu
06d0: 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20  mn;.    if( j<0 
06e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
06f0: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
0700: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0710: 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d  pTab && j<pExpr-
0720: 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  >pTab->nCol );. 
0730: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
0740: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61  >pTab->aCol[j].a
0750: 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72  ffinity;.  }.  r
0760: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66  eturn pExpr->aff
0770: 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inity;.}../*.** 
0780: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  Set the collatin
0790: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
07a0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
07b0: 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74  to be the collat
07c0: 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
07d0: 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e  named by pToken.
07e0: 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e     Return a poin
07f0: 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70  ter to a new Exp
0800: 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69  r node that.** i
0810: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f  mplements the CO
0820: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a  LLATE operator..
0830: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
0840: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
0850: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20  or occurs, that 
0860: 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65 64  fact is recorded
0870: 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a   in pParse->db.*
0880: 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72 20  * and the pExpr 
0890: 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65 74  parameter is ret
08a0: 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e  urned unchanged.
08b0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
08c0: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
08d0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
08e0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
08f0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
0900: 65 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e  e){.  if( pCollN
0910: 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  ame->n>0 ){.    
0920: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
0930: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
0940: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c  arse->db, TK_COL
0950: 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c  LATE, pCollName,
0960: 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65   1);.    if( pNe
0970: 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  w ){.      pNew-
0980: 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a  >pLeft = pExpr;.
0990: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
09a0: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b  s |= EP_Collate;
09b0: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
09c0: 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  New;.    }.  }. 
09d0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
09e0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
09f0: 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
0a00: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
0a10: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  , Expr *pExpr, c
0a20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a  onst char *zC){.
0a30: 20 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73    Token s;.  ass
0a40: 65 72 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20  ert( zC!=0 );.  
0a50: 73 2e 7a 20 3d 20 7a 43 3b 0a 20 20 73 2e 6e 20  s.z = zC;.  s.n 
0a60: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
0a70: 30 28 73 2e 7a 29 3b 0a 20 20 72 65 74 75 72 6e  0(s.z);.  return
0a80: 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
0a90: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72  ollateToken(pPar
0aa0: 73 65 2c 20 70 45 78 70 72 2c 20 26 73 29 3b 0a  se, pExpr, &s);.
0ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20 6f 76  }../*.** Skip ov
0ac0: 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c 41 54  er any TK_COLLAT
0ad0: 45 20 61 6e 64 2f 6f 72 20 54 4b 5f 41 53 20 6f  E and/or TK_AS o
0ae0: 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20  perators at the 
0af0: 72 6f 6f 74 20 6f 66 0a 2a 2a 20 61 6e 20 65 78  root of.** an ex
0b00: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70  pression..*/.Exp
0b10: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53 6b  r *sqlite3ExprSk
0b20: 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20 2a  ipCollate(Expr *
0b30: 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65 28  pExpr){.  while(
0b40: 20 70 45 78 70 72 20 26 26 20 28 70 45 78 70 72   pExpr && (pExpr
0b50: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0b60: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0b70: 4b 5f 41 53 29 20 29 7b 0a 20 20 20 20 70 45 78  K_AS) ){.    pEx
0b80: 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pr = pExpr->pLef
0b90: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
0ba0: 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pExpr;.}../*.** 
0bb0: 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 6c 61  Return the colla
0bc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
0bd0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
0be0: 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a 20 74 68   pExpr. If.** th
0bf0: 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65  ere is no define
0c00: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
0c10: 65 6e 63 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ence, return NUL
0c20: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  L..**.** The col
0c30: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
0c40: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
0c50: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
0c60: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
0c70: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
0c80: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
0c90: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
0ca0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
0cb0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
0cc0: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
0cd0: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
0ce0: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
0cf0: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
0d00: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
0d10: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
0d20: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
0d30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0d40: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
0d50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0d60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
0d70: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
0d80: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
0d90: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
0da0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
0db0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  >op;.    if( op=
0dc0: 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d  =TK_CAST || op==
0dd0: 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20  TK_UPLUS ){.    
0de0: 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a    p = p->pLeft;.
0df0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
0e00: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
0e10: 28 20 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ( op!=TK_REGISTE
0e20: 52 20 7c 7c 20 70 2d 3e 6f 70 32 21 3d 54 4b 5f  R || p->op2!=TK_
0e30: 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 69  COLLATE );.    i
0e40: 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  f( op==TK_COLLAT
0e50: 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  E ){.      if( d
0e60: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
0e70: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
0e80: 74 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20  t report errors 
0e90: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 77 68 69  when parsing whi
0ea0: 6c 65 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f  le the schema */
0eb0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
0ec0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
0ed0: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
0ee0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29   p->u.zToken, 0)
0ef0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
0f00: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
0f10: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
0f20: 28 70 50 61 72 73 65 2c 20 45 4e 43 28 64 62 29  (pParse, ENC(db)
0f30: 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  , 0, p->u.zToken
0f40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
0f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0f60: 20 20 69 66 28 20 70 2d 3e 70 54 61 62 21 3d 30    if( p->pTab!=0
0f70: 0a 20 20 20 20 20 26 26 20 28 6f 70 3d 3d 54 4b  .     && (op==TK
0f80: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  _AGG_COLUMN || o
0f90: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
0fa0: 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b         || op==TK
0fb0: 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d  _REGISTER || op=
0fc0: 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20 20 20  =TK_TRIGGER).   
0fd0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d   ){.      /* op=
0fe0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
0ff0: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
1000: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
1010: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
1020: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1030: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1040: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1050: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1060: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1070: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1080: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1090: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
10a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
10b0: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
10c0: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
10d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
10e0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
10f0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
1100: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1120: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
1130: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
1140: 7b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  {.      if( ALWA
1150: 59 53 28 70 2d 3e 70 4c 65 66 74 29 20 26 26 20  YS(p->pLeft) && 
1160: 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  (p->pLeft->flags
1170: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d   & EP_Collate)!=
1180: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20 3d  0 ){.        p =
1190: 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20   p->pLeft;.     
11a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11b0: 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20  p = p->pRight;. 
11c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
11d0: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
11e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
11f0: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
1200: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
1210: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
1220: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1230: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
1240: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
1250: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
1260: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
1270: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
1280: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
1290: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
12a0: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
12b0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
12c0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
12d0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
12e0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
12f0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
1300: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
1310: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
1320: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1330: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
1340: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
1350: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
1360: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
1370: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
1380: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
1390: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
13a0: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
13b0: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
13c0: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
13d0: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
13e0: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
13f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1400: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1410: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
1420: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
1430: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1440: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1450: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1460: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1470: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1480: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1490: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
14a0: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
14b0: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
14c0: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
14d0: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
14e0: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
14f0: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1500: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
1510: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1520: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1540: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
1550: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
1560: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1570: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1580: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1590: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
15a0: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
15b0: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
15c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
15d0: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
15e0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
15f0: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
1600: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1610: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
1620: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
1630: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
1640: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
1650: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1660: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1670: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1680: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
1690: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
16a0: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
16b0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
16c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
16d0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
16e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
16f0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
1700: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
1710: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
1720: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
1730: 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _NE || pExpr->op
1740: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
1750: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
1760: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1770: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
1780: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
1790: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
17a0: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
17b0: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
17c0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
17d0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
17e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
17f0: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
1800: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1810: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1820: 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66 66 20  ect) ){.    aff 
1830: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
1840: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
1850: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
1860: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
1870: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
1880: 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61 66 66   !aff ){.    aff
1890: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
18a0: 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  NE;.  }.  return
18b0: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70   aff;.}../*.** p
18c0: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
18d0: 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  ison expression,
18e0: 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49   eg. '=', '<', I
18f0: 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69  N(...) etc..** i
1900: 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74  dx_affinity is t
1910: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61  he affinity of a
1920: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
1930: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a  . Return true.**
1940: 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69   if the index wi
1950: 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f  th affinity idx_
1960: 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20  affinity may be 
1970: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1980: 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  t.** the compari
1990: 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f  son in pExpr..*/
19a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
19b0: 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72  xAffinityOk(Expr
19c0: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64   *pExpr, char id
19d0: 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63  x_affinity){.  c
19e0: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
19f0: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
1a00: 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61  pr);.  switch( a
1a10: 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ff ){.    case S
1a20: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a  QLITE_AFF_NONE:.
1a30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1a40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a50: 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
1a60: 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e  return idx_affin
1a70: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
1a80: 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75 6c  TEXT;.    defaul
1a90: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
1aa0: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
1ab0: 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66  Affinity(idx_aff
1ac0: 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  inity);.  }.}../
1ad0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1ae0: 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73 68  P5 value that sh
1af0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
1b00: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
1b10: 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28  ison.** opcode (
1b20: 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63  OP_Eq, OP_Ge etc
1b30: 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  .) used to compa
1b40: 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70 45  re pExpr1 and pE
1b50: 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xpr2..*/.static 
1b60: 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65  u8 binaryCompare
1b70: 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c  P5(Expr *pExpr1,
1b80: 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69   Expr *pExpr2, i
1b90: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
1ba0: 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61 72    u8 aff = (char
1bb0: 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69  )sqlite3ExprAffi
1bc0: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
1bd0: 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69 74 65  aff = (u8)sqlite
1be0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1bf0: 28 70 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20  (pExpr1, aff) | 
1c00: 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a  (u8)jumpIfNull;.
1c10: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
1c20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1c30: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
1c40: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1c50: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
1c60: 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69   used by.** a bi
1c70: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  nary comparison 
1c80: 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69  operator compari
1c90: 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  ng pLeft and pRi
1ca0: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ght..**.** If th
1cb0: 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72  e left hand expr
1cc0: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
1cd0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1ce0: 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73  type, then it is
1cf0: 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77  .** used. Otherw
1d00: 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ise the collatio
1d10: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
1d20: 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 65 78  he right hand ex
1d30: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75  pression.** is u
1d40: 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61  sed, or the defa
1d50: 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66 20  ult (BINARY) if 
1d60: 6e 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69  neither expressi
1d70: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
1d80: 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a  ng.** type..**.*
1d90: 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69 67 68  * Argument pRigh
1da0: 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65 66 74  t (but not pLeft
1db0: 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c 20  ) may be a null 
1dc0: 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68 69 73  pointer. In this
1dd0: 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20   case,.** it is 
1de0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  not considered..
1df0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
1e00: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
1e10: 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65  CollSeq(.  Parse
1e20: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70   *pParse, .  Exp
1e30: 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70  r *pLeft, .  Exp
1e40: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43  r *pRight.){.  C
1e50: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
1e60: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
1e70: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66  ;.  if( pLeft->f
1e80: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1e90: 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  e ){.    pColl =
1ea0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1eb0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
1ec0: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
1ed0: 70 52 69 67 68 74 20 26 26 20 28 70 52 69 67 68  pRight && (pRigh
1ee0: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1ef0: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
1f00: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1f10: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1f20: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  se, pRight);.  }
1f30: 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  else{.    pColl 
1f40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1f50: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
1f60: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  ft);.    if( !pC
1f70: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
1f80: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1f90: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1fa0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
1fb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
1fc0: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  l;.}../*.** Gene
1fd0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1fe0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1ff0: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
2000: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
2010: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2020: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
2030: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
2040: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
2050: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2060: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
2070: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2080: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2090: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
20a0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
20b0: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
20c0: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
20d0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
20e0: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
20f0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
2100: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
2110: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
2120: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
2130: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
2140: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
2150: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
2160: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
2170: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
2180: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
2190: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
21a0: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
21b0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
21c0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
21d0: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
21e0: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
21f0: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
2200: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
2210: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
2220: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2230: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2240: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
2250: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
2280: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
2290: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
22a0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
22b0: 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74 75 72  (u8)p5);.  retur
22c0: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66 20 53  n addr;.}..#if S
22d0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
22e0: 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65  EPTH>0./*.** Che
22f0: 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  ck that argument
2300: 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73   nHeight is less
2310: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
2320: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a  o the maximum.**
2330: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
2340: 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74  h allowed. If it
2350: 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61   is not, leave a
2360: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2370: 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f  in.** pParse..*/
2380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2390: 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73  CheckHeight(Pars
23a0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
23b0: 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72  Height){.  int r
23c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23d0: 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20   int mxHeight = 
23e0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
23f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
2400: 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69  EXPR_DEPTH];.  i
2410: 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69  f( nHeight>mxHei
2420: 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
2430: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2440: 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72  e, .       "Expr
2450: 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74  ession tree is t
2460: 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75  oo large (maximu
2470: 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78  m depth %d)", mx
2480: 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20  Height.    );.  
2490: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
24a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
24b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  n rc;.}../* The 
24c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
24d0: 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68  functions, heigh
24e0: 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68  tOfExpr(), heigh
24f0: 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  tOfExprList().**
2500: 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c   and heightOfSel
2510: 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20  ect(), are used 
2520: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2530: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a   maximum height.
2540: 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ** of any expres
2550: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
2560: 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75  nced by the stru
2570: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
2580: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
2590: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
25a0: 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69  this maximum hei
25b0: 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ght is greater t
25c0: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
25d0: 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a  value pointed.**
25e0: 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c   to by pnHeight,
25f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
2600: 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20  meter, then set 
2610: 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61  *pnHeight to tha
2620: 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  t.** value..*/.s
2630: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
2640: 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c  tOfExpr(Expr *p,
2650: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
2660: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
2670: 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a  if( p->nHeight>*
2680: 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  pnHeight ){.    
2690: 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d    *pnHeight = p-
26a0: 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a  >nHeight;.    }.
26b0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
26c0: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  d heightOfExprLi
26d0: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
26e0: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
26f0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
2700: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
2710: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
2720: 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68  ++){.      heigh
2730: 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e  tOfExpr(p->a[i].
2740: 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29  pExpr, pnHeight)
2750: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
2760: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
2770: 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  OfSelect(Select 
2780: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
2790: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
27a0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
27b0: 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69  p->pWhere, pnHei
27c0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
27d0: 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  OfExpr(p->pHavin
27e0: 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  g, pnHeight);.  
27f0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2800: 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67  ->pLimit, pnHeig
2810: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2820: 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74  fExpr(p->pOffset
2830: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2840: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2850: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48  t(p->pEList, pnH
2860: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
2870: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
2880: 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67  pGroupBy, pnHeig
2890: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
28a0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  fExprList(p->pOr
28b0: 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29  derBy, pnHeight)
28c0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65  ;.    heightOfSe
28d0: 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20  lect(p->pPrior, 
28e0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
28f0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2900: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
2910: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
2920: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
2930: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
2940: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
2950: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
2960: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
2970: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
2980: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
2990: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
29a0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
29b0: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
29c0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
29d0: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
29e0: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
29f0: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
2a00: 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  s one..*/.static
2a10: 20 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69   void exprSetHei
2a20: 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ght(Expr *p){.  
2a30: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
2a40: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
2a50: 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67  p->pLeft, &nHeig
2a60: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  ht);.  heightOfE
2a70: 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26  xpr(p->pRight, &
2a80: 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20  nHeight);.  if( 
2a90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2aa0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
2ab0: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
2ac0: 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c  Select(p->x.pSel
2ad0: 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ect, &nHeight);.
2ae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 65 69    }else{.    hei
2af0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
2b00: 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67  >x.pList, &nHeig
2b10: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48  ht);.  }.  p->nH
2b20: 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20  eight = nHeight 
2b30: 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  + 1;.}../*.** Se
2b40: 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67  t the Expr.nHeig
2b50: 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e  ht variable usin
2b60: 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69  g the exprSetHei
2b70: 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ght() function. 
2b80: 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74  If.** the height
2b90: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2ba0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   the maximum all
2bb0: 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  owed expression 
2bc0: 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20  depth,.** leave 
2bd0: 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
2be0: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
2bf0: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
2c00: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2c10: 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78 70 72  Expr *p){.  expr
2c20: 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20  SetHeight(p);.  
2c30: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
2c40: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
2c50: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f  ->nHeight);.}../
2c60: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2c70: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
2c80: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
2c90: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
2ca0: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
2cb0: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
2cc0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
2cd0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2ce0: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
2cf0: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
2d00: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
2d10: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
2d20: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
2d30: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
2d40: 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66  ;.}.#else.  #def
2d50: 69 6e 65 20 65 78 70 72 53 65 74 48 65 69 67 68  ine exprSetHeigh
2d60: 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t(y).#endif /* S
2d70: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
2d80: 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  EPTH>0 */../*.**
2d90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2da0: 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61   the core alloca
2db0: 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e 6f 64  tor for Expr nod
2dc0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72  es..**.** Constr
2dd0: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
2de0: 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65  sion node and re
2df0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
2e00: 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a  o it.  Memory.**
2e10: 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 61   for this node a
2e20: 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f 6b 65  nd for the pToke
2e30: 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  n argument is a 
2e40: 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
2e50: 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  n.** obtained fr
2e60: 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
2e70: 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
2e80: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
2e90: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2ea0: 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  r making sure th
2eb0: 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c  e node eventuall
2ec0: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a  y gets freed..**
2ed0: 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69  .** If dequote i
2ee0: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
2ef0: 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20 65 78   token (if it ex
2f00: 69 73 74 73 29 20 69 73 20 64 65 71 75 6f 74 65  ists) is dequote
2f10: 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  d..** If dequote
2f20: 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65   is false, no de
2f30: 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72 66 6f  quoting is perfo
2f40: 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64 65 51  rmance.  The deQ
2f50: 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uote.** paramete
2f60: 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  r is ignored if 
2f70: 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f  pToken is NULL o
2f80: 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20 64  r if the token d
2f90: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61  oes not.** appea
2fa0: 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  r to be quoted. 
2fb0: 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20 77   If the quotes w
2fc0: 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ere of the form 
2fd0: 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75  "..." (double-qu
2fe0: 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68  otes).** then th
2ff0: 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20 66  e EP_DblQuoted f
3000: 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
3010: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  e expression nod
3020: 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c  e..**.** Special
3030: 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54   case:  If op==T
3040: 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70 54  K_INTEGER and pT
3050: 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61  oken points to a
3060: 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20   string that.** 
3070: 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74 65  can be translate
3080: 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74 20  d into a 32-bit 
3090: 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68  integer, then th
30a0: 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a  e token is not.*
30b0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54  * stored in u.zT
30c0: 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20  oken.  Instead, 
30d0: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
30e0: 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  es is written.**
30f0: 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20 61   into u.iValue a
3100: 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  nd the EP_IntVal
3110: 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ue flag is set. 
3120: 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61 67   No extra storag
3130: 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65  e.** is allocate
3140: 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e  d to hold the in
3150: 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20 74  teger text and t
3160: 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67 20  he dequote flag 
3170: 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45  is ignored..*/.E
3180: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
3190: 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65 33  Alloc(.  sqlite3
31a0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
31b0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73   /* Handle for s
31c0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
31d0: 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c  ro() (may be nul
31e0: 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  l) */.  int op, 
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
3210: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
3220: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20  Token *pToken,  
3230: 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d    /* Token argum
3240: 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e  ent.  Might be N
3250: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  ULL */.  int deq
3260: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
3270: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75   /* True to dequ
3280: 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ote */.){.  Expr
3290: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45   *pNew;.  int nE
32a0: 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20  xtra = 0;.  int 
32b0: 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 69  iValue = 0;..  i
32c0: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
32d0: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45   if( op!=TK_INTE
32e0: 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a  GER || pToken->z
32f0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
3300: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
3310: 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61  (pToken->z, &iVa
3320: 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lue)==0 ){.     
3330: 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e   nExtra = pToken
3340: 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  ->n+1;.      ass
3350: 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29  ert( iValue>=0 )
3360: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
3370: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
3380: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
3390: 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61  eof(Expr)+nExtra
33a0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
33b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  .    pNew->op = 
33c0: 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77  (u8)op;.    pNew
33d0: 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20  ->iAgg = -1;.   
33e0: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
33f0: 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d       if( nExtra=
3400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  =0 ){.        pN
3410: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
3420: 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  IntValue;.      
3430: 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
3440: 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20   = iValue;.     
3450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3460: 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 70  int c;.        p
3470: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
3480: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
3490: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34a0: 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c   pToken->z!=0 ||
34b0: 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b   pToken->n==0 );
34c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f  .        if( pTo
34d0: 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28  ken->n ) memcpy(
34e0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  pNew->u.zToken, 
34f0: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
3500: 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  n->n);.        p
3510: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54  New->u.zToken[pT
3520: 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  oken->n] = 0;.  
3530: 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74        if( dequot
3540: 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33 20 0a  e && nExtra>=3 .
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
3560: 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  ((c = pToken->z[
3570: 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d  0])=='\'' || c==
3580: 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c  '"' || c=='[' ||
3590: 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20 20 20   c=='`') ){.    
35a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
35b0: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
35c0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ken);.          
35d0: 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70 4e 65  if( c=='"' ) pNe
35e0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44  w->flags |= EP_D
35f0: 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20  blQuoted;.      
3600: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3610: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
3620: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
3630: 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20    pNew->nHeight 
3640: 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20  = 1;.#endif  .  
3650: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
3660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
3670: 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  te a new express
3680: 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20  ion node from a 
3690: 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20  zero-terminated 
36a0: 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a  token that has.*
36b0: 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64  * already been d
36c0: 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72  equoted..*/.Expr
36d0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20   *sqlite3Expr(. 
36e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
36f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
3700: 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62  le for sqlite3Db
3710: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61  MallocZero() (ma
3720: 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20  y be null) */.  
3730: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
3740: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
3750: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
3760: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
3770: 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b  oken      /* Tok
3780: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69  en argument.  Mi
3790: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
37a0: 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78  {.  Token x;.  x
37b0: 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78  .z = zToken;.  x
37c0: 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71  .n = zToken ? sq
37d0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
37e0: 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74  oken) : 0;.  ret
37f0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
3800: 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c  lloc(db, op, &x,
3810: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   0);.}../*.** At
3820: 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c  tach subtrees pL
3830: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74  eft and pRight t
3840: 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20  o the Expr node 
3850: 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pRoot..**.** If 
3860: 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74  pRoot==NULL that
3870: 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65   means that a me
3880: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3890: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
38a0: 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  ed..** In that c
38b0: 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ase, delete the 
38c0: 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61  subtrees pLeft a
38d0: 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f  nd pRight..*/.vo
38e0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74  id sqlite3ExprAt
38f0: 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20  tachSubtrees(.  
3900: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45  sqlite3 *db,.  E
3910: 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78  xpr *pRoot,.  Ex
3920: 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70  pr *pLeft,.  Exp
3930: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69  r *pRight.){.  i
3940: 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  f( pRoot==0 ){. 
3950: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
3960: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
3970: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3980: 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b  lete(db, pLeft);
3990: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
39a0: 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68  Delete(db, pRigh
39b0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
39c0: 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20   if( pRight ){. 
39d0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67       pRoot->pRig
39e0: 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  ht = pRight;.   
39f0: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
3a00: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26 20  |= EP_Collate & 
3a10: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20  pRight->flags;. 
3a20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
3a30: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
3a40: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
3a50: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66  ;.      pRoot->f
3a60: 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61  lags |= EP_Colla
3a70: 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67  te & pLeft->flag
3a80: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70  s;.    }.    exp
3a90: 72 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74  rSetHeight(pRoot
3aa0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3ab0: 41 6c 6c 6f 63 61 74 65 20 61 20 45 78 70 72 20  Allocate a Expr 
3ac0: 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73  node which joins
3ad0: 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20   as many as two 
3ae0: 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20  subtrees..**.** 
3af0: 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  One or both of t
3b00: 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20  he subtrees can 
3b10: 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e  be NULL.  Return
3b20: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3b30: 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f  e new.** Expr no
3b40: 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f  de.  Or, if an O
3b50: 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
3b60: 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d   set pParse->db-
3b70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a  >mallocFailed,.*
3b80: 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72  * free the subtr
3b90: 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ees and return N
3ba0: 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ULL..*/.Expr *sq
3bb0: 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61  lite3PExpr(.  Pa
3bc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3bd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
3be0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
3bf0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
3c00: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
3c10: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
3c20: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
3c30: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20          /* Left 
3c40: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
3c50: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20  r *pRight,      
3c60: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70       /* Right op
3c70: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
3c80: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20   Token *pToken  
3c90: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
3ca0: 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  oken */.){.  Exp
3cb0: 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r *p;.  if( op==
3cc0: 54 4b 5f 41 4e 44 20 26 26 20 70 4c 65 66 74 20  TK_AND && pLeft 
3cd0: 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  && pRight ){.   
3ce0: 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61   /* Take advanta
3cf0: 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63  ge of short-circ
3d00: 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69  uit false optimi
3d10: 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a  zation for AND *
3d20: 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  /.    p = sqlite
3d30: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3d40: 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  >db, pLeft, pRig
3d50: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
3d60: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
3d70: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
3d80: 62 2c 20 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31  b, op, pToken, 1
3d90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3da0: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
3db0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20  (pParse->db, p, 
3dc0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
3dd0: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a    }.  if( p ) {.
3de0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
3df0: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
3e00: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
3e10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
3e20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3e30: 31 20 69 66 20 61 6e 20 65 78 70 72 65 73 73 69  1 if an expressi
3e40: 6f 6e 20 6d 75 73 74 20 62 65 20 46 41 4c 53 45  on must be FALSE
3e50: 20 69 6e 20 61 6c 6c 20 63 61 73 65 73 20 61 6e   in all cases an
3e60: 64 20 30 20 69 66 20 74 68 65 0a 2a 2a 20 65 78  d 0 if the.** ex
3e70: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
3e80: 65 20 74 72 75 65 2e 20 20 54 68 69 73 20 69 73  e true.  This is
3e90: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
3ea0: 2e 20 20 49 66 20 69 73 20 4f 4b 20 74 6f 0a 2a  .  If is OK to.*
3eb0: 2a 20 72 65 74 75 72 6e 20 30 20 68 65 72 65 20  * return 0 here 
3ec0: 65 76 65 6e 20 69 66 20 74 68 65 20 65 78 70 72  even if the expr
3ed0: 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73  ession really is
3ee0: 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 28 61   always false (a
3ef0: 20 0a 2a 2a 20 66 61 6c 73 65 20 6e 65 67 61 74   .** false negat
3f00: 69 76 65 29 2e 20 20 42 75 74 20 69 74 20 69 73  ive).  But it is
3f10: 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e   a bug to return
3f20: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
3f30: 73 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 62 65  sion.** might be
3f40: 20 74 72 75 65 20 69 6e 20 73 6f 6d 65 20 72 61   true in some ra
3f50: 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  re circumstances
3f60: 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69   (a false positi
3f70: 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ve.).**.** Note 
3f80: 74 68 61 74 20 69 66 20 74 68 65 20 65 78 70 72  that if the expr
3f90: 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  ession is part o
3fa0: 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f  f conditional fo
3fb0: 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e  r a.** LEFT JOIN
3fc0: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74  , then we cannot
3fd0: 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f   determine at co
3fe0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
3ff0: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20  er or not.** is 
4000: 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  it true or false
4010: 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75  , so always retu
4020: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
4030: 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 46 61  int exprAlwaysFa
4040: 6c 73 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  lse(Expr *p){.  
4050: 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28  int v = 0;.  if(
4060: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4070: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
4080: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4090: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
40a0: 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20  sInteger(p, &v) 
40b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
40c0: 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  turn v==0;.}../*
40d0: 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70  .** Join two exp
40e0: 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61  ressions using a
40f0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20  n AND operator. 
4100: 20 49 66 20 65 69 74 68 65 72 20 65 78 70 72 65   If either expre
4110: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c  ssion is.** NULL
4120: 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
4130: 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  rn the other exp
4140: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ression..**.** I
4150: 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  f one side or th
4160: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41  e other of the A
4170: 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62  ND is known to b
4180: 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  e false, then in
4190: 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75  stead.** of retu
41a0: 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70  rning an AND exp
41b0: 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65  ression, just re
41c0: 74 75 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20  turn a constant 
41d0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a  expression with.
41e0: 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61  ** a value of fa
41f0: 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  lse..*/.Expr *sq
4200: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c  lite3ExprAnd(sql
4210: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
4220: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
4230: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66  ght){.  if( pLef
4240: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
4250: 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c  rn pRight;.  }el
4260: 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30  se if( pRight==0
4270: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
4280: 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Left;.  }else if
4290: 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  ( exprAlwaysFals
42a0: 65 28 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72  e(pLeft) || expr
42b0: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52 69 67  AlwaysFalse(pRig
42c0: 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ht) ){.    sqlit
42d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
42e0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c   pLeft);.    sql
42f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
4300: 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  b, pRight);.    
4310: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
4320: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
4330: 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33  NTEGER, &sqlite3
4340: 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29  IntTokens[0], 0)
4350: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45  ;.  }else{.    E
4360: 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
4370: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
4380: 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a   TK_AND, 0, 0);.
4390: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
43a0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 64 62  ttachSubtrees(db
43b0: 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70  , pNew, pLeft, p
43c0: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
43d0: 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a  rn pNew;.  }.}..
43e0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
43f0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
4400: 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63   node for a func
4410: 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70  tion with multip
4420: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  le.** arguments.
4430: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
4440: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61  3ExprFunction(Pa
4450: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
4460: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  rList *pList, To
4470: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
4480: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71  Expr *pNew;.  sq
4490: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
44a0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
44b0: 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e  ( pToken );.  pN
44c0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
44d0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e  Alloc(db, TK_FUN
44e0: 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31  CTION, pToken, 1
44f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
4500: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4510: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
4520: 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f  , pList); /* Avo
4530: 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77  id memory leak w
4540: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
4550: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
4560: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e  ;.  }.  pNew->x.
4570: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
4580: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
4590: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
45a0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
45b0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  .  sqlite3ExprSe
45c0: 74 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  tHeight(pParse, 
45d0: 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
45e0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pNew;.}../*.** A
45f0: 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65  ssign a variable
4600: 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78   number to an ex
4610: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e  pression that en
4620: 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64  codes a wildcard
4630: 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69  .** in the origi
4640: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
4650: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  t.  .**.** Wildc
4660: 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20  ards consisting 
4670: 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20  of a single "?" 
4680: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
4690: 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c   next sequential
46a0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  .** variable num
46b0: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  ber..**.** Wildc
46c0: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
46d0: 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69   "?nnn" are assi
46e0: 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20  gned the number 
46f0: 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a  "nnn".  We make.
4700: 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73  ** sure "nnn" is
4710: 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61   not too be to a
4720: 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66  void a denial of
4730: 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20   service attack 
4740: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  when.** the SQL 
4750: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20  statement comes 
4760: 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
4770: 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57   source..**.** W
4780: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
4790: 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61  form ":aaa", "@a
47a0: 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61  aa", or "$aaa" a
47b0: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
47c0: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
47d0: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
47e0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
47f0: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
4800: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
4810: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
4820: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
4830: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
4840: 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20  uenial variable 
4850: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
4860: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
4870: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
4880: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
4890: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
48a0: 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Expr){.  sqlite3
48b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
48c0: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
48d0: 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  *z;..  if( pExpr
48e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
48f0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
4900: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
4910: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
4920: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
4930: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
4940: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
4950: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
4960: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
4970: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  0]!=0 );.  if( z
4980: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
4990: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
49a0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
49b0: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
49c0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
49d0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
49e0: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70  ='?' );.    pExp
49f0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
4a00: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
4a10: 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Var);.  }else{. 
4a20: 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a     ynVar x = 0;.
4a30: 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69      u32 n = sqli
4a40: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
4a50: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
4a60: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
4a70: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
4a80: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
4a90: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
4aa0: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
4ab0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
4ac0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
4ad0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
4ae0: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
4af0: 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f   = 0==sqlite3Ato
4b00: 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e  i64(&z[1], &i, n
4b10: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  -1, SQLITE_UTF8)
4b20: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
4b30: 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e  Column = x = (yn
4b40: 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73  Var)i;.      tes
4b50: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
4b60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4b70: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
4b80: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
4b90: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
4ba0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
4bb0: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  R]-1 );.      te
4bc0: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
4bd0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
4be0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
4bf0: 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ER] );.      if(
4c00: 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c   bOk==0 || i<1 |
4c10: 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  | i>db->aLimit[S
4c20: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
4c30: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
4c40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
4c50: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4c60: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
4c70: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
4c80: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
4c90: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c            db->aL
4ca0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
4cb0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
4cc0: 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  R]);.        x =
4cd0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
4ce0: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
4cf0: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nVar ){.        
4d00: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28  pParse->nVar = (
4d10: 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  int)i;.      }. 
4d20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4d30: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b  /* Wildcards lik
4d40: 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22  e ":aaa", "$aaa"
4d50: 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75   or "@aaa".  Reu
4d60: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
4d70: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75  able.      ** nu
4d80: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
4d90: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
4da0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
4db0: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
4dc0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72      ** has never
4dd0: 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65   appeared before
4de0: 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  , reuse the same
4df0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4e00: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4e10: 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66  ynVar i;.      f
4e20: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
4e30: 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  ->nzVar; i++){. 
4e40: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
4e50: 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 6d  e->azVar[i] && m
4e60: 65 6d 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a  emcmp(pParse->az
4e70: 56 61 72 5b 69 5d 2c 7a 2c 6e 2b 31 29 3d 3d 30  Var[i],z,n+1)==0
4e80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
4e90: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78  xpr->iColumn = x
4ea0: 20 3d 20 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20   = (ynVar)i+1;. 
4eb0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4ec0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4ed0: 7d 0a 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30  }.      if( x==0
4ee0: 20 29 20 78 20 3d 20 70 45 78 70 72 2d 3e 69 43   ) x = pExpr->iC
4ef0: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28  olumn = (ynVar)(
4f00: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
4f10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78  .    }.    if( x
4f20: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
4f30: 78 3e 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20  x>pParse->nzVar 
4f40: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
4f50: 2a 2a 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d  **a;.        a =
4f60: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
4f70: 63 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a  c(db, pParse->az
4f80: 56 61 72 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b  Var, x*sizeof(a[
4f90: 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  0]));.        if
4fa0: 28 20 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( a==0 ) return;
4fb0: 20 20 2f 2a 20 45 72 72 6f 72 20 72 65 70 6f 72    /* Error repor
4fc0: 74 65 64 20 74 68 72 6f 75 67 68 20 64 62 2d 3e  ted through db->
4fd0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a  mallocFailed */.
4fe0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4ff0: 61 7a 56 61 72 20 3d 20 61 3b 0a 20 20 20 20 20  azVar = a;.     
5000: 20 20 20 6d 65 6d 73 65 74 28 26 61 5b 70 50 61     memset(&a[pPa
5010: 72 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20  rse->nzVar], 0, 
5020: 28 78 2d 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72  (x-pParse->nzVar
5030: 29 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b  )*sizeof(a[0]));
5040: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
5050: 3e 6e 7a 56 61 72 20 3d 20 78 3b 0a 20 20 20 20  >nzVar = x;.    
5060: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b    }.      if( z[
5070: 30 5d 21 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73  0]!='?' || pPars
5080: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30  e->azVar[x-1]==0
5090: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
50a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 50  te3DbFree(db, pP
50b0: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d  arse->azVar[x-1]
50c0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
50d0: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20  e->azVar[x-1] = 
50e0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
50f0: 28 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  (db, z, n);.    
5100: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20    }.    }.  } . 
5110: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45   if( !pParse->nE
5120: 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56  rr && pParse->nV
5130: 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  ar>db->aLimit[SQ
5140: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
5150: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20  BLE_NUMBER] ){. 
5160: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5170: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
5180: 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c  many SQL variabl
5190: 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  es");.  }.}../*.
51a0: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64  ** Recursively d
51b0: 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73  elete an express
51c0: 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  ion tree..*/.voi
51d0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
51e0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
51f0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5200: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
5210: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
5220: 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  k: Assert that t
5230: 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e  he IntValue is n
5240: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69  on-negative if i
5250: 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73  t exists */.  as
5260: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5270: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
5280: 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69  Value) || p->u.i
5290: 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66  Value>=0 );.  if
52a0: 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
52b0: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
52c0: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 73 71  nOnly) ){.    sq
52d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
52e0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
52f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5300: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67  lete(db, p->pRig
5310: 68 74 29 3b 0a 20 20 20 20 69 66 28 20 21 45 78  ht);.    if( !Ex
5320: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5330: 20 45 50 5f 52 65 64 75 63 65 64 29 20 26 26 20   EP_Reduced) && 
5340: 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32  (p->flags2 & EP2
5350: 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 21  _MallocedToken)!
5360: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
5370: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
5380: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
5390: 7d 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  }.    if( ExprHa
53a0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
53b0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
53c0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
53d0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
53e0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
53f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
5400: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
5410: 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  e(db, p->x.pList
5420: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
5430: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
5440: 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63  rty(p, EP_Static
5450: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
5460: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
5470: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
5480: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
5490: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
54a0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
54b0: 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a  ion structure .*
54c0: 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
54d0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
54e0: 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f  This is always o
54f0: 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53  ne of EXPR_FULLS
5500: 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44  IZE,.** EXPR_RED
5510: 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52  UCEDSIZE or EXPR
5520: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a  _TOKENONLYSIZE..
5530: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
5540: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
5550: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70  r *p){.  if( Exp
5560: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5570: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20  EP_TokenOnly) ) 
5580: 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45  return EXPR_TOKE
5590: 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28  NONLYSIZE;.  if(
55a0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
55b0: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20  (p, EP_Reduced) 
55c0: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45  ) return EXPR_RE
55d0: 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74  DUCEDSIZE;.  ret
55e0: 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  urn EXPR_FULLSIZ
55f0: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E;.}../*.** The 
5600: 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29  dupedExpr*Size()
5610: 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72   routines each r
5620: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5630: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
5640: 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61  ed.** to store a
5650: 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72   copy of an expr
5660: 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73  ession or expres
5670: 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79  sion tree.  They
5680: 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f   differ in.** ho
5690: 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72  w much of the tr
56a0: 65 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a  ee is measured..
56b0: 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  **.**     dupedE
56c0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
56d0: 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79      Size of only
56e0: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
56f0: 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65  ure .**     dupe
5700: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20  dExprNodeSize() 
5710: 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78        Size of Ex
5720: 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74  pr + space for t
5730: 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65  oken.**     dupe
5740: 64 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20  dExprSize()     
5750: 20 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b        Expr + tok
5760: 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d  en + subtree com
5770: 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a  ponents.**.*****
5780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57c0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
57d0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
57e0: 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Size() function 
57f0: 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75  returns two valu
5800: 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65  es OR-ed togethe
5810: 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20  r:  .** (1) the 
5820: 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
5830: 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  or a copy of the
5840: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
5850: 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29  only and .** (2)
5860: 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67   the EP_xxx flag
5870: 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20  s that indicate 
5880: 77 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75  what the structu
5890: 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62  re size should b
58a0: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
58b0: 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79   values is alway
58c0: 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  s one of:.**.** 
58d0: 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49       EXPR_FULLSI
58e0: 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ZE.**      EXPR_
58f0: 52 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20  REDUCEDSIZE   | 
5900: 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20  EP_Reduced.**   
5910: 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c     EXPR_TOKENONL
5920: 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e  YSIZE | EP_Token
5930: 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  Only.**.** The s
5940: 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63  ize of the struc
5950: 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  ture can be foun
5960: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
5970: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
5980: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
5990: 20 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68   with 0xfff.  Th
59a0: 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66  e flags can be f
59b0: 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20  ound by masking 
59c0: 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  the.** return va
59d0: 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75  lue with EP_Redu
59e0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
59f0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
5a00: 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58  t with flags==EX
5a10: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68  PRDUP_REDUCE, th
5a20: 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b  is routines work
5a30: 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a  s on full-size.*
5a40: 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78  * (unreduced) Ex
5a50: 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68  pr objects as th
5a60: 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79  ey or originally
5a70: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
5a80: 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44  the parser..** D
5a90: 75 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  uring expression
5aa0: 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61   analysis, extra
5ab0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
5ac0: 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76  computed and mov
5ad0: 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72  ed into.** later
5ae0: 20 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78   parts of teh Ex
5af0: 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  pr object and th
5b00: 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  at extra informa
5b10: 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63  tion might get c
5b20: 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66  hopped.** off if
5b30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5b40: 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74  is reduced.  Not
5b50: 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64  e also that it d
5b60: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a  oes not work to.
5b70: 2a 2a 20 6d 61 6b 65 20 61 20 45 58 50 52 44 55  ** make a EXPRDU
5b80: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
5b90: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
5ba0: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
5bb0: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
5bc0: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
5bd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5be0: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
5bf0: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
5c00: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
5c10: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
5c20: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
5c30: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
5c40: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
5c50: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
5c60: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
5c70: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5c80: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5c90: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
5ca0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
5cb0: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
5cc0: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
5cd0: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
5ce0: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
5cf0: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
5d00: 6f 77 65 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d  owed */.  if( 0=
5d10: 3d 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f  =(flags&EXPRDUP_
5d20: 52 45 44 55 43 45 29 20 29 7b 0a 20 20 20 20 6e  REDUCE) ){.    n
5d30: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
5d40: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
5d50: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
5d60: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
5d70: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
5d80: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
5d90: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
5da0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5db0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20  _FromJoin) ); . 
5dc0: 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66     assert( (p->f
5dd0: 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c  lags2 & EP2_Mall
5de0: 6f 63 65 64 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b  ocedToken)==0 );
5df0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d  .    assert( (p-
5e00: 3e 66 6c 61 67 73 32 20 26 20 45 50 32 5f 49 72  >flags2 & EP2_Ir
5e10: 72 65 64 75 63 69 62 6c 65 29 3d 3d 30 20 29 3b  reducible)==0 );
5e20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66  .    if( p->pLef
5e30: 74 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 20 7c  t || p->pRight |
5e40: 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  | p->x.pList ){.
5e50: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
5e60: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c  PR_REDUCEDSIZE |
5e70: 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20   EP_Reduced;.   
5e80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
5e90: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
5ea0: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
5eb0: 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20  kenOnly;.    }. 
5ec0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a   }.  return nSiz
5ed0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
5ee0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
5ef0: 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62  s the space in b
5f00: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
5f10: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
5f20: 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20  .** of the Expr 
5f30: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
5f40: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
5f50: 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  .u.zToken string
5f60: 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72   (if that.** str
5f70: 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29  ing is defined.)
5f80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
5f90: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
5fa0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
5fb0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
5fc0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
5fd0: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
5fe0: 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28  ) & 0xfff;.  if(
5ff0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
6000: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
6010: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
6020: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
6030: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6040: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b  (p->u.zToken)+1;
6050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f  .  }.  return RO
6060: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a  UND8(nByte);.}..
6070: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6080: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
6090: 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65   required to cre
60a0: 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ate a duplicate 
60b0: 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  of the .** expre
60c0: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
60d0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
60e0: 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  nt. The second a
60f0: 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
6100: 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mask containing 
6110: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
6120: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  s..**.** The val
6130: 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  ue returned incl
6140: 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72  udes space to cr
6150: 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
6160: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a  he Expr struct.*
6170: 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65  * itself and the
6180: 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64   buffer referred
6190: 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54   to by Expr.u.zT
61a0: 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a  oken, if any..**
61b0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
61c0: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
61d0: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
61e0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63  return value inc
61f0: 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20  ludes .** space 
6200: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c  to duplicate all
6210: 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74   Expr nodes in t
6220: 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62  he tree formed b
6230: 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a  y Expr.pLeft .**
6240: 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74   and Expr.pRight
6250: 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20   variables (but 
6260: 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75  not for any stru
6270: 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74  ctures pointed t
6280: 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64  o or .** descend
6290: 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  ed from the Expr
62a0: 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72  .x.pList or Expr
62b0: 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61  .x.pSelect varia
62c0: 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  bles)..*/.static
62d0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69   int dupedExprSi
62e0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
62f0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
6300: 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  yte = 0;.  if( p
6310: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
6320: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
6330: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
6340: 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44   if( flags&EXPRD
6350: 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20  UP_REDUCE ){.   
6360: 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65     nByte += dupe
6370: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65  dExprSize(p->pLe
6380: 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70  ft, flags) + dup
6390: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52  edExprSize(p->pR
63a0: 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ight, flags);.  
63b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
63c0: 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nByte;.}../*.**
63d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
63e0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
63f0: 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65  ite3ExprDup(), e
6400: 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a  xcept that if pz
6410: 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f  Buffer .** is no
6420: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42  t NULL then *pzB
6430: 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64  uffer is assumed
6440: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
6450: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
6460: 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  gh .** to store 
6470: 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72  the copy of expr
6480: 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f  ession p, the co
6490: 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f  pies of p->u.zTo
64a0: 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69  ken.** (if appli
64b0: 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20  cable), and the 
64c0: 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d  copies of the p-
64d0: 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52  >pLeft and p->pR
64e0: 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ight expressions
64f0: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66  ,.** if any. Bef
6500: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
6510: 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20  pzBuffer is set 
6520: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
6530: 65 20 70 61 73 73 65 64 20 74 68 65 0a 2a 2a 20  e passed the.** 
6540: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  portion of the b
6550: 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74  uffer copied int
6560: 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  o by this functi
6570: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  on..*/.static Ex
6580: 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69  pr *exprDup(sqli
6590: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
65a0: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 75 38 20  , int flags, u8 
65b0: 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45  **pzBuffer){.  E
65c0: 78 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20  xpr *pNew = 0;  
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
65f0: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20  return */.  if( 
6600: 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  p ){.    const i
6610: 6e 74 20 69 73 52 65 64 75 63 65 64 20 3d 20 28  nt isReduced = (
6620: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
6630: 44 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a  DUCE);.    u8 *z
6640: 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20 73  Alloc;.    u32 s
6650: 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a  taticFlag = 0;..
6660: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42 75      assert( pzBu
6670: 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64  ffer==0 || isRed
6680: 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  uced );..    /* 
6690: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
66a0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
66b0: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
66c0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a 42  . */.    if( pzB
66d0: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 7a  uffer ){.      z
66e0: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
66f0: 72 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 46  r;.      staticF
6700: 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b  lag = EP_Static;
6710: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6720: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
6730: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
6740: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
6750: 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20 20 20  p, flags));.    
6760: 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 45 78  }.    pNew = (Ex
6770: 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20  pr *)zAlloc;..  
6780: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
6790: 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53      /* Set nNewS
67a0: 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
67b0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
67c0: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
67d0: 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ted to.      ** 
67e0: 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73  by pNew. This is
67f0: 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c   either EXPR_FUL
6800: 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55  LSIZE, EXPR_REDU
6810: 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 20  CEDSIZE or.     
6820: 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   ** EXPR_TOKENON
6830: 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69  LYSIZE. nToken i
6840: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
6850: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e  ber of bytes con
6860: 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  sumed.      ** b
6870: 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  y the copy of th
6880: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
6890: 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20  ring (if any).. 
68a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
68b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74  nst unsigned nSt
68c0: 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64  ructSize = duped
68d0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
68e0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  , flags);.      
68f0: 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69  const int nNewSi
6900: 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  ze = nStructSize
6910: 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 20 20   & 0xfff;.      
6920: 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  int nToken;.    
6930: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
6940: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
6950: 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
6960: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  Token ){.       
6970: 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65   nToken = sqlite
6980: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
6990: 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20  Token) + 1;.    
69a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
69b0: 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20   nToken = 0;.   
69c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
69d0: 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20 20  sReduced ){.    
69e0: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
69f0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6a00: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
6a10: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
6a20: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53  zAlloc, p, nNewS
6a30: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
6a40: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
6a50: 53 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75 63  Size = exprStruc
6a60: 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20  tSize(p);.      
6a70: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
6a80: 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20   p, nSize);.    
6a90: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c      memset(&zAll
6aa0: 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58  oc[nSize], 0, EX
6ab0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a  PR_FULLSIZE-nSiz
6ac0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
6ad0: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50     /* Set the EP
6ae0: 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b  _Reduced, EP_Tok
6af0: 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53  enOnly, and EP_S
6b00: 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72  tatic flags appr
6b10: 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  opriately. */.  
6b20: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
6b30: 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c  &= ~(EP_Reduced|
6b40: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
6b50: 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20 70  Static);.      p
6b60: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53  New->flags |= nS
6b70: 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f  tructSize & (EP_
6b80: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
6b90: 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70 4e 65  Only);.      pNe
6ba0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74  w->flags |= stat
6bb0: 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20 2f  icFlag;..      /
6bc0: 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e  * Copy the p->u.
6bd0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69  zToken string, i
6be0: 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20 20  f any. */.      
6bf0: 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( nToken ){.  
6c00: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b        char *zTok
6c10: 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f  en = pNew->u.zTo
6c20: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41  ken = (char*)&zA
6c30: 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a  lloc[nNewSize];.
6c40: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
6c50: 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  Token, p->u.zTok
6c60: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
6c70: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
6c80: 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e  0==((p->flags|pN
6c90: 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50 5f  ew->flags) & EP_
6ca0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
6cb0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
6cc0: 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65   the pNew->x.pSe
6cd0: 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e  lect or pNew->x.
6ce0: 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f  pList member. */
6cf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
6d00: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6d10: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
6d20: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6d30: 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  >x.pSelect = sql
6d40: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
6d50: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  , p->x.pSelect, 
6d60: 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20  isReduced);.    
6d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6d80: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
6d90: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
6da0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78  ListDup(db, p->x
6db0: 2e 70 4c 69 73 74 2c 20 69 73 52 65 64 75 63 65  .pList, isReduce
6dc0: 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d);.        }.  
6dd0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
6de0: 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c  Fill in pNew->pL
6df0: 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52  eft and pNew->pR
6e00: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ight. */.      i
6e10: 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f  f( ExprHasAnyPro
6e20: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
6e30: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
6e40: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
6e50: 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45  zAlloc += dupedE
6e60: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
6e70: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69  lags);.        i
6e80: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
6e90: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
6ea0: 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ced) ){.        
6eb0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
6ec0: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
6ed0: 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45  Left, EXPRDUP_RE
6ee0: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
6ef0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6f00: 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70  pRight = exprDup
6f10: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
6f20: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
6f30: 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  &zAlloc);.      
6f40: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
6f50: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
6f60: 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20        *pzBuffer 
6f70: 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  = zAlloc;.      
6f80: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
6f90: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
6fa0: 6c 61 67 73 32 20 3d 20 30 3b 0a 20 20 20 20 20  lags2 = 0;.     
6fb0: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41     if( !ExprHasA
6fc0: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
6fd0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
6fe0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
6ff0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
7000: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
7010: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ft, 0);.        
7020: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
7030: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7040: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30  db, p->pRight, 0
7050: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7060: 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d 0a     }..    }.  }.
7070: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7080: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
7090: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
70a0: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
70b0: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
70c0: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
70d0: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
70e0: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
70f0: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
7100: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
7110: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
7120: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
7130: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
7140: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
7150: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
7160: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
7170: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
7180: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
7190: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
71a0: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
71b0: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
71c0: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
71d0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
71e0: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
71f0: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
7200: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
7210: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
7220: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
7230: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
7240: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
7250: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
7260: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
7270: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
7280: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
7290: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ted..**.** The f
72a0: 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63  lags parameter c
72b0: 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e  ontains a combin
72c0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50  ation of the EXP
72d0: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
72e0: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
72f0: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
7300: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73   set, then the s
7310: 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
7320: 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61  d is a.** trunca
7330: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ted version of t
7340: 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74  he usual Expr st
7350: 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
7360: 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a  l be stored as.*
7370: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  * part of the in
7380: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
7390: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
73a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
73b0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
73c0: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
73d0: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
73e0: 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75 72   flags){.  retur
73f0: 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c  n exprDup(db, p,
7400: 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45 78   flags, 0);.}.Ex
7410: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
7420: 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74  xprListDup(sqlit
7430: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
7440: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7450: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65  .  ExprList *pNe
7460: 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  w;.  struct Expr
7470: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
7480: 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69  , *pOldItem;.  i
7490: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt i;.  if( p==0
74a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
74b0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
74c0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
74d0: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
74e0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
74f0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
7500: 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  iECursor = 0;.  
7510: 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69 20  pNew->nExpr = i 
7520: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  = p->nExpr;.  if
7530: 28 20 28 66 6c 61 67 73 20 26 20 45 58 50 52 44  ( (flags & EXPRD
7540: 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20 29 20  UP_REDUCE)==0 ) 
7550: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45  for(i=1; i<p->nE
7560: 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20 70  xpr; i+=i){}.  p
7570: 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d  New->a = pItem =
7580: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7590: 52 61 77 28 64 62 2c 20 20 69 2a 73 69 7a 65 6f  Raw(db,  i*sizeo
75a0: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
75b0: 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a  if( pItem==0 ){.
75c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
75d0: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
75e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a   return 0;.  } .
75f0: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
7600: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
7610: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
7620: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
7630: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
7640: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
7650: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 70  em->pExpr;.    p
7660: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Item->pExpr = sq
7670: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7680: 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73   pOldExpr, flags
7690: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
76a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
76b0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
76c0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
76d0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
76e0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
76f0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70  b, pOldItem->zSp
7700: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
7710: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
7720: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
7730: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
7740: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d   = 0;.    pItem-
7750: 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 70  >iOrderByCol = p
7760: 4f 6c 64 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42  OldItem->iOrderB
7770: 79 43 6f 6c 3b 0a 20 20 20 20 70 49 74 65 6d 2d  yCol;.    pItem-
7780: 3e 69 41 6c 69 61 73 20 3d 20 70 4f 6c 64 49 74  >iAlias = pOldIt
7790: 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a 20 20 7d 0a  em->iAlias;.  }.
77a0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
77b0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ../*.** If curso
77c0: 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69  rs, triggers, vi
77d0: 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
77e0: 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74  es are all omitt
77f0: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62  ed from.** the b
7800: 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20  uild, then none 
7810: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
7820: 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70   routines, excep
7830: 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65  t for .** sqlite
7840: 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61  3SelectDup(), ca
7850: 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c  n be called. sql
7860: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20  ite3SelectDup() 
7870: 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  is sometimes.** 
7880: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55  called with a NU
7890: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
78a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
78b0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
78c0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
78d0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
78e0: 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  \. || !defined(S
78f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7900: 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71  ERY).SrcList *sq
7910: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
7920: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
7930: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
7940: 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  gs){.  SrcList *
7950: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
7960: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
7970: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7980: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
7990: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
79a0: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
79b0: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
79c0: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
79d0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
79e0: 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65  locRaw(db, nByte
79f0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7a00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7a10: 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65  pNew->nSrc = pNe
7a20: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
7a30: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
7a40: 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  i<p->nSrc; i++){
7a50: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
7a60: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
7a70: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
7a80: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
7a90: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
7aa0: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
7ab0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
7ac0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
7ad0: 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65  Schema = pOldIte
7ae0: 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  m->pSchema;.    
7af0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
7b00: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
7b10: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7b20: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
7b30: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
7b40: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7b50: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7b60: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7b70: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
7b80: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7b90: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7ba0: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
7bb0: 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ewItem->jointype
7bc0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69   = pOldItem->joi
7bd0: 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49  ntype;.    pNewI
7be0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
7bf0: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
7c00: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7c10: 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f  addrFillSub = pO
7c20: 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ldItem->addrFill
7c30: 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Sub;.    pNewIte
7c40: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70  m->regReturn = p
7c50: 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  OldItem->regRetu
7c60: 72 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  rn;.    pNewItem
7c70: 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d  ->isCorrelated =
7c80: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72   pOldItem->isCor
7c90: 72 65 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65  related;.    pNe
7ca0: 77 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  wItem->viaCorout
7cb0: 69 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ine = pOldItem->
7cc0: 76 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a 20 20  viaCoroutine;.  
7cd0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64    pNewItem->zInd
7ce0: 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ex = sqlite3DbSt
7cf0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7d00: 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20  m->zIndex);.    
7d10: 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64  pNewItem->notInd
7d20: 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  exed = pOldItem-
7d30: 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20  >notIndexed;.   
7d40: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65   pNewItem->pInde
7d50: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49  x = pOldItem->pI
7d60: 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d  ndex;.    pTab =
7d70: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
7d80: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
7d90: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
7da0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
7db0: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
7dc0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
7dd0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
7de0: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
7df0: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
7e00: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
7e10: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
7e20: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
7e30: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
7e40: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7e50: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
7e60: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
7e70: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
7e80: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
7e90: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
7ea0: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
7eb0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7ec0: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
7ed0: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
7ee0: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
7ef0: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
7f00: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  w;.  int i;.  if
7f10: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7f20: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
7f30: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7f40: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
7f50: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7f60: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7f70: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
7f80: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
7f90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7fa0: 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69  aw(db, p->nId*si
7fb0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
7fc0: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
7fd0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7fe0: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
7ff0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
8000: 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68    }.  /* Note th
8010: 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73  at because the s
8020: 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  ize of the alloc
8030: 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d  ation for p->a[]
8040: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63   is not.  ** nec
8050: 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72  essarily a power
8060: 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33   of two, sqlite3
8070: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d  IdListAppend() m
8080: 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ay not be called
8090: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70  .  ** on the dup
80a0: 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62  licate created b
80b0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
80c0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
80d0: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
80e0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
80f0: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
8100: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
8110: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
8120: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
8130: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
8140: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
8150: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
8160: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8170: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
8180: 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64  Item->idx = pOld
8190: 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20  Item->idx;.  }. 
81a0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
81b0: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
81c0: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
81d0: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c   *db, Select *p,
81e0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
81f0: 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50  elect *pNew, *pP
8200: 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30  rior;.  if( p==0
8210: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8220: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
8230: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
8240: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
8250: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
8260: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  n 0;.  pNew->pEL
8270: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
8280: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
8290: 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a  pEList, flags);.
82a0: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
82b0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
82c0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c  (db, p->pSrc, fl
82d0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  ags);.  pNew->pW
82e0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
82f0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
8300: 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ere, flags);.  p
8310: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
8320: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8330: 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  up(db, p->pGroup
8340: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  By, flags);.  pN
8350: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
8360: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
8370: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
8380: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  gs);.  pNew->pOr
8390: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
83a0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
83b0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67  ->pOrderBy, flag
83c0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  s);.  pNew->op =
83d0: 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e   p->op;.  pNew->
83e0: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20  pPrior = pPrior 
83f0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
8400: 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  up(db, p->pPrior
8410: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
8420: 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d  pPrior ) pPrior-
8430: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
8440: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
8450: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
8460: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8470: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  p(db, p->pLimit,
8480: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
8490: 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74  >pOffset = sqlit
84a0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
84b0: 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29  >pOffset, flags)
84c0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
84d0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f   = 0;.  pNew->iO
84e0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65  ffset = 0;.  pNe
84f0: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  w->selFlags = p-
8500: 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f  >selFlags & ~SF_
8510: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
8520: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
8530: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61  t = 0;.  pNew->a
8540: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
8550: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
8560: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
8570: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
8580: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
8590: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
85a0: 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a  }.#else.Select *
85b0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
85c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
85d0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  lect *p, int fla
85e0: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  gs){.  assert( p
85f0: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
8600: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  0;.}.#endif.../*
8610: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
8620: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
8630: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
8640: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
8650: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
8660: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
8670: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
8680: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
8690: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
86a0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
86b0: 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65  curs, the entire
86c0: 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20 61   list is freed a
86d0: 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  nd.** NULL is re
86e0: 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d  turned.  If non-
86f0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
8700: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
8710: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20  ranteed.** that 
8720: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61  the new entry wa
8730: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  s successfully a
8740: 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72  ppended..*/.Expr
8750: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
8760: 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  rListAppend(.  P
8770: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8780: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
8790: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
87a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
87b0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
87c0: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
87d0: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
87e0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
87f0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r             /*
8800: 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   Expression to b
8810: 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68  e appended. Migh
8820: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
8830: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8840: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
8850: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
8860: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
8870: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
8880: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  , sizeof(ExprLis
8890: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
88a0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
88b0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
88c0: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
88d0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
88e0: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
88f0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
8900: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d     if( pList->a=
8910: 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
8920: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
8930: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70  List->nExpr & (p
8940: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d  List->nExpr-1))=
8950: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
8960: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8970: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
8980: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
8990: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33  .    a = sqlite3
89a0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
89b0: 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
89c0: 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c  Expr*2*sizeof(pL
89d0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
89e0: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
89f0: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
8a00: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
8a10: 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73  >a = a;.  }.  as
8a20: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
8a30: 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a  0 );.  if( 1 ){.
8a40: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
8a50: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
8a60: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
8a70: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
8a80: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
8a90: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
8aa0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
8ab0: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
8ac0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
8ad0: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
8ae0: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
8af0: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
8b00: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
8b10: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
8b20: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
8b30: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
8b40: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
8b50: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
8b60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
8b70: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
8b80: 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66  zName element of
8b90: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8ba0: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
8bb0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
8bc0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
8bd0: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
8be0: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
8bf0: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
8c00: 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76  pName should nev
8c10: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
8c20: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
8c30: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
8c40: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
8c50: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
8c60: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
8c70: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
8c80: 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72  stSetName(.  Par
8c90: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8ca0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
8cb0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8cc0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
8cd0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
8ce0: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
8cf0: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   span. */.  Toke
8d00: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
8d10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62      /* Name to b
8d20: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
8d30: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
8d40: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
8d50: 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74  cause the name t
8d60: 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f  o be dequoted */
8d70: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  .){.  assert( pL
8d80: 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ist!=0 || pParse
8d90: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8da0: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
8db0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
8dc0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
8dd0: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
8de0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
8df0: 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  r>0 );.    pItem
8e00: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
8e10: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
8e20: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
8e30: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20  >zName==0 );.   
8e40: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
8e50: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
8e60: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
8e70: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
8e80: 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74  ;.    if( dequot
8e90: 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  e && pItem->zNam
8ea0: 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f  e ) sqlite3Dequo
8eb0: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
8ec0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
8ed0: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
8ee0: 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e  a[].zSpan elemen
8ef0: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
8f00: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
8f10: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
8f20: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
8f30: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
8f40: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
8f50: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
8f60: 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64  But pSpan should
8f70: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
8f80: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
8f90: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
8fa0: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
8fb0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
8fc0: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
8fd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
8fe0: 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20  prListSetSpan(. 
8ff0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9000: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9010: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9020: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9030: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
9040: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
9050: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
9060: 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20  ExprSpan *pSpan 
9070: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
9080: 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20  pan to be added 
9090: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
90a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
90b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
90c0: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
90d0: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
90e0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
90f0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9100: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
9110: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
9120: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
9130: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
9140: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  xpr>0 );.    ass
9150: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
9160: 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e  ailed || pItem->
9170: 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45  pExpr==pSpan->pE
9180: 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  xpr );.    sqlit
9190: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
91a0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
91b0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
91c0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
91d0: 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e  db, (char*)pSpan
91e0: 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20  ->zStart,.      
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
9210: 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20  nt)(pSpan->zEnd 
9220: 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29  - pSpan->zStart)
9230: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9240: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9250: 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f  n list pEList co
9260: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
9270: 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73   iLimit elements
9280: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
9290: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
92a0: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
92b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
92c0: 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72  eckLength(.  Par
92d0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
92e0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a  prList *pEList,.
92f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
9300: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d  bject.){.  int m
9310: 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  x = pParse->db->
9320: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
9330: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74  MIT_COLUMN];.  t
9340: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
9350: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
9360: 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61  ==mx );.  testca
9370: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
9380: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b  List->nExpr==mx+
9390: 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  1 );.  if( pELis
93a0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
93b0: 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c  pr>mx ){.    sql
93c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
93d0: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
93e0: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
93f0: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
9400: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
9410: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
9420: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  n list..*/.void 
9430: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
9440: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
9450: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
9460: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
9470: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9480: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
9490: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
94a0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
94b0: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70  pList->a!=0 || p
94c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29  List->nExpr==0 )
94d0: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
94e0: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
94f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
9500: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
9510: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9520: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78  e(db, pItem->pEx
9530: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
9540: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
9550: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
9560: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9570: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
9580: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
9590: 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
95a0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
95b0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
95c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  ./*.** These rou
95d0: 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72  tines are Walker
95e0: 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61 6c   callbacks.  Wal
95f0: 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70 6f  ker.u.pi is a po
9600: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69  inter.** to an i
9610: 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65 20 72  nteger.  These r
9620: 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68 65 63  outines are chec
9630: 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  king an expressi
9640: 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20  on to see.** if 
9650: 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  it is a constant
9660: 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e 75  .  Set *Walker.u
9670: 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68 65 20  .pi to 0 if the 
9680: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
9690: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a   not constant..*
96a0: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
96b0: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
96c0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
96d0: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
96e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
96f0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9700: 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  t().**     sqlit
9710: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
9720: 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20 20  NotJoin().**    
9730: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9740: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
9750: 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  ().**.*/.static 
9760: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
9770: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
9780: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
9790: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
97a0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20 33  Walker->u.i is 3
97b0: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
97c0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
97d0: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
97e0: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
97f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
9800: 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69   a join disquali
9810: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
9820: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
9830: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
9840: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
9850: 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  ( pWalker->u.i==
9860: 33 20 26 26 20 45 78 70 72 48 61 73 41 6e 79 50  3 && ExprHasAnyP
9870: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
9880: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
9890: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20     pWalker->u.i 
98a0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
98b0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
98c0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
98d0: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
98e0: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
98f0: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
9900: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
9910: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
9920: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70  ant.    ** and p
9930: 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 2a  Walker->u.i==2 *
9940: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
9950: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
9960: 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  ( pWalker->u.i==
9970: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
9980: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
9990: 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
99a0: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
99b0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
99c0: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
99d0: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
99e0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
99f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9a00: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
9a10: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9a20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
9a30: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
9a40: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9a50: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
9a60: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
9a70: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
9a80: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
9a90: 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72  );.      pWalker
9aa0: 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20  ->u.i = 0;.     
9ab0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
9ac0: 74 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  t;.    default:.
9ad0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9ae0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
9af0: 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63  LECT ); /* selec
9b00: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20  tNodeIsConstant 
9b10: 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f  will disallow */
9b20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9b30: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
9b40: 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65  XISTS ); /* sele
9b50: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
9b60: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
9b70: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  /.      return W
9b80: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
9b90: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  .}.static int se
9ba0: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
9bb0: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
9bc0: 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  er, Select *NotU
9bd0: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
9be0: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
9bf0: 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  );.  pWalker->u.
9c00: 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  i = 0;.  return 
9c10: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61  WRC_Abort;.}.sta
9c20: 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f  tic int exprIsCo
9c30: 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  nst(Expr *p, int
9c40: 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57 61   initFlag){.  Wa
9c50: 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 75 2e 69 20  lker w;.  w.u.i 
9c60: 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e  = initFlag;.  w.
9c70: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
9c80: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
9c90: 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  nt;.  w.xSelectC
9ca0: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
9cb0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
9cc0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
9cd0: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
9ce0: 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a  rn w.u.i;.}../*.
9cf0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
9d00: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
9d10: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
9d20: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
9d30: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
9d40: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
9d50: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
9d60: 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
9d70: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
9d80: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
9d90: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
9da0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
9db0: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
9dc0: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
9dd0: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
9de0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
9df0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
9e00: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
9e10: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9e20: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
9e30: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
9e40: 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a  Const(p, 1);.}..
9e50: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
9e60: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
9e70: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
9e80: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
9e90: 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64  nstant.** that d
9ea0: 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65  oes no originate
9eb0: 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20   from the ON or 
9ec0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
9ed0: 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75   a join..** Retu
9ee0: 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  rn 0 if it invol
9ef0: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
9f00: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   function calls 
9f10: 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a  or terms from.**
9f20: 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   an ON or USING 
9f30: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  clause..*/.int s
9f40: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
9f50: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72  tantNotJoin(Expr
9f60: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
9f70: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 29  xprIsConst(p, 3)
9f80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
9f90: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
9fa0: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
9fb0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9fc0: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
9fd0: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
9fe0: 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
9ff0: 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
a000: 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
a010: 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
a020: 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
a030: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
a040: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
a050: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
a060: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
a070: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
a080: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
a090: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
a0a0: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
a0b0: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
a0c0: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
a0d0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
a0e0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
a0f0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
a100: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
a110: 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , 2);.}../*.** I
a120: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a130: 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74   p codes a const
a140: 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74  ant integer that
a150: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
a160: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
a170: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
a180: 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74  return 1 and put
a190: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
a1a0: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20  e integer.** in 
a1b0: 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65  *pValue.  If the
a1c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
a1d0: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  ot an integer or
a1e0: 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69   if it is too bi
a1f0: 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  g.** to fit in a
a200: 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69   signed 32-bit i
a210: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30  nteger, return 0
a220: 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c   and leave *pVal
a230: 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ue unchanged..*/
a240: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
a250: 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a  IsInteger(Expr *
a260: 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b  p, int *pValue){
a270: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a  .  int rc = 0;..
a280: 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65    /* If an expre
a290: 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
a2a0: 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ger literal that
a2b0: 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65   fits in a signe
a2c0: 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e  d 32-bit.  ** in
a2d0: 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
a2e0: 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67  EP_IntValue flag
a2f0: 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
a300: 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20  dy been set */. 
a310: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
a320: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70  TK_INTEGER || (p
a330: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
a340: 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20  Value)!=0.      
a350: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
a360: 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f  etInt32(p->u.zTo
a370: 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a  ken, &rc)==0 );.
a380: 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
a390: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
a3a0: 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70  .    *pValue = p
a3b0: 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
a3c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
a3d0: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
a3e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
a3f0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
a400: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
a410: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
a420: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
a430: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a440: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
a450: 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
a460: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a470: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
a480: 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
a490: 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d         *pValue =
a4a0: 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20   -v;.        rc 
a4b0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
a4c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a4d0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
a4e0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
a4f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
a500: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
a510: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
a520: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
a530: 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c  sion can be NULL
a540: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
a550: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
a560: 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68  be NULL or if th
a570: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a580: 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74  too complex.** t
a590: 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52  o tell return TR
a5a0: 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  UE.  .**.** This
a5b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
a5c0: 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   as an optimizat
a5d0: 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f  ion, to skip OP_
a5e0: 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  IsNull opcodes.*
a5f0: 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74  * when we know t
a600: 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e  hat a value cann
a610: 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e  ot be NULL.  Hen
a620: 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69  ce, a false posi
a630: 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69  tive.** (returni
a640: 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20  ng TRUE when in 
a650: 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73  fact the express
a660: 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65  ion can never be
a670: 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20   NULL) might.** 
a680: 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f  be a small perfo
a690: 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69  rmance hit but i
a6a0: 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d  s otherwise harm
a6b0: 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74  less.  On the ot
a6c0: 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66  her.** hand, a f
a6d0: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72  alse negative (r
a6e0: 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77  eturning FALSE w
a6f0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
a700: 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a  ould be NULL).**
a710: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73   will likely res
a720: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72  ult in an incorr
a730: 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20  ect answer.  So 
a740: 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  when in doubt, r
a750: 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a  eturn.** TRUE..*
a760: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
a770: 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74  rCanBeNull(const
a780: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20   Expr *p){.  u8 
a790: 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  op;.  while( p->
a7a0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
a7b0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
a7c0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
a7d0: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
a7e0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
a7f0: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
a800: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
a810: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
a820: 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
a830: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
a840: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
a850: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  T:.    case TK_B
a860: 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72  LOB:.      retur
a870: 6e 20 30 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  n 0;.    default
a880: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
a890: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
a8a0: 65 6e 65 72 61 74 65 20 61 6e 20 4f 50 5f 49 73  enerate an OP_Is
a8b0: 4e 75 6c 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  Null instruction
a8c0: 20 74 68 61 74 20 74 65 73 74 73 20 72 65 67 69   that tests regi
a8d0: 73 74 65 72 20 69 52 65 67 20 61 6e 64 20 6a 75  ster iReg and ju
a8e0: 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 69  mps.** to locati
a8f0: 6f 6e 20 69 44 65 73 74 20 69 66 20 74 68 65 20  on iDest if the 
a900: 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20 69 73  value in iReg is
a910: 20 4e 55 4c 4c 2e 20 20 54 68 65 20 76 61 6c 75   NULL.  The valu
a920: 65 20 69 6e 20 69 52 65 67 20 0a 2a 2a 20 77 61  e in iReg .** wa
a930: 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 70 45  s computed by pE
a940: 78 70 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20  xpr.  If we can 
a950: 6c 6f 6f 6b 20 61 74 20 70 45 78 70 72 20 61 74  look at pExpr at
a960: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e   compile-time an
a970: 64 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 74  d.** determine t
a980: 68 61 74 20 69 74 20 63 61 6e 20 6e 65 76 65 72  hat it can never
a990: 20 67 65 6e 65 72 61 74 65 20 61 20 4e 55 4c 4c   generate a NULL
a9a0: 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 49 73  , then the OP_Is
a9b0: 4e 75 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  Null operation.*
a9c0: 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  * can be omitted
a9d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a9e0: 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
a9f0: 75 6d 70 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ump(.  Vdbe *v, 
aa00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
aa10: 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
aa20: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63  struction */.  c
aa30: 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72  onst Expr *pExpr
aa40: 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67 65 6e 65 72  ,  /* Only gener
aa50: 61 74 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 66  ate OP_IsNull if
aa60: 20 74 68 69 73 20 65 78 70 72 20 63 61 6e 20 62   this expr can b
aa70: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
aa80: 69 52 65 67 2c 20 20 20 20 20 20 20 20 20 20 20  iReg,           
aa90: 2f 2a 20 54 65 73 74 20 74 68 65 20 76 61 6c 75  /* Test the valu
aaa0: 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  e in this regist
aab0: 65 72 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  er for NULL */. 
aac0: 20 69 6e 74 20 69 44 65 73 74 20 20 20 20 20 20   int iDest      
aad0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
aae0: 65 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  e if the value i
aaf0: 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69  s null */.){.  i
ab00: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  f( sqlite3ExprCa
ab10: 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 29 20 29  nBeNull(pExpr) )
ab20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
ab30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
ab40: 4e 75 6c 6c 2c 20 69 52 65 67 2c 20 69 44 65 73  Null, iReg, iDes
ab50: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
ab60: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
ab70: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
ab80: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61  sion is a consta
ab90: 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  nt which would b
aba0: 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62  e.** unchanged b
abb0: 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69  y OP_Affinity wi
abc0: 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  th the affinity 
abd0: 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
abe0: 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ond.** argument.
abf0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ac00: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
ac10: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
ac20: 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72  OP_Affinity oper
ac30: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
ac40: 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69  omitted.  When i
ac50: 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46  n doubt return F
ac60: 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e  ALSE.  A false n
ac70: 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61  egative.** is ha
ac80: 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65  rmless.  A false
ac90: 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76   positive, howev
aca0: 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69  er, can result i
acb0: 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61  n the wrong.** a
acc0: 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nswer..*/.int sq
acd0: 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
ace0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63  AffinityChange(c
acf0: 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68  onst Expr *p, ch
ad00: 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70  ar aff){.  u8 op
ad10: 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c  ;.  if( aff==SQL
ad20: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72  ITE_AFF_NONE ) r
ad30: 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65  eturn 1;.  while
ad40: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
ad50: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
ad60: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
ad70: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
ad80: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
ad90: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
ada0: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
adb0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
adc0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
add0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
ade0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
adf0: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
ae00: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
ae10: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
ae20: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
ae30: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
ae40: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
ae50: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
ae60: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
ae70: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
ae80: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72  TRING: {.      r
ae90: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
aea0: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
aeb0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  }.    case TK_BL
aec0: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  OB: {.      retu
aed0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
aee0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
aef0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
af00: 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20  p->iTable>=0 ); 
af10: 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20   /* p cannot be 
af20: 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20  part of a CHECK 
af30: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
af40: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
af50: 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20  olumn<0.        
af60: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
af70: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
af80: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
af90: 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d  _NUMERIC);.    }
afa0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
afb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
afc0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
afd0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
afe0: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
aff0: 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
b000: 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69  olumn name..*/.i
b010: 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
b020: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  d(const char *z)
b030: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  {.  if( sqlite3S
b040: 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49  trICmp(z, "_ROWI
b050: 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  D_")==0 ) return
b060: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
b070: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57  3StrICmp(z, "ROW
b080: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
b090: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
b0a0: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44  3StrICmp(z, "OID
b0b0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
b0c0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
b0d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
b0e0: 75 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  ue if we are abl
b0f0: 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72  e to the IN oper
b100: 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ator optimizatio
b110: 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20  n on a.** query 
b120: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
b130: 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  *       x IN (SE
b140: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
b150: 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54  Where the SELECT
b160: 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73  ... clause is as
b170: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
b180: 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  e parameter to t
b190: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a  his.** routine..
b1a0: 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74  **.** The Select
b1b0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 69   object passed i
b1c0: 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
b1d0: 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64 20  en preprocessed 
b1e0: 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73  and no.** errors
b1f0: 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64   have been found
b200: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
b210: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b220: 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 43  Y.static int isC
b230: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
b240: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53  (Select *p){.  S
b250: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
b260: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
b270: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
b280: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
b290: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
b2a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67            /* rig
b2b0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
b2c0: 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a  IN is SELECT */.
b2d0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
b2e0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b2f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
b300: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
b310: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65  T */.  if( p->se
b320: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
b330: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
b340: 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63  te) ){.    testc
b350: 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
b360: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
b370: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
b380: 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
b390: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
b3a0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
b3b0: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
b3c0: 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
b3d0: 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65  regate );.    re
b3e0: 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49  turn 0; /* No DI
b3f0: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61  STINCT keyword a
b400: 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  nd no aggregate 
b410: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d  functions */.  }
b420: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47  .  assert( p->pG
b430: 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20  roupBy==0 );    
b440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
b450: 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
b460: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
b470: 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
b480: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b490: 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20  /* Has no LIMIT 
b4a0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65  clause */.  asse
b4b0: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
b4c0: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
b4d0: 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d     /* No LIMIT m
b4e0: 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a  eans no OFFSET *
b4f0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  /.  if( p->pWher
b500: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
b510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
b520: 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
b530: 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d  e */.  pSrc = p-
b540: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
b550: 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66   pSrc!=0 );.  if
b560: 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
b570: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b580: 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74       /* Single t
b590: 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  erm in FROM clau
b5a0: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  se */.  if( pSrc
b5b0: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
b5c0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f   return 0;     /
b5d0: 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20  * FROM is not a 
b5e0: 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77  subquery or view
b5f0: 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72   */.  pTab = pSr
b600: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
b610: 69 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d  if( NEVER(pTab==
b620: 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
b630: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
b640: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20  Select==0 );    
b650: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
b660: 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
b670: 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73  view */.  if( Is
b680: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
b690: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
b6a0: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
b6b0: 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
b6c0: 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ble */.  pEList 
b6d0: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
b6e0: 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  f( pEList->nExpr
b6f0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
b700: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c        /* One col
b710: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
b720: 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70  t set */.  if( p
b730: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
b740: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
b750: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
b760: 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75  Result is a colu
b770: 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31  mn */.  return 1
b780: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b790: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b7a0: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  RY */../*.** Cod
b7b0: 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73  e an OP_Once ins
b7c0: 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c  truction and all
b7d0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
b7e0: 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e  its flag. Return
b7f0: 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73   the .** address
b800: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
b810: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ruction..*/.int 
b820: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
b830: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
b840: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
b850: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
b860: 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74  e);      /* Virt
b870: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
b880: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74  g coded */.  ret
b890: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
b8a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp1(v, OP_Once
b8b0: 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b  , pParse->nOnce+
b8c0: 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  +);.}../*.** Thi
b8d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
b8e0: 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
b8f0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b900: 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f  IN (...) operato
b910: 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72  r..** The pX par
b920: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78  ameter is the ex
b930: 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20  pression on the 
b940: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
b950: 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a  erator, which.**
b960: 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
b970: 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
b980: 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71  ssions or a subq
b990: 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
b9a0: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
b9b0: 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  ine is to find o
b9c0: 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
b9d0: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61  e object that ca
b9e0: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74  n.** be used eit
b9f0: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
ba00: 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68  membership in th
ba10: 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20  e RHS set or to 
ba20: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
ba30: 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  ** all members o
ba40: 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73  f the RHS set, s
ba50: 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74  kipping duplicat
ba60: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73  es..**.** A curs
ba70: 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  or is opened on 
ba80: 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
ba90: 74 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6f  t that the RHS o
baa0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
bab0: 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61  r.** and pX->iTa
bac0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ble is set to th
bad0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
bae0: 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
baf0: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
bb00: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
bb10: 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  n indicates the 
bb20: 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20  b-tree type, as 
bb30: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
bb40: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20   IN_INDEX_ROWID 
bb50: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
bb60: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
bb70: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
bb80: 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
bb90: 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
bba0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61  s opened on a da
bbb0: 74 61 62 61 73 65 20 69 6e 64 65 78 2e 0a 2a 2a  tabase index..**
bbc0: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20     IN_INDEX_EPH 
bbd0: 2d 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 77  -   The cursor w
bbe0: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73  as opened on a s
bbf0: 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64  pecially created
bc00: 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
bc10: 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
bc20: 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
bc30: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  able..**.** An e
bc40: 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d  xisting b-tree m
bc50: 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20  ight be used if 
bc60: 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69  the RHS expressi
bc70: 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c  on pX is a simpl
bc80: 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75  e.** subquery su
bc90: 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ch as:.**.**    
bca0: 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e   SELECT <column>
bcb0: 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a   FROM <table>.**
bcc0: 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f  .** If the RHS o
bcd0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
bce0: 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61  r is a list or a
bcf0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75   more complex su
bd00: 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20  bquery, then.** 
bd10: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
bd20: 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  le might need to
bd30: 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72   be generated fr
bd40: 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74  om the RHS and t
bd50: 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c  hen.** pX->iTabl
bd60: 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
bd70: 74 6f 20 74 68 65 20 65 70 68 65 72 6d 65 72 61  to the ephermera
bd80: 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  l table instead 
bd90: 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  of an.** existin
bda0: 67 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a  g table.  .**.**
bdb0: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
bdc0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
bdd0: 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  0, then the b-tr
bde0: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
bdf0: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
be00: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
be10: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
be20: 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20  any duplicates. 
be30: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a  In this case an.
be40: 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ** epheremal tab
be50: 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
be60: 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
be70: 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20  ted <column> is 
be80: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
be90: 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
bea0: 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
beb0: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
bec0: 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a  MARY KEY or it.*
bed0: 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 63  * has a UNIQUE c
bee0: 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49  onstraint or UNI
bef0: 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  QUE index..**.**
bf00: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
bf10: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
bf20: 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20  not 0, then the 
bf30: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
bf40: 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
bf50: 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
bf60: 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63  tests. In this c
bf70: 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  ase an epheremal
bf80: 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
bf90: 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
bfa0: 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e  column> is an IN
bfb0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
bfc0: 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61  Y or an index ca
bfd0: 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77  n .** be found w
bfe0: 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20  ith <column> as 
bff0: 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  its left-most co
c000: 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lumn..**.** When
c010: 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
c020: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
c030: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
c040: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
c050: 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  tion.** needs to
c060: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
c070: 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74 75   not the structu
c080: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53  re contains an S
c090: 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75  QL NULL .** valu
c0a0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  e in order to co
c0b0: 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65  rrectly evaluate
c0c0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b   expressions lik
c0d0: 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e  e "X IN (Y, Z)".
c0e0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
c0f0: 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20  any chance that 
c100: 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20  the (...) might 
c110: 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76  contain a NULL v
c120: 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69  alue at.** runti
c130: 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73  me, then a regis
c140: 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
c150: 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65   and the registe
c160: 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e  r number written
c170: 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75  .** to *prNotFou
c180: 6e 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  nd. If there is 
c190: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
c1a0: 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e  he (...) contain
c1b0: 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
c1c0: 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f  e, then *prNotFo
c1d0: 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68  und is left unch
c1e0: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
c1f0: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
c200: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20  located and its 
c210: 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  location stored 
c220: 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20  in *prNotFound, 
c230: 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74  then.** its init
c240: 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  ial value is NUL
c250: 4c 2e 20 20 49 66 20 74 68 65 20 28 2e 2e 2e 29  L.  If the (...)
c260: 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e   does not remain
c270: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
c280: 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66   the duration of
c290: 20 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e   the query (i.e.
c2a0: 20 74 68 65 20 53 45 4c 45 43 54 20 77 69 74 68   the SELECT with
c2b0: 69 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20  in the (...).** 
c2c0: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
c2d0: 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74  subquery) then t
c2e0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
c2f0: 61 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74  allocated regist
c300: 65 72 20 69 73 0a 2a 2a 20 72 65 73 65 74 20 74  er is.** reset t
c310: 6f 20 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d 65  o NULL each time
c320: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
c330: 20 72 65 72 75 6e 2e 20 54 68 69 73 20 61 6c 6c   rerun. This all
c340: 6f 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65  ows the.** calle
c350: 72 20 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f  r to use vdbe co
c360: 64 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  de equivalent to
c370: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
c380: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67 69  **.**   if( regi
c390: 73 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a  ster==NULL ){.**
c3a0: 20 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20       has_null = 
c3b0: 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74  <test if data st
c3c0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
c3d0: 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65   null>.**     re
c3e0: 67 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20  gister = 1.**   
c3f0: 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  }.**.** in order
c400: 20 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e   to avoid runnin
c410: 67 20 74 68 65 20 3c 74 65 73 74 20 69 66 20 64  g the <test if d
c420: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
c430: 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20  ntains null>.** 
c440: 74 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20  test more often 
c450: 74 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61 72  than is necessar
c460: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
c470: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
c480: 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  RY.int sqlite3Fi
c490: 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20  ndInIndex(Parse 
c4a0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
c4b0: 58 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75  X, int *prNotFou
c4c0: 6e 64 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  nd){.  Select *p
c4d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c4f0: 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69  SELECT to the ri
c500: 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ght of IN operat
c510: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  or */.  int eTyp
c520: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c540: 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62   Type of RHS tab
c550: 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a  le. IN_INDEX_* *
c560: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
c570: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
c580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
c590: 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74  sor of the RHS t
c5a0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
c5b0: 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 70 72  stBeUnique = (pr
c5c0: 4e 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20  NotFound==0);   
c5d0: 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d  /* True if RHS m
c5e0: 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f  ust be unique */
c5f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
c600: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
c610: 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74  se);     /* Virt
c620: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
c630: 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73  g coded */..  as
c640: 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
c650: 5f 49 4e 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  _IN );..  /* Che
c660: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20  ck to see if an 
c670: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
c680: 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  r index can be u
c690: 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69  sed to.  ** sati
c6a0: 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20  sfy the query.  
c6b0: 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62  This is preferab
c6c0: 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67  le to generating
c6d0: 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68   a new .  ** eph
c6e0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20  emeral table..  
c6f0: 2a 2f 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61  */.  p = (ExprHa
c700: 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
c710: 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58  _xIsSelect) ? pX
c720: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29  ->x.pSelect : 0)
c730: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
c740: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20  Parse->nErr==0) 
c750: 26 26 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  && isCandidateFo
c760: 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20  rInOpt(p) ){.   
c770: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c780: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
c790: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
c7a0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
c7b0: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
c7c0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c7e0: 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a  Table <table>. *
c7f0: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  /.    Expr *pExp
c800: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c820: 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75  Expression <colu
c830: 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  mn> */.    int i
c840: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c860: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
c870: 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f  lumn <column> */
c880: 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c8b0: 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20  atabase idx for 
c8c0: 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73  pTab */..    ass
c8d0: 65 72 74 28 20 70 20 29 3b 20 20 20 20 20 20 20  ert( p );       
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c900: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c910: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
c920: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d  ert( p->pEList!=
c930: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
c940: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c950: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c960: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
c970: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
c980: 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
c990: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c9a0: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c9b0: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
c9c0: 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20  ert( p->pSrc!=0 
c9d0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
c9e0: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c9f0: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
ca00: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61  pt(p) */.    pTa
ca10: 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
ca20: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70  ].pTab;.    pExp
ca30: 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
ca40: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [0].pExpr;.    i
ca50: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
ca60: 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20 2f 2a  lumn;.   .    /*
ca70: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 56 65 72 69   Code an OP_Veri
ca80: 66 79 43 6f 6f 6b 69 65 20 61 6e 64 20 4f 50 5f  fyCookie and OP_
ca90: 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74  TableLock for <t
caa0: 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44  able>. */.    iD
cab0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cac0: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
cad0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
cae0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
caf0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
cb00: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
cb10: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
cb20: 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
cb30: 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
cb40: 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ame);..    /* Th
cb50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
cb60: 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
cb70: 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62  two places. In b
cb80: 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64  oth cases the vd
cb90: 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c  be.    ** has al
cba0: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
cbb0: 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20  ated. So assume 
cbc0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29  sqlite3GetVdbe()
cbd0: 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a   is always.    *
cbe0: 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72  * successful her
cbf0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
cc00: 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28  sert(v);.    if(
cc10: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
cc20: 20 69 6e 74 20 69 41 64 64 72 3b 0a 0a 20 20 20   int iAddr;..   
cc30: 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74     iAddr = sqlit
cc40: 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
cc50: 65 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  e);..      sqlit
cc60: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
cc70: 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
cc80: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
cc90: 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
cca0: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
ccb0: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
ccc0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
ccd0: 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Addr);.    }else
cce0: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
ccf0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd10: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
cd20: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  e */..      /* T
cd30: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
cd40: 75 65 6e 63 65 20 75 73 65 64 20 62 79 20 74 68  uence used by th
cd50: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66  e comparison. If
cd60: 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 0a   an index is to.
cd70: 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64        ** be used
cd80: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74   in place of a t
cd90: 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75  emp-table, it mu
cda0: 73 74 20 62 65 20 6f 72 64 65 72 65 64 20 61 63  st be ordered ac
cdb0: 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a  cording.      **
cdc0: 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69   to this collati
cdd0: 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f  on sequence.  */
cde0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
cdf0: 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69  pReq = sqlite3Bi
ce00: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
ce10: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
ce20: 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20  Left, pExpr);.. 
ce30: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
ce40: 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
ce50: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
ce60: 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  d to perform the
ce70: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61   .      ** compa
ce80: 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  rison is the sam
ce90: 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74  e as the affinit
cea0: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  y of the column.
ceb0: 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   If.      ** it 
cec0: 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f  is not, it is no
ced0: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
cee0: 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20  e any index..   
cef0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
cf00: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71  affinity_ok = sq
cf10: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
cf20: 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d 3e 61  tyOk(pX, pTab->a
cf30: 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
cf40: 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  ty);..      for(
cf50: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
cf60: 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65  x; pIdx && eType
cf70: 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f  ==0 && affinity_
cf80: 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  ok; pIdx=pIdx->p
cf90: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
cfa0: 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  f( (pIdx->aiColu
cfb0: 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20  mn[0]==iCol).   
cfc0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
cfd0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
cfe0: 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e 61  ENC(db), pIdx->a
cff0: 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52  zColl[0], 0)==pR
d000: 65 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  eq.         && (
d010: 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c  !mustBeUnique ||
d020: 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d   (pIdx->nColumn=
d030: 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72  =1 && pIdx->onEr
d040: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20  ror!=OE_None)). 
d050: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
d060: 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20      int iAddr;. 
d070: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
d080: 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Key;.  .        
d090: 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a    pKey = (char *
d0a0: 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  )sqlite3IndexKey
d0b0: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
d0c0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 41  x);.          iA
d0d0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
d0e0: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20  eOnce(pParse);. 
d0f0: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
d100: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
d110: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
d120: 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ab, pIdx->tnum, 
d130: 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
d140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d150: 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59 49      pKey,P4_KEYI
d160: 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
d170: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
d180: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
d190: 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
d1a0: 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
d1b0: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a 0a  N_INDEX_INDEX;..
d1c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d1d0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
d1e0: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20   iAddr);.       
d1f0: 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e     if( prNotFoun
d200: 64 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c  d && !pTab->aCol
d210: 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29  [iCol].notNull )
d220: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
d230: 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50  rNotFound = ++pP
d240: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
d250: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d260: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d270: 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74 46  Null, 0, *prNotF
d280: 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ound);.         
d290: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
d2a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
d2b0: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29    if( eType==0 )
d2c0: 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e  {.    /* Could n
d2d0: 6f 74 20 66 6f 75 6e 64 20 61 6e 20 65 78 69 73  ot found an exis
d2e0: 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
d2f0: 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68  dex to use as th
d300: 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20  e RHS b-tree..  
d310: 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76    ** We will hav
d320: 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
d330: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
d340: 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a   to do the job..
d350: 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c      */.    doubl
d360: 65 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  e savedNQueryLoo
d370: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
d380: 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  ryLoop;.    int 
d390: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
d3a0: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
d3b0: 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20  _INDEX_EPH;.    
d3c0: 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29  if( prNotFound )
d3d0: 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f  {.      *prNotFo
d3e0: 75 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e 75  und = rMayHaveNu
d3f0: 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
d400: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
d410: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d420: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72 4e  OP_Null, 0, *prN
d430: 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 7d 65  otFound);.    }e
d440: 6c 73 65 7b 0a 20 20 20 20 20 20 74 65 73 74 63  lse{.      testc
d450: 61 73 65 28 20 70 50 61 72 73 65 2d 3e 6e 51 75  ase( pParse->nQu
d460: 65 72 79 4c 6f 6f 70 3e 28 64 6f 75 62 6c 65 29  eryLoop>(double)
d470: 31 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  1 );.      pPars
d480: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
d490: 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 20 20 20  (double)1;.     
d4a0: 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
d4b0: 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
d4c0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
d4d0: 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
d4e0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54  t) ){.        eT
d4f0: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
d500: 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OWID;.      }.  
d510: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
d520: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
d530: 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
d540: 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
d550: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
d560: 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
d570: 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75  yLoop = savedNQu
d580: 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  eryLoop;.  }else
d590: 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65  {.    pX->iTable
d5a0: 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72   = iTab;.  }.  r
d5b0: 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23  eturn eType;.}.#
d5c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
d5d0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73  erate code for s
d5e0: 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73  calar subqueries
d5f0: 20 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75   used as a subqu
d600: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ery expression, 
d610: 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e  EXISTS,.** or IN
d620: 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61   operators.  Exa
d630: 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
d640: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
d650: 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73  b)          -- s
d660: 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45  ubquery.**     E
d670: 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20  XISTS (SELECT a 
d680: 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49  FROM b)   -- EXI
d690: 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20  STS subquery.** 
d6a0: 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31      x IN (4,5,11
d6b0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  )              -
d6c0: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
d6d0: 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74  th list on right
d6e0: 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20  -hand side.**   
d6f0: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61    x IN (SELECT a
d700: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20   FROM b)     -- 
d710: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
d720: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
d730: 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65   right.**.** The
d740: 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
d750: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65   describes the e
d760: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
d770: 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a  ontains the IN.*
d780: 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75  * operator or su
d790: 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  bquery..**.** If
d7a0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77   parameter isRow
d7b0: 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  id is non-zero, 
d7c0: 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
d7d0: 70 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74  pExpr is guarant
d7e0: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20  eed.** to be of 
d7f0: 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64  the form "<rowid
d800: 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c  > IN (?, ?, ?)",
d810: 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69   where <rowid> i
d820: 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  s a reference.**
d830: 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72   to some integer
d840: 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61   key column of a
d850: 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49   table B-Tree. I
d860: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65  n this case, use
d870: 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d   an.** intkey B-
d880: 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68  Tree to store th
d890: 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29  e set of IN(...)
d8a0: 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20   values instead 
d8b0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
d8c0: 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c  (slower) variabl
d8d0: 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d  e length keys B-
d8e0: 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  Tree..**.** If r
d8f0: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e  MayHaveNull is n
d900: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65  on-zero, that me
d910: 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65  ans that the ope
d920: 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a  ration is an IN.
d930: 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54  ** (not a SELECT
d940: 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20   or EXISTS) and 
d950: 74 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67  that the RHS mig
d960: 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  ht contains NULL
d970: 73 2e 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72  s..** Furthermor
d980: 65 2c 20 74 68 65 20 49 4e 20 69 73 20 69 6e 20  e, the IN is in 
d990: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  a WHERE clause a
d9a0: 6e 64 20 74 68 61 74 20 77 65 20 72 65 61 6c 6c  nd that we reall
d9b0: 79 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 69 74 65  y want.** to ite
d9c0: 72 61 74 65 20 6f 76 65 72 20 74 68 65 20 52 48  rate over the RH
d9d0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
d9e0: 61 74 6f 72 20 69 6e 20 6f 72 64 65 72 20 74 6f  ator in order to
d9f0: 20 71 75 69 63 6b 6c 79 20 6c 6f 63 61 74 65 0a   quickly locate.
da00: 2a 2a 20 61 6c 6c 20 63 6f 72 72 65 73 70 6f 6e  ** all correspon
da10: 64 69 6e 67 20 4c 48 53 20 65 6c 65 6d 65 6e 74  ding LHS element
da20: 73 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  s.  All this rou
da30: 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69  tine does is ini
da40: 74 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20 72  tialize.** the r
da50: 65 67 69 73 74 65 72 20 67 69 76 65 6e 20 62 79  egister given by
da60: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 74 6f   rMayHaveNull to
da70: 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20   NULL.  Calling 
da80: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61  routines will ta
da90: 6b 65 0a 2a 2a 20 63 61 72 65 20 6f 66 20 63 68  ke.** care of ch
daa0: 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67 69  anging this regi
dab0: 73 74 65 72 20 76 61 6c 75 65 20 74 6f 20 6e 6f  ster value to no
dac0: 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48  n-NULL if the RH
dad0: 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a  S is NULL-free..
dae0: 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76  **.** If rMayHav
daf0: 65 4e 75 6c 6c 20 69 73 20 7a 65 72 6f 2c 20 74  eNull is zero, t
db00: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
db10: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 62  he subquery is b
db20: 65 69 6e 67 20 75 73 65 64 0a 2a 2a 20 66 6f 72  eing used.** for
db30: 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
db40: 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 72 65  ing only.  There
db50: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69   is no need to i
db60: 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 0a 2a 2a  nitialize any.**
db70: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 69 6e   registers to in
db80: 64 69 63 61 74 65 20 74 68 65 20 70 72 65 73 65  dicate the prese
db90: 6e 73 65 20 6f 72 20 61 62 73 65 6e 63 65 20 6f  nse or absence o
dba0: 66 20 4e 55 4c 4c 73 20 6f 6e 20 74 68 65 20 52  f NULLs on the R
dbb0: 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  HS..**.** For a 
dbc0: 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
dbd0: 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72   operator, retur
dbe0: 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74  n the register t
dbf0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a  hat holds the.**
dc00: 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e   result.  For IN
dc10: 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66   operators or if
dc20: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
dc30: 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  , the return val
dc40: 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e  ue is 0..*/.#ifn
dc50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dc60: 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
dc70: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
dc80: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
dc90: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
dca0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
dcb0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
dcc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
dcd0: 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20  The IN, SELECT, 
dce0: 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
dcf0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d 61 79  or */.  int rMay
dd00: 48 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20 20 20  HaveNull,       
dd10: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
dd20: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
dd30: 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20   NULLs exist in 
dd40: 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  RHS */.  int isR
dd50: 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
dd60: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53   /* If true, LHS
dd70: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
dd80: 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b  is a rowid */.){
dd90: 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20  .  int testAddr 
dda0: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
ddb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
ddc0: 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
ddd0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65  ess */.  int rRe
dde0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
de10: 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
de20: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
de30: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
de40: 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  rse);.  if( NEVE
de50: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
de60: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
de70: 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
de80: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  e);..  /* This c
de90: 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20  ode must be run 
dea0: 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20  in its entirety 
deb0: 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73  every time it is
dec0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
ded0: 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * if any of the 
dee0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
def0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
df00: 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
df10: 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72  d side is a corr
df20: 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a  elated subquery.
df30: 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
df40: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
df50: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
df60: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
df70: 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20  variables.  **  
df80: 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69    *  We are insi
df90: 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a  de a trigger.  *
dfa0: 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  *.  ** If all of
dfb0: 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66   the above are f
dfc0: 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61  alse, then we ca
dfd0: 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  n run this code 
dfe0: 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73  just once.  ** s
dff0: 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c  ave the results,
e000: 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73   and reuse the s
e010: 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75  ame result on su
e020: 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
e030: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
e040: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
e050: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
e060: 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  arSelect) ){.   
e070: 20 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69   testAddr = sqli
e080: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
e090: 73 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  se);.  }..#ifnde
e0a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
e0b0: 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72  PLAIN.  if( pPar
e0c0: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
e0d0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  {.    char *zMsg
e0e0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
e0f0: 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  f(.        pPars
e100: 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20  e->db, "EXECUTE 
e110: 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64  %s%s SUBQUERY %d
e120: 22 2c 20 74 65 73 74 41 64 64 72 3e 3d 30 3f 22  ", testAddr>=0?"
e130: 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c  ":"CORRELATED ",
e140: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
e150: 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22  op==TK_IN?"LIST"
e160: 3a 22 53 43 41 4c 41 52 22 2c 20 70 50 61 72 73  :"SCALAR", pPars
e170: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
e180: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
e190: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
e1a0: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
e1b0: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
e1c0: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
e1d0: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e  YNAMIC);.  }.#en
e1e0: 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70  dif..  switch( p
e1f0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
e200: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
e210: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
e220: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
e230: 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  /* Affinity of t
e240: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
e250: 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   */.      KeyInf
e260: 6f 20 6b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  o keyInfo;      
e270: 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f        /* Keyinfo
e280: 20 66 6f 72 20 74 68 65 20 67 65 6e 65 72 61 74   for the generat
e290: 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ed table */.    
e2a0: 20 20 73 74 61 74 69 63 20 75 38 20 73 6f 72 74    static u8 sort
e2b0: 4f 72 64 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a  Order = 0;    /*
e2c0: 20 46 61 6b 65 20 61 53 6f 72 74 4f 72 64 65 72   Fake aSortOrder
e2d0: 20 66 6f 72 20 6b 65 79 49 6e 66 6f 20 2a 2f 0a   for keyInfo */.
e2e0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20        int addr; 
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
e310: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
e320: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
e330: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
e340: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
e350: 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20  ; /* the LHS of 
e360: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
e370: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d  */..      if( rM
e380: 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20  ayHaveNull ){.  
e390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e3a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
e3b0: 6c 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e  ll, 0, rMayHaveN
e3c0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ull);.      }.. 
e3d0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
e3e0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
e3f0: 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20  ity(pLeft);..   
e400: 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68     /* Whether th
e410: 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53  is is an 'x IN(S
e420: 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e  ELECT...)' or an
e430: 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74   'x IN(<exprlist
e440: 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  >)'.      ** exp
e450: 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61  ression it is ha
e460: 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77  ndled the same w
e470: 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61  ay.  An ephemera
e480: 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20  l table is .    
e490: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
e4a0: 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e   single-field in
e4b0: 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
e4c0: 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
e4d0: 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
e4e0: 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68  the SELECT or th
e4f0: 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
e500: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
e510: 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
e520: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
e530: 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
e540: 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
e550: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
e560: 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
e570: 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
e580: 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
e590: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
e5a0: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
e5b0: 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
e5c0: 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
e5d0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
e5e0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
e5f0: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
e600: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
e610: 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
e620: 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
e630: 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
e640: 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
e650: 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
e660: 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
e670: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
e680: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
e690: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
e6a0: 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
e6b0: 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
e6c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
e6d0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
e6e0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
e6f0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
e700: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e710: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
e720: 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  l, pExpr->iTable
e730: 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20  , !isRowid);.   
e740: 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e     if( rMayHaveN
e750: 75 6c 6c 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  ull==0 ) sqlite3
e760: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
e770: 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
e780: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
e790: 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  keyInfo, 0, size
e7a0: 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20  of(keyInfo));.  
e7b0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65      keyInfo.nFie
e7c0: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 6b 65  ld = 1;.      ke
e7d0: 79 49 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72  yInfo.aSortOrder
e7e0: 20 3d 20 26 73 6f 72 74 4f 72 64 65 72 3b 0a 0a   = &sortOrder;..
e7f0: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
e800: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
e810: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
e820: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
e830: 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
e840: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
e850: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
e860: 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
e870: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
e880: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
e890: 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
e8a0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
e8b0: 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
e8c0: 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
e8d0: 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
e8e0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
e8f0: 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
e900: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
e910: 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  t;..        asse
e920: 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
e930: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
e940: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
e950: 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
e960: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
e970: 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 53 64        dest.affSd
e980: 73 74 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74  st = (u8)affinit
e990: 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  y;.        asser
e9a0: 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c  t( (pExpr->iTabl
e9b0: 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70  e&0x0000FFFF)==p
e9c0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
e9d0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
e9e0: 2e 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74  .pSelect->iLimit
e9f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
ea00: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
ea10: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78  pParse, pExpr->x
ea20: 2e 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29  .pSelect, &dest)
ea30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
ea40: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
ea50: 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  }.        pEList
ea60: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
ea70: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
ea80: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
ea90: 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 4c  pEList!=0 && pEL
eaa0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 20 29 7b  ist->nExpr>0) ){
eab0: 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49   .          keyI
eac0: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  nfo.aColl[0] = s
ead0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
eae0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
eaf0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
eb00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
eb10: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
eb20: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
eb30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
eb40: 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
eb50: 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
eb60: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
eb70: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
eb80: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
eb90: 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65          ** For e
eba0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
ebb0: 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
ebc0: 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
ebd0: 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
ebe0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
ebf0: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
ec00: 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
ec10: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
ec20: 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
ec30: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
ec40: 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
ec50: 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
ec60: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
ec70: 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
ec80: 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
ec90: 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
eca0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
ecb0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
ecc0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
ecd0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
ece0: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
ecf0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
ed00: 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  pItem;.        i
ed10: 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a  nt r1, r2, r3;..
ed20: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66          if( !aff
ed30: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
ed40: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51     affinity = SQ
ed50: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
ed60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ed70: 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30   keyInfo.aColl[0
ed80: 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
ed90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
eda0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
edb0: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 53        keyInfo.aS
edc0: 6f 72 74 4f 72 64 65 72 20 3d 20 26 73 6f 72 74  ortOrder = &sort
edd0: 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20 20 20 20  Order;..        
ede0: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
edf0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
ee00: 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
ee10: 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  /.        r1 = s
ee20: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
ee30: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
ee40: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
ee50: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ee60: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ee70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ee80: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a  P_Null, 0, r2);.
ee90: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c          for(i=pL
eea0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
eeb0: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  m=pList->a; i>0;
eec0: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
eed0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
eee0: 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
eef0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  pr;.          in
ef00: 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20  t iValToIns;..  
ef10: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
ef20: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ef30: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
ef40: 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
ef50: 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
ef60: 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
ef70: 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
ef80: 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
ef90: 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
efa0: 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
efb0: 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
efc0: 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
efd0: 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
efe0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
eff0: 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
f000: 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
f010: 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
f020: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f030: 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64       if( testAdd
f040: 72 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  r>=0 && !sqlite3
f050: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
f060: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
f070: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f080: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65  angeToNoop(v, te
f090: 73 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20  stAddr);.       
f0a0: 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20       testAddr = 
f0b0: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -1;.          }.
f0c0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
f0d0: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
f0e0: 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
f0f0: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
f100: 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
f110: 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
f120: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
f130: 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69  sInteger(pE2, &i
f140: 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20  ValToIns) ){.   
f150: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f160: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f170: 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70  _InsertInt, pExp
f180: 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69  r->iTable, r2, i
f190: 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20  ValToIns);.     
f1a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f1b0: 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c          r3 = sql
f1c0: 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
f1d0: 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20  et(pParse, pE2, 
f1e0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
f1f0: 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a   if( isRowid ){.
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f220: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
f230: 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f260: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
f270: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f290: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
f2a0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
f2b0: 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  r2, r3);.       
f2c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f2d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f2e0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
f2f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
f300: 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
f310: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
f320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f330: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
f340: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c  ange(pParse, r3,
f350: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
f360: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f370: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
f380: 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
f390: 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  ble, r2);.      
f3a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f3b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
f3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
f3d0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
f3e0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
f3f0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f400: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f410: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
f420: 20 20 69 66 28 20 21 69 73 52 6f 77 69 64 20 29    if( !isRowid )
f430: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f440: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
f450: 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26   addr, (void *)&
f460: 6b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  keyInfo, P4_KEYI
f470: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
f480: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f490: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
f4a0: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
f4b0: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65  K_SELECT:.    de
f4c0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
f4d0: 2a 20 49 66 20 74 68 69 73 20 68 61 73 20 74 6f  * If this has to
f4e0: 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
f4f0: 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
f500: 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
f510: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
f520: 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
f530: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
f540: 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
f550: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
f560: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
f570: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20  in iColumn.  If 
f580: 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54  this is an EXIST
f590: 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  S, write.      *
f5a0: 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28  * an integer 0 (
f5b0: 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31  not exists) or 1
f5c0: 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61   (exists) into a
f5d0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20   memory cell.   
f5e0: 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64     ** and record
f5f0: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
f600: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20  l in iColumn..  
f610: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c      */.      Sel
f620: 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
f650: 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
f660: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
f670: 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77  /* How to deal w
f6a0: 69 74 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c  ith SELECt resul
f6b0: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  t */..      test
f6c0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
f6d0: 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
f6e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
f6f0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
f700: 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
f710: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
f720: 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
f730: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
f740: 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72   );..      asser
f750: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
f760: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
f770: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
f780: 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
f790: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
f7a0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
f7b0: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20  tInit(&dest, 0, 
f7c0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b  ++pParse->nMem);
f7d0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
f7e0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
f7f0: 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  ){.        dest.
f800: 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b  eDest = SRT_Mem;
f810: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f820: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f830: 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
f840: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  SDParm);.       
f850: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
f860: 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
f870: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
f880: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f890: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
f8a0: 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
f8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f8c0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
f8d0: 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
f8e0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
f8f0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
f900: 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
f910: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
f920: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
f930: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
f940: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  pSel->pLimit);. 
f950: 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
f960: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
f970: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45  (pParse, TK_INTE
f980: 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  GER, 0, 0,.     
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 71               &sq
f9b0: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
f9c0: 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  ]);.      pSel->
f9d0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
f9e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
f9f0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
fa00: 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
fa10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
fa20: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67      }.      rReg
fa30: 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
fa40: 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 49 72  .      ExprSetIr
fa50: 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72 29  reducible(pExpr)
fa60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fa70: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
fa80: 74 65 73 74 41 64 64 72 3e 3d 30 20 29 7b 0a 20  testAddr>=0 ){. 
fa90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
faa0: 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41 64  mpHere(v, testAd
fab0: 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  dr);.  }.  sqlit
fac0: 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
fad0: 50 61 72 73 65 2c 20 31 29 3b 0a 0a 20 20 72 65  Parse, 1);..  re
fae0: 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
faf0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
fb00: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
fb10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fb20: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
fb30: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
fb40: 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65   for an IN expre
fb50: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
fb60: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
fb70: 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  ..).**      x IN
fb80: 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
fb90: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ...).**.** The l
fba0: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c  eft-hand side (L
fbb0: 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20  HS) is a scalar 
fbc0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
fbd0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
fbe0: 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20   (RHS).** is an 
fbf0: 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72  array of zero or
fc00: 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54   more values.  T
fc10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
fc20: 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53   true if the LHS
fc30: 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64   is.** contained
fc40: 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
fc50: 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74    The value of t
fc60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
fc70: 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a   unknown (NULL).
fc80: 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ** if the LHS is
fc90: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
fca0: 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
fcb0: 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
fcc0: 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52  RHS and the.** R
fcd0: 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  HS contains one 
fce0: 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
fcf0: 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ues..**.** This 
fd00: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
fd10: 73 20 63 6f 64 65 20 77 69 6c 6c 20 6a 75 6d 70  s code will jump
fd20: 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20   to destIfFalse 
fd30: 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
fd40: 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20  t .** contained 
fd50: 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
fd60: 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73   If due to NULLs
fd70: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
fd80: 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a  mine if the LHS.
fd90: 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ** is contained 
fda0: 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
fdb0: 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75  jump to destIfNu
fdc0: 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20  ll.  If the LHS 
fdd0: 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  is contained.** 
fde0: 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74  within the RHS t
fdf0: 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
fe00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fe10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
fe20: 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  IN(.  Parse *pPa
fe30: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
fe40: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
fe50: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
fe60: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
fe70: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
fe80: 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69   The IN expressi
fe90: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
fea0: 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a  IfFalse,      /*
feb0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48   Jump here if LH
fec0: 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
fed0: 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f  ed in the RHS */
fee0: 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c  .  int destIfNul
fef0: 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  l        /* Jump
ff00: 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73   here if the res
ff10: 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e  ults are unknown
ff20: 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f   due to NULLs */
ff30: 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61  .){.  int rRhsHa
ff40: 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52  sNull = 0;  /* R
ff50: 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20  egister that is 
ff60: 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74  true if RHS cont
ff70: 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
ff80: 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e   */.  char affin
ff90: 69 74 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  ity;        /* C
ffa0: 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69  omparison affini
ffb0: 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69  ty to use */.  i
ffc0: 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  nt eType;       
ffd0: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
ffe0: 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
fff0: 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
10000 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
10010 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
10020 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
10030 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
10040 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
10050 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  ruction */..  /*
10060 20 43 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   Compute the RHS
10070 2e 20 20 20 41 66 74 65 72 20 74 68 69 73 20 73  .   After this s
10080 74 65 70 2c 20 74 68 65 20 74 61 62 6c 65 20 77  tep, the table w
10090 69 74 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  ith cursor.  ** 
100a0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 77 69  pExpr->iTable wi
100b0 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ll contains the 
100c0 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
100d0 20 75 70 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   up the RHS..  *
100e0 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
100f0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
10100 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
10110 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
10120 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
10130 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
10140 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
10150 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
10160 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
10170 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
10180 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 52  arse, pExpr, &rR
10190 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f  hsHasNull);..  /
101a0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
101b0 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   affinity to use
101c0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79   to create a key
101d0 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74   from the result
101e0 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78  s.  ** of the ex
101f0 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69  pression. affini
10200 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73  tyStr stores a s
10210 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69  tatic string sui
10220 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50  table for.  ** P
10230 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4 of OP_MakeReco
10240 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e  rd..  */.  affin
10250 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  ity = comparison
10260 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
10270 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20  ..  /* Code the 
10280 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20  LHS, the <expr> 
10290 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20  from "<expr> IN 
102a0 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73  (...)"..  */.  s
102b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
102c0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72  ush(pParse);.  r
102d0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
102e0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
102f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10300 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10310 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20 2f  pLeft, r1);..  /
10320 2a 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20  * If the LHS is 
10330 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72  NULL, then the r
10340 65 73 75 6c 74 20 69 73 20 65 69 74 68 65 72 20  esult is either 
10350 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65  false or NULL de
10360 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20  pending.  ** on 
10370 77 68 65 74 68 65 72 20 74 68 65 20 52 48 53 20  whether the RHS 
10380 69 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c  is empty or not,
10390 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
103a0 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66   */.  if( destIf
103b0 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
103c0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 72  e ){.    /* Shor
103d0 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 6f 6d  tcut for the com
103e0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
103f0 68 65 20 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c  he false and NUL
10400 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a 20  L outcomes are. 
10410 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20     ** the same. 
10420 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
10430 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10440 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49  sNull, r1, destI
10450 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  fNull);.  }else{
10460 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d  .    int addr1 =
10470 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10480 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
10490 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r1);.    sqlit
104a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
104b0 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72  OP_Rewind, pExpr
104c0 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
104d0 46 61 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  False);.    sqli
104e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
104f0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
10500 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  tIfNull);.    sq
10510 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10520 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 7d  e(v, addr1);.  }
10530 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49  ..  if( eType==I
10540 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
10550 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
10560 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73  case, the RHS is
10570 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61   the ROWID of ta
10580 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20 2a  ble b-tree.    *
10590 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
105a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
105b0 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64 65 73  stBeInt, r1, des
105c0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 73  tIfFalse);.    s
105d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
105e0 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
105f0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10600 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
10610 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10620 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
10630 20 74 68 65 20 52 48 53 20 69 73 20 61 6e 20 69   the RHS is an i
10640 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20 20 20  ndex b-tree..   
10650 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
10660 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10670 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c  Affinity, r1, 1,
10680 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
10690 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
106a0 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  e set membership
106b0 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65   test fails, the
106c0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
106d0 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 78 20 49  the .    ** "x I
106e0 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73  N (...)" express
106f0 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68  ion must be eith
10700 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66  er 0 or NULL. If
10710 20 74 68 65 20 73 65 74 0a 20 20 20 20 2a 2a 20   the set.    ** 
10720 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
10730 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68   values, then th
10740 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49  e result is 0. I
10750 66 20 74 68 65 20 73 65 74 20 0a 20 20 20 20 2a  f the set .    *
10760 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  * contains one o
10770 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
10780 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
10790 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ult of the.    *
107a0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  * expression is 
107b0 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  also NULL..    *
107c0 2f 0a 20 20 20 20 69 66 28 20 72 52 68 73 48 61  /.    if( rRhsHa
107d0 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20 64 65 73 74  sNull==0 || dest
107e0 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
107f0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ull ){.      /* 
10800 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
10810 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20   if it is known 
10820 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  at compile time 
10830 74 68 61 74 20 74 68 65 20 52 48 53 0a 20 20 20  that the RHS.   
10840 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e     ** cannot con
10850 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73  tain NULL values
10860 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 61  . This happens a
10870 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  s the result.   
10880 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20     ** of a "NOT 
10890 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
108a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
108b0 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 20 20 2a   schema..      *
108c0 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20  *.      ** Also 
108d0 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20  run this branch 
108e0 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76  if NULL is equiv
108f0 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20  alent to FALSE. 
10900 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73       ** for this
10910 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f   particular IN o
10920 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20 20 2a  perator..      *
10930 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
10940 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
10950 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78  OP_NotFound, pEx
10960 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
10970 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b  IfFalse, r1, 1);
10980 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ..    }else{.   
10990 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72     /* In this br
109a0 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66  anch, the RHS of
109b0 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f   the IN might co
109c0 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64  ntain a NULL and
109d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
109e0 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c  esence of a NULL
109f0 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65   on the RHS make
10a00 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 20 69  s a difference i
10a10 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f  n the.      ** o
10a20 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 2a 2f  utcome..      */
10a30 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  .      int j1, j
10a40 32 2c 20 6a 33 3b 0a 0a 20 20 20 20 20 20 2f 2a  2, j3;..      /*
10a50 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
10a60 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  see if the LHS i
10a70 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
10a80 68 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a  he RHS.  If so,.
10a90 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
10aa0 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55  e presence of NU
10ab0 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 64  LLs in the RHS d
10ac0 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2c 20  oes not matter, 
10ad0 73 6f 20 6a 75 6d 70 0a 20 20 20 20 20 20 2a 2a  so jump.      **
10ae0 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
10af0 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f   code that follo
10b00 77 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ws..      */.   
10b10 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
10b20 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
10b30 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
10b40 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20  >iTable, 0, r1, 
10b50 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 48 65  1);..      /* He
10b60 72 65 20 77 65 20 62 65 67 69 6e 20 67 65 6e 65  re we begin gene
10b70 72 61 74 69 6e 67 20 63 6f 64 65 20 74 68 61 74  rating code that
10b80 20 72 75 6e 73 20 69 66 20 74 68 65 20 4c 48 53   runs if the LHS
10b90 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   is not.      **
10ba0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
10bb0 6e 20 74 68 65 20 52 48 53 2e 20 20 47 65 6e 65  n the RHS.  Gene
10bc0 72 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  rate additional 
10bd0 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 20 20  code that.      
10be0 2a 2a 20 74 65 73 74 73 20 74 68 65 20 52 48 53  ** tests the RHS
10bf0 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20 49 66 20   for NULLs.  If 
10c00 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  the RHS contains
10c10 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a 20 20 20   a NULL then.   
10c20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65     ** jump to de
10c30 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
10c40 65 72 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 73  ere are no NULLs
10c50 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
10c60 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74  .      ** jump t
10c70 6f 20 64 65 73 74 49 66 46 61 6c 73 65 2e 0a 20  o destIfFalse.. 
10c80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 32       */.      j2
10c90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10ca0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp1(v, OP_NotNu
10cb0 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 29  ll, rRhsHasNull)
10cc0 3b 0a 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c  ;.      j3 = sql
10cd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
10ce0 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  t(v, OP_Found, p
10cf0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
10d00 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29   rRhsHasNull, 1)
10d10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10d20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10d30 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 52 68  Integer, -1, rRh
10d40 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
10d50 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10d60 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20  Here(v, j3);.   
10d70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10d80 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
10d90 6d 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  m, rRhsHasNull, 
10da0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
10db0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10dc0 20 6a 32 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   j2);..      /* 
10dd0 4a 75 6d 70 20 74 6f 20 74 68 65 20 61 70 70 72  Jump to the appr
10de0 6f 70 72 69 61 74 65 20 74 61 72 67 65 74 20 64  opriate target d
10df0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
10e00 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 20  her or not.     
10e10 20 2a 2a 20 74 68 65 20 52 48 53 20 63 6f 6e 74   ** the RHS cont
10e20 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 20 20 20 20  ains a NULL.    
10e30 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
10e40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10e50 4f 50 5f 49 66 2c 20 72 52 68 73 48 61 73 4e 75  OP_If, rRhsHasNu
10e60 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  ll, destIfNull);
10e70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10e80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
10e90 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61  oto, 0, destIfFa
10ea0 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  lse);..      /* 
10eb0 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20 61 74 20  The OP_Found at 
10ec0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20  the top of this 
10ed0 62 72 61 6e 63 68 20 6a 75 6d 70 73 20 68 65 72  branch jumps her
10ee0 65 20 77 68 65 6e 20 74 72 75 65 2c 20 0a 20 20  e when true, .  
10ef0 20 20 20 20 2a 2a 20 63 61 75 73 69 6e 67 20 74      ** causing t
10f00 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e 20 65 78  he overall IN ex
10f10 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
10f20 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f  ion to fall thro
10f30 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ugh..      */.  
10f40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
10f50 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
10f60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
10f70 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
10f80 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
10f90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
10fa0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
10fb0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
10fc0 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22  v, "end IN expr"
10fd0 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
10fe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
10ff0 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  UERY */../*.** D
11000 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79  uplicate an 8-by
11010 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74  te value.*/.stat
11020 69 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74  ic char *dup8byt
11030 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  es(Vdbe *v, cons
11040 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63  t char *in){.  c
11050 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74  har *out = sqlit
11060 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71  e3DbMallocRaw(sq
11070 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
11080 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b  8);.  if( out ){
11090 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c  .    memcpy(out,
110a0 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72   in, 8);.  }.  r
110b0 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69  eturn out;.}..#i
110c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
110d0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
110e0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
110f0 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
11100 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
11110 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
11120 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
11130 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
11140 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
11150 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
11160 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
11170 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
11180 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
11190 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
111a0 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
111b0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
111c0 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
111d0 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
111e0 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
111f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
11200 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
11210 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
11220 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
11230 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c  *z, int negateFl
11240 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
11250 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30   if( ALWAYS(z!=0
11260 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
11270 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20  value;.    char 
11280 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  *zV;.    sqlite3
11290 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20  AtoF(z, &value, 
112a0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
112b0 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
112c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73  ;.    assert( !s
112d0 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
112e0 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77  e) ); /* The new
112f0 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75   AtoF never retu
11300 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69  rns NaN */.    i
11310 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
11320 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
11330 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
11340 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
11350 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lue);.    sqlite
11360 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11370 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
11380 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29   0, zV, P4_REAL)
11390 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
113a0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
113b0 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
113c0 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
113d0 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
113e0 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
113f0 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
11400 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
11410 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69   Expr.u.zToken i
11420 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e  s always UTF8 an
11430 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  d zero-terminate
11440 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
11450 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61  d codeInteger(Pa
11460 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
11470 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65  r *pExpr, int ne
11480 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  gFlag, int iMem)
11490 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
114a0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
114b0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
114c0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
114d0 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78  .    int i = pEx
114e0 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20  pr->u.iValue;.  
114f0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29    assert( i>=0 )
11500 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61  ;.    if( negFla
11510 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20  g ) i = -i;.    
11520 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11530 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
11540 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c   i, iMem);.  }el
11550 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20  se{.    int c;. 
11560 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
11570 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
11580 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
11590 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  n;.    assert( z
115a0 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73  !=0 );.    c = s
115b0 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20  qlite3Atoi64(z, 
115c0 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53  &value, sqlite3S
115d0 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
115e0 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 69 66  TE_UTF8);.    if
115f0 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20  ( c==0 || (c==2 
11600 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20  && negFlag) ){. 
11610 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20       char *zV;. 
11620 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
11630 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32   ){ value = c==2
11640 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
11650 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
11660 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
11670 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
11680 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lue);.      sqli
11690 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
116a0 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
116b0 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e  em, 0, zV, P4_IN
116c0 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  T64);.    }else{
116d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
116e0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
116f0 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  NT.      sqlite3
11700 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11710 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65   "oversized inte
11720 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  ger: %s%s", negF
11730 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  lag ? "-" : "", 
11740 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  z);.#else.      
11750 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e  codeReal(v, z, n
11760 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 23  egFlag, iMem);.#
11770 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
11780 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
11790 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f   cache entry..*/
117a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
117b0 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72  heEntryClear(Par
117c0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
117d0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29  ct yColCache *p)
117e0 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52  {.  if( p->tempR
117f0 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  eg ){.    if( pP
11800 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
11810 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
11820 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
11830 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
11840 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
11850 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52  mpReg++] = p->iR
11860 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  eg;.    }.    p-
11870 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
11880 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
11890 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
118a0 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
118b0 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
118c0 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
118d0 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
118e0 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
118f0 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
11900 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
11910 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
11920 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
11930 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
11940 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
11950 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
11960 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
11970 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
11980 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74  he *p;..  assert
11990 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a 20  ( iReg>0 );  /* 
119a0 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  Register numbers
119b0 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69   are always posi
119c0 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  tive */.  assert
119d0 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43  ( iCol>=-1 && iC
119e0 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20  ol<32768 );  /* 
119f0 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75  Finite column nu
11a00 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54  mbers */..  /* T
11a10 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  he SQLITE_Column
11a20 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61 62  Cache flag disab
11a30 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  les the column c
11a40 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20 75  ache.  This is u
11a50 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73  sed.  ** for tes
11a60 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76  ting only - to v
11a70 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69 74  erify that SQLit
11a80 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74 68  e always gets th
11a90 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
11aa0 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74 68  ** with and with
11ab0 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  out the column c
11ac0 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ache..  */.  if(
11ad0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
11ae0 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
11af0 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43  , SQLITE_ColumnC
11b00 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a  ache) ) return;.
11b10 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c  .  /* First repl
11b20 61 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ace any existing
11b30 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   entry..  **.  *
11b40 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
11b50 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  way the column c
11b60 61 63 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c  ache is currentl
11b70 79 20 75 73 65 64 2c 20 77 65 20 61 72 65 20 67  y used, we are g
11b80 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74  uaranteed.  ** t
11b90 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77  hat the object w
11ba0 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64  ill never alread
11bb0 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20  y be in cache.  
11bc0 56 65 72 69 66 79 20 74 68 69 73 20 67 75 61 72  Verify this guar
11bd0 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e  antee..  */.#ifn
11be0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72  def NDEBUG.  for
11bf0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
11c00 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
11c10 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
11c20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61  i++, p++){.    a
11c30 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d  ssert( p->iReg==
11c40 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d  0 || p->iTable!=
11c50 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75  iTab || p->iColu
11c60 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a  mn!=iCol );.  }.
11c70 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e  #endif..  /* Fin
11c80 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20  d an empty slot 
11c90 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a  and replace it *
11ca0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  /.  for(i=0, p=p
11cb0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11cc0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
11cd0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
11ce0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
11cf0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  g==0 ){.      p-
11d00 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  >iLevel = pParse
11d10 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20  ->iCacheLevel;. 
11d20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d       p->iTable =
11d30 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e   iTab;.      p->
11d40 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a  iColumn = iCol;.
11d50 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
11d60 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74  iReg;.      p->t
11d70 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
11d80 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
11d90 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
11da0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
11db0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
11dc0 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72  place the last r
11dd0 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a  ecently used */.
11de0 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66    minLru = 0x7ff
11df0 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20  fffff;.  idxLru 
11e00 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  = -1;.  for(i=0,
11e10 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
11e20 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
11e30 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
11e40 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
11e50 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20  >lru<minLru ){. 
11e60 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b       idxLru = i;
11e70 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20  .      minLru = 
11e80 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20  p->lru;.    }.  
11e90 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69  }.  if( ALWAYS(i
11ea0 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20  dxLru>=0) ){.   
11eb0 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
11ec0 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b  olCache[idxLru];
11ed0 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d  .    p->iLevel =
11ee0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
11ef0 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61  evel;.    p->iTa
11f00 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
11f10 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
11f20 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  l;.    p->iReg =
11f30 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65   iReg;.    p->te
11f40 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70  mpReg = 0;.    p
11f50 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
11f60 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
11f70 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a   return;.  }.}..
11f80 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
11f90 68 61 74 20 72 65 67 69 73 74 65 72 73 20 62 65  hat registers be
11fa0 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67  tween iReg..iReg
11fb0 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e  +nReg-1 are bein
11fc0 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a  g overwritten..*
11fd0 2a 20 50 75 72 67 65 20 74 68 65 20 72 61 6e 67  * Purge the rang
11fe0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66  e of registers f
11ff0 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
12000 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ache..*/.void sq
12010 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
12020 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  move(Parse *pPar
12030 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
12040 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
12050 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20  ;.  int iLast = 
12060 69 52 65 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b  iReg + nReg - 1;
12070 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
12080 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
12090 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
120a0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
120b0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
120c0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
120d0 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
120e0 20 69 66 28 20 72 3e 3d 69 52 65 67 20 26 26 20   if( r>=iReg && 
120f0 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  r<=iLast ){.    
12100 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
12110 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
12120 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b      p->iReg = 0;
12130 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12140 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65  .** Remember the
12150 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20   current column 
12160 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20  cache context.  
12170 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20  Any new entries 
12180 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74  added.** added t
12190 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  o the column cac
121a0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61  he after this ca
121b0 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77  ll are removed w
121c0 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  hen the.** corre
121d0 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63  sponding pop occ
121e0 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
121f0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
12200 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  h(Parse *pParse)
12210 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  {.  pParse->iCac
12220 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  heLevel++;.}../*
12230 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20  .** Remove from 
12240 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
12250 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61   any entries tha
12260 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69 6e  t were added sin
12270 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72  ce the.** the pr
12280 65 76 69 6f 75 73 20 4e 20 50 75 73 68 20 6f 70  evious N Push op
12290 65 72 61 74 69 6f 6e 73 2e 20 20 49 6e 20 6f 74  erations.  In ot
122a0 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f  her words, resto
122b0 72 65 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  re the cache.** 
122c0 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20  to the state it 
122d0 77 61 73 20 69 6e 20 4e 20 50 75 73 68 65 73 20  was in N Pushes 
122e0 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ago..*/.void sql
122f0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
12300 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12310 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b  int N){.  int i;
12320 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
12330 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  che *p;.  assert
12340 28 20 4e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ( N>0 );.  asser
12350 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  t( pParse->iCach
12360 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a 20 20 70  eLevel>=N );.  p
12370 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
12380 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f 72 28 69  el -= N;.  for(i
12390 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
123a0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
123b0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
123c0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
123d0 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69   p->iReg && p->i
123e0 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43  Level>pParse->iC
123f0 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20  acheLevel ){.   
12400 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
12410 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
12420 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
12430 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12440 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68  *.** When a cach
12450 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75  ed column is reu
12460 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  sed, make sure t
12470 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72  hat its register
12480 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
12490 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20   available as a 
124a0 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20  temp register.  
124b0 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74  ticket #3879:  t
124c0 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69  hat same.** regi
124d0 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e  ster might be in
124e0 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75   the cache in mu
124f0 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73  ltiple places, s
12500 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20  o be sure to.** 
12510 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f  get them all..*/
12520 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
12530 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
12540 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a  Register(Parse *
12550 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
12560 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
12570 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
12580 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
12590 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
125a0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
125b0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
125c0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
125d0 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
125e0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
125f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12600 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12610 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
12620 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
12630 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
12640 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
12650 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
12660 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
12670 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  e(.  Vdbe *v,   
12680 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
12690 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
126a0 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ion */.  Table *
126b0 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20  pTab,    /* The 
126c0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
126d0 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20   the value */.  
126e0 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
126f0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 66 6f  /* The cursor fo
12700 72 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  r this table */.
12710 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
12720 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
12730 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72  e column to extr
12740 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  act */.  int reg
12750 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72  Out      /* Extr
12760 61 63 74 20 74 68 65 20 76 61 6c 75 64 20 69 6e  act the valud in
12770 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72  to this register
12780 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f   */.){.  if( iCo
12790 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61  l<0 || iCol==pTa
127a0 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
127b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
127c0 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
127d0 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b  TabCur, regOut);
127e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
127f0 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c  t op = IsVirtual
12800 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c  (pTab) ? OP_VCol
12810 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b  umn : OP_Column;
12820 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12830 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54  AddOp3(v, op, iT
12840 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67  abCur, iCol, reg
12850 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Out);.  }.  if( 
12860 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  iCol>=0 ){.    s
12870 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
12880 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
12890 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
128a0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
128b0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
128c0 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
128d0 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
128e0 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
128f0 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
12900 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
12910 61 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20  a register.  An 
12920 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64  effort.** is mad
12930 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
12940 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
12950 65 67 69 73 74 65 72 20 69 52 65 67 2c 20 62 75  egister iReg, bu
12960 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74  t this is.** not
12970 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68   guaranteed.  Th
12980 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
12990 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
129a0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
129b0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
129c0 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
129d0 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65  o pTab in iTable
129e0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
129f0 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  ne.** is called.
12a00 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74    If iColumn<0 t
12a10 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65  hen code is gene
12a20 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
12a30 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
12a40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
12a50 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a  rCodeGetColumn(.
12a60 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12a70 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
12a80 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
12a90 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
12aa0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
12ab0 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
12ac0 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
12ad0 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
12ae0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
12af0 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
12b00 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
12b10 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
12b20 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
12b30 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
12b40 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
12b50 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20    int iReg,     
12b60 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
12b70 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38  lts here */.  u8
12b80 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f   p5            /
12b90 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f  * P5 value for O
12ba0 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  P_Column */.){. 
12bb0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
12bc0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
12bd0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
12be0 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72  Cache *p;..  for
12bf0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
12c00 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
12c10 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
12c20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
12c30 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20  f( p->iReg>0 && 
12c40 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  p->iTable==iTabl
12c50 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d  e && p->iColumn=
12c60 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
12c70 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
12c80 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
12c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12ca0 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
12cb0 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65  r(pParse, p->iRe
12cc0 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
12cd0 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
12ce0 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20    }  .  assert( 
12cf0 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
12d00 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
12d10 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61  mnOfTable(v, pTa
12d20 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  b, iTable, iColu
12d30 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28  mn, iReg);.  if(
12d40 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   p5 ){.    sqlit
12d50 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
12d60 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20  , p5);.  }else{ 
12d70 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78    .    sqlite3Ex
12d80 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
12d90 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  rse, iTable, iCo
12da0 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d  lumn, iReg);.  }
12db0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
12dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
12dd0 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  ll column cache 
12de0 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64  entries..*/.void
12df0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12e00 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  eClear(Parse *pP
12e10 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
12e20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
12e30 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  he *p;..  for(i=
12e40 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
12e50 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
12e60 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
12e70 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
12e80 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20  p->iReg ){.     
12e90 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
12ea0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
12eb0 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
12ec0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12ed0 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61  ** Record the fa
12ee0 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e  ct that an affin
12ef0 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f  ity change has o
12f00 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e  ccurred on iCoun
12f10 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73  t.** registers s
12f20 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74  tarting with iSt
12f30 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  art..*/.void sql
12f40 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
12f50 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73  inityChange(Pars
12f60 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
12f70 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e  Start, int iCoun
12f80 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t){.  sqlite3Exp
12f90 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
12fa0 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f  rse, iStart, iCo
12fb0 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  unt);.}../*.** G
12fc0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12fd0 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  move content fro
12fe0 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f  m registers iFro
12ff0 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31  m...iFrom+nReg-1
13000 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e  .** over to iTo.
13010 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65  .iTo+nReg-1. Kee
13020 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  p the column cac
13030 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a  he up-to-date..*
13040 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
13050 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65  prCodeMove(Parse
13060 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
13070 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e  rom, int iTo, in
13080 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
13090 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
130a0 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72  ache *p;.  asser
130b0 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52  t( iFrom>=iTo+nR
130c0 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67  eg || iFrom+nReg
130d0 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74  <=iTo );.  sqlit
130e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61  e3VdbeAddOp3(pPa
130f0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d  rse->pVdbe, OP_M
13100 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c  ove, iFrom, iTo,
13110 20 6e 52 65 67 2d 31 29 3b 0a 20 20 66 6f 72 28   nReg-1);.  for(
13120 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
13130 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
13140 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
13150 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
13160 74 20 78 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t x = p->iReg;. 
13170 20 20 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20     if( x>=iFrom 
13180 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20  && x<iFrom+nReg 
13190 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  ){.      p->iReg
131a0 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20   += iTo-iFrom;. 
131b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20     }.  }.}..#if 
131c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
131d0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
131e0 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45  (SQLITE_COVERAGE
131f0 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
13200 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
13210 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
13220 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f  range iFrom..iTo
13230 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20   (inclusive).** 
13240 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
13250 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  of the column ca
13260 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
13270 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
13280 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
13290 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d  and testcase() m
132a0 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e  acros only.** an
132b0 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  d does not appea
132c0 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75  r in a normal bu
132d0 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ild..*/.static i
132e0 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  nt usedAsColumnC
132f0 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
13300 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
13310 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69  nt iTo){.  int i
13320 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
13330 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
13340 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
13350 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
13360 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
13370 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
13380 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   r = p->iReg;.  
13390 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26    if( r>=iFrom &
133a0 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72  & r<=iTo ) retur
133b0 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53  n 1;    /*NO_TES
133c0 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  T*/.  }.  return
133d0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
133e0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20  SQLITE_DEBUG || 
133f0 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
13400 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  TEST */../*.** G
13410 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
13420 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
13430 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
13440 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
13450 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
13460 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
13470 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
13480 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
13490 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
134a0 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
134b0 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
134c0 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
134d0 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
134e0 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
134f0 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
13500 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
13510 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
13520 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
13530 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
13540 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
13550 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
13560 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
13570 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
13580 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
13590 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
135a0 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
135b0 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
135c0 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
135d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
135e0 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
135f0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
13600 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
13610 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
13620 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
13630 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
13640 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
13650 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
13660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13670 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
13680 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
13690 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
136a0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
136b0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
136c0 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
136d0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
136e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
136f0 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
13700 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
13710 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
13720 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
13730 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
13740 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
13750 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
13760 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c  */.  int r1, r2,
13770 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f   r3, r4;       /
13780 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
13790 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
137a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
137b0 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
137c0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
137d0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tion */..  asser
137e0 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
137f0 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
13800 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  Mem );.  if( v==
13810 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
13820 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
13830 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
13840 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
13850 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
13860 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
13870 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
13880 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
13890 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
138a0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
138b0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
138c0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
138d0 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
138e0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
138f0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
13900 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
13910 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
13920 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
13930 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
13940 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
13950 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
13960 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
13970 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c      inReg = pCol
13980 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->iMem;.        
13990 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
139a0 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
139b0 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
139c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
139d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
139e0 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
139f0 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54  fo->sortingIdxPT
13a00 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
13a30 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
13a40 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
13a60 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
13a70 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
13a80 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a  _COLUMN case */.
13a90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13aa0 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
13ab0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
13ac0 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ble<0 ){.       
13ad0 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
13ae0 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e  ppens when codin
13af0 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69  g check constrai
13b00 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
13b10 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63  ssert( pParse->c
13b20 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20 20  kBase>0 );.     
13b30 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
13b40 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72  ->iColumn + pPar
13b50 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20  se->ckBase;.    
13b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13b70 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
13b80 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
13b90 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  n(pParse, pExpr-
13ba0 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  >pTab,.         
13bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bc0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
13bd0 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69  Column, pExpr->i
13be0 54 61 62 6c 65 2c 20 74 61 72 67 65 74 2c 0a 20  Table, target,. 
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c10 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20  pExpr->op2);.   
13c20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13c40 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
13c50 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
13c60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
13c70 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
13c80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
13c90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13ca0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
13cb0 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
13cc0 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
13cd0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
13ce0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13cf0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
13d00 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
13d10 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
13d20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
13d30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
13d40 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
13d50 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
13d60 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
13d70 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
13d80 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
13d90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13da0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13db0 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67  String8, 0, targ
13dc0 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  et, 0, pExpr->u.
13dd0 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20  zToken, 0);.    
13de0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13df0 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
13e00 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
13e10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13e20 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
13e30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13e40 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
13e50 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
13e60 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
13e70 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
13e80 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
13e90 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
13ea0 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a     char *zBlob;.
13eb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
13ec0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
13ed0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
13ee0 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
13ef0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
13f00 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  ken[0]=='x' || p
13f10 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
13f20 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
13f30 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
13f40 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27  .zToken[1]=='\''
13f50 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70   );.      z = &p
13f60 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32  Expr->u.zToken[2
13f70 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ];.      n = sql
13f80 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
13f90 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
13fa0 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b  t( z[n]=='\'' );
13fb0 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73  .      zBlob = s
13fc0 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
13fd0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
13fe0 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
13ff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14000 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32  (v, OP_Blob, n/2
14010 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c  , target, 0, zBl
14020 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ob, P4_DYNAMIC);
14030 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14040 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
14050 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
14060 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
14070 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
14080 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
14090 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
140a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
140b0 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20  zToken!=0 );.   
140c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
140d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30  ->u.zToken[0]!=0
140e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
140f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14100 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
14110 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  r->iColumn, targ
14120 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
14130 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
14140 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
14150 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
14160 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20  .zToken[0]=='?' 
14170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
14180 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
14190 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d  .zToken, pParse-
141a0 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43  >azVar[pExpr->iC
141b0 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a  olumn-1])==0 );.
141c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
141d0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
141e0 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  1, pParse->azVar
141f0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  [pExpr->iColumn-
14200 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  1], P4_STATIC);.
14210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
14220 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14230 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
14240 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
14250 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
14260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14270 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
14280 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  S: {.      inReg
14290 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
142a0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
142b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
142c0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
142d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
142e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
142f0 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
14300 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
14310 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
14320 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
14330 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
14340 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
14350 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20  f, to_op;.      
14360 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
14370 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
14380 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14390 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
143a0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
143b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
143c0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
143d0 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73  );.      aff = s
143e0 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
143f0 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
14400 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70  en);.      to_op
14410 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f   = aff - SQLITE_
14420 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f  AFF_TEXT + OP_To
14430 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Text;.      asse
14440 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
14450 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d  Text    || aff!=
14460 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
14470 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
14480 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
14490 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d  Blob    || aff!=
144a0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
144b0 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
144c0 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
144d0 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d  Numeric || aff!=
144e0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
144f0 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  IC );.      asse
14500 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
14510 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d  Int     || aff!=
14520 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
14530 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ER );.      asse
14540 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
14550 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d  Real    || aff!=
14560 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
14570 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74     );.      test
14580 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
14590 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20 20  ToText );.      
145a0 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
145b0 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20  =OP_ToBlob );.  
145c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
145d0 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69  _op==OP_ToNumeri
145e0 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  c );.      testc
145f0 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
14600 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65  oInt );.      te
14610 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
14620 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20  P_ToReal );.    
14630 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
14640 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  get ){.        s
14650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14660 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  (v, OP_SCopy, in
14670 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
14680 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
14690 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
146a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
146b0 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20  ddOp1(v, to_op, 
146c0 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74 65  inReg);.      te
146d0 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f  stcase( usedAsCo
146e0 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
146f0 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20  , inReg, inReg) 
14700 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14710 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
14720 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
14730 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20  inReg, 1);.     
14740 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
14750 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
14760 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
14770 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
14780 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
14790 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
147a0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
147b0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
147c0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
147d0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
147e0 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
147f0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
14800 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
14810 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
14820 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
14830 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
14840 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
14850 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
14860 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14870 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
14880 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14890 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
148a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
148b0 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
148c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
148d0 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
148e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
148f0 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
14900 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
14910 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14920 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
14930 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
14940 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
14950 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14960 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
14970 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
14980 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14990 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
149a0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
149b0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
149c0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
149d0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
149e0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
14a10 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
14a20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14a30 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
14a40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14a50 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
14a60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14a70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
14a80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
14a90 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
14aa0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20  case( op==TK_IS 
14ab0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14ac0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  e( op==TK_ISNOT 
14ad0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
14ae0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
14af0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
14b00 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
14b10 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
14b20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
14b30 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
14b40 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
14b50 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  ee2);.      op =
14b60 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
14b70 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
14b80 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
14b90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14ba0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
14bb0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
14bc0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
14bd0 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45  2, inReg, SQLITE
14be0 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c 49 54  _STOREP2 | SQLIT
14bf0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
14c00 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14c10 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
14c20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
14c30 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
14c40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14c50 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
14c60 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
14c70 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
14c80 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
14c90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
14ca0 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
14cb0 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
14cc0 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
14cd0 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
14ce0 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
14cf0 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
14d00 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
14d10 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
14d20 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
14d30 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41      assert( TK_A
14d40 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20  ND==OP_And );.  
14d50 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
14d60 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20  R==OP_Or );.    
14d70 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
14d80 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20  S==OP_Add );.   
14d90 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49     assert( TK_MI
14da0 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74  NUS==OP_Subtract
14db0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14dc0 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
14dd0 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20  ainder );.      
14de0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e  assert( TK_BITAN
14df0 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a  D==OP_BitAnd );.
14e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14e10 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72  _BITOR==OP_BitOr
14e20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14e30 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44  ( TK_SLASH==OP_D
14e40 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61  ivide );.      a
14e50 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54  ssert( TK_LSHIFT
14e60 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29  ==OP_ShiftLeft )
14e70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14e80 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
14e90 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20  iftRight );.    
14ea0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e    assert( TK_CON
14eb0 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29  CAT==OP_Concat )
14ec0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14ed0 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ( op==TK_AND );.
14ee0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14ef0 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20  op==TK_OR );.   
14f00 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14f10 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
14f20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14f30 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20  TK_MINUS );.    
14f40 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14f50 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20  TK_REM );.      
14f60 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14f70 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20  _BITAND );.     
14f80 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14f90 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20  K_BITOR );.     
14fa0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14fb0 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20  K_SLASH );.     
14fc0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14fd0 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_LSHIFT );.    
14fe0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14ff0 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
15000 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15010 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20  =TK_CONCAT );.  
15020 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
15030 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15040 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15050 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
15060 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
15070 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
15080 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
15090 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
150a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
150b0 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
150c0 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
150d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
150e0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
150f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15100 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
15110 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15120 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
15130 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
15140 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
15150 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
15160 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
15170 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
15180 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
15190 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
151a0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
151b0 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74  pLeft, 1, target
151c0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
151d0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
151e0 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73  POINT.      }els
151f0 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d  e if( pLeft->op=
15200 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
15210 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
15220 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
15230 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
15240 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) );.        cod
15250 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e  eReal(v, pLeft->
15260 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72  u.zToken, 1, tar
15270 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  get);.#endif.   
15280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15290 20 20 72 65 67 46 72 65 65 31 20 3d 20 72 31 20    regFree1 = r1 
152a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
152b0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
152c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
152d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
152e0 65 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20  eger, 0, r1);.  
152f0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
15300 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
15310 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
15320 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  eft, &regFree2);
15330 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15340 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15350 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72  _Subtract, r2, r
15360 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
15370 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15380 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
15390 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
153a0 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
153b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
153c0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
153d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
153e0 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
153f0 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50  t( TK_BITNOT==OP
15400 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20  _BitNot );.     
15410 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d   assert( TK_NOT=
15420 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20  =OP_Not );.     
15430 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15440 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20  K_BITNOT );.    
15450 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15460 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_NOT );.      
15470 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
15480 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
15490 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
154a0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
154b0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
154c0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
154d0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
154e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
154f0 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
15500 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  1, inReg);.     
15510 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15520 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
15530 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
15540 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
15550 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
15560 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
15570 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
15580 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15590 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
155a0 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ull );.      tes
155b0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
155c0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
155d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
155e0 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
155f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15600 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
15610 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
15620 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
15630 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15640 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15650 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
15660 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15670 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
15680 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
15690 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
156a0 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  p, r1);.      sq
156b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
156c0 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61  v, OP_AddImm, ta
156d0 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20  rget, -1);.     
156e0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
156f0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
15700 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15710 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
15720 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
15730 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
15740 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
15750 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
15760 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
15770 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
15780 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
15790 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
157a0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
157b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
157c0 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
157d0 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c  ggregate: %s()",
157e0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
157f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
15800 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
15810 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
15820 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
15830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
15840 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15850 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  ase TK_CONST_FUN
15860 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  C:.    case TK_F
15870 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
15880 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67   ExprList *pFarg
15890 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
158a0 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
158b0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
158c0 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20  nt nFarg;       
158d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
158e0 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
158f0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46  ments */.      F
15900 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
15910 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
15920 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
15930 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20   object */.     
15940 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20   int nId;       
15950 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
15960 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  h of the functio
15970 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  n name in bytes 
15980 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
15990 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
159a0 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
159b0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  name */.      in
159c0 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  t constMask = 0;
159d0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
159e0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
159f0 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
15a00 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
15a10 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
15a20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15a30 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38  nter */.      u8
15a40 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20   enc = ENC(db); 
15a50 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
15a60 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62   encoding used b
15a70 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
15a80 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
15a90 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20   *pColl = 0;    
15aa0 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73  /* A collating s
15ab0 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20  equence */..    
15ac0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
15ad0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
15ae0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
15af0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15b00 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f  e( op==TK_CONST_
15b10 46 55 4e 43 20 29 3b 0a 20 20 20 20 20 20 74 65  FUNC );.      te
15b20 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46  stcase( op==TK_F
15b30 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
15b40 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50   if( ExprHasAnyP
15b50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
15b60 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
15b70 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
15b80 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
15b90 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
15ba0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
15bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
15bc0 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46  arg = pFarg ? pF
15bd0 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  arg->nExpr : 0;.
15be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
15bf0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
15c00 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
15c10 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20  e) );.      zId 
15c20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
15c30 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73  n;.      nId = s
15c40 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
15c50 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20  Id);.      pDef 
15c60 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
15c70 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e  ction(db, zId, n
15c80 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  Id, nFarg, enc, 
15c90 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
15ca0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
15cb0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15cc0 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
15cd0 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73  n function: %.*s
15ce0 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  ()", nId, zId);.
15cf0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15d00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
15d10 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63   Attempt a direc
15d20 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
15d30 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   of the built-in
15d40 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a   COALESCE() and.
15d50 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28        ** IFNULL(
15d60 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  ) functions.  Th
15d70 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65  is avoids unnece
15d80 73 73 61 72 79 20 65 76 61 6c 61 74 69 6f 6e 20  ssary evalation 
15d90 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  of.      ** argu
15da0 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66  ments past the f
15db0 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72  irst non-NULL ar
15dc0 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
15dd0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
15de0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
15df0 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b  FUNC_COALESCE ){
15e00 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64  .        int end
15e10 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74  Coalesce = sqlit
15e20 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
15e30 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  v);.        asse
15e40 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a  rt( nFarg>=2 );.
15e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15e60 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
15e70 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
15e80 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
15e90 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
15ea0 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
15eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15ec0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f  eAddOp2(v, OP_No
15ed0 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65  tNull, target, e
15ee0 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
15ef0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15f00 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
15f10 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29  arse, target, 1)
15f20 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15f30 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
15f40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
15f50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15f60 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
15f70 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74  g->a[i].pExpr, t
15f80 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
15f90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
15fa0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
15fb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15fc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15fd0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
15fe0 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
15ff0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16000 20 20 7d 0a 0a 0a 20 20 20 20 20 20 69 66 28 20    }...      if( 
16010 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  pFarg ){.       
16020 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
16030 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
16040 2c 20 6e 46 61 72 67 29 3b 0a 0a 20 20 20 20 20  , nFarg);..     
16050 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68     /* For length
16060 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20  () and typeof() 
16070 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61  functions with a
16080 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74   column argument
16090 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  ,.        ** set
160a0 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65   the P5 paramete
160b0 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75  r to the OP_Colu
160c0 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46  mn opcode to OPF
160d0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20  LAG_LENGTHARG.  
160e0 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c        ** or OPFL
160f0 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73  AG_TYPEOFARG res
16100 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76  pectively, to av
16110 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
16120 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  data.        ** 
16130 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20  loading..       
16140 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
16150 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 28  (pDef->flags & (
16160 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
16170 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  TH|SQLITE_FUNC_T
16180 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20  YPEOF))!=0 ){.  
16190 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f          u8 exprO
161a0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
161b0 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
161c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
161d0 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  t( pFarg->a[0].p
161e0 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
161f0 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46       exprOp = pF
16200 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
16210 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  >op;.          i
16220 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f  f( exprOp==TK_CO
16230 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d  LUMN || exprOp==
16240 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
16250 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
16260 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
16270 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f  _LENGTH==OPFLAG_
16280 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
16290 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
162a0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
162b0 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45  EOF==OPFLAG_TYPE
162c0 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  OFARG );.       
162d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
162e0 44 65 66 2d 3e 66 6c 61 67 73 3d 3d 53 51 4c 49  Def->flags==SQLI
162f0 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 20 29  TE_FUNC_LENGTH )
16300 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ;.            pF
16310 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
16320 3e 6f 70 32 20 3d 20 70 44 65 66 2d 3e 66 6c 61  >op2 = pDef->fla
16330 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  gs;.          }.
16340 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
16350 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
16360 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
16370 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
16380 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
16390 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
163a0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
163b0 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31  Parse, pFarg, r1
163c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
163d0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
163e0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 20 20 20  p(pParse, 1);   
163f0 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32  /* Ticket 2ea242
16400 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20  5d34be */.      
16410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
16420 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  1 = 0;.      }.#
16430 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16440 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
16450 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
16460 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
16470 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
16480 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
16490 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
164a0 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
164b0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
164c0 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
164d0 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
164e0 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
164f0 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
16500 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
16510 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
16520 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
16530 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
16540 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
16550 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
16560 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
16570 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
16580 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
16590 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
165a0 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
165b0 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
165c0 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
165d0 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
165e0 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
165f0 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
16600 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
16610 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
16620 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
16630 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
16640 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
16650 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
16660 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
16670 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
16680 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
16690 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
166a0 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
166b0 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
166c0 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
166d0 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
166e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
166f0 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20  if( nFarg>=2 && 
16700 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
16710 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
16720 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
16730 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
16740 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
16750 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
16760 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  rg->a[1].pExpr);
16770 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
16780 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20   nFarg>0 ){.    
16790 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
167a0 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
167b0 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
167c0 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
167d0 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
167e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
167f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72   for(i=0; i<nFar
16800 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
16810 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c   if( i<32 && sql
16820 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
16830 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  nt(pFarg->a[i].p
16840 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
16850 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
16860 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20  (1<<i);.        
16870 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
16880 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
16890 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
168a0 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20  L)!=0 && !pColl 
168b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
168c0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
168d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
168e0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
168f0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
16900 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16910 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
16920 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
16930 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  LL ){.        if
16940 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
16950 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
16960 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
16970 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16980 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
16990 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
169a0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
169b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
169c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
169d0 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c  (v, OP_Function,
169e0 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20   constMask, r1, 
169f0 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f  (char*)pDef, P4_
16a20 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
16a30 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
16a40 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67  eP5(v, (u8)nFarg
16a50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  );.      if( nFa
16a60 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rg ){.        sq
16a70 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16a80 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
16a90 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
16aa0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
16ab0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
16ac0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16ad0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
16ae0 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
16af0 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
16b00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16b10 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
16b20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
16b30 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
16b40 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
16b50 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
16b60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
16b70 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
16b80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16b90 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
16ba0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
16bb0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
16bc0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
16bd0 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
16be0 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
16bf0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
16c00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16c10 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
16c20 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
16c30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
16c40 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
16c50 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
16c60 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
16c70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16c80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
16c90 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
16ca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16cb0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
16cc0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
16cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16ce0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
16cf0 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29  dImm, target, 0)
16d00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16d10 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
16d20 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
16d30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16d40 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
16d50 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16d60 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20  Y */...    /*.  
16d70 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
16d80 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
16d90 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
16da0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
16db0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
16dc0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
16dd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
16de0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
16df0 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
16e00 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
16e10 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
16e20 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
16e30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
16e40 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
16e50 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
16e60 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
16e70 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
16e80 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
16e90 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74  >pLeft;.      st
16ea0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
16eb0 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78  em *pLItem = pEx
16ec0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a  pr->x.pList->a;.
16ed0 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
16ee0 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
16ef0 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d 20  pr;..      r1 = 
16f00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
16f10 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66  emp(pParse, pLef
16f20 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
16f30 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
16f40 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
16f50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72  arse, pRight, &r
16f60 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
16f70 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
16f80 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
16f90 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16fa0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 33  2==0 );.      r3
16fb0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16fc0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16fd0 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33      r4 = sqlite3
16fe0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
16ff0 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  e);.      codeCo
17000 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
17010 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
17020 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Ge,.            
17030 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33        r1, r2, r3
17040 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
17050 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b  );.      pLItem+
17060 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  +;.      pRight 
17070 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
17080 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
17090 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
170a0 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
170b0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
170c0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
170d0 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26  Parse, pRight, &
170e0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
170f0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
17100 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
17110 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
17120 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
17130 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32  t, OP_Le, r1, r2
17140 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f  , r4, SQLITE_STO
17150 52 45 50 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  REP2);.      sql
17160 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17170 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34  , OP_And, r3, r4
17180 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17190 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
171a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
171b0 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
171c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
171d0 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20  pParse, r4);.   
171e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
171f0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
17200 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
17210 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
17220 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
17230 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
17240 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
17250 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
17260 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17270 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  ..    case TK_TR
17280 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f  IGGER: {.      /
17290 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20  * If the opcode 
172a0 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74  is TK_TRIGGER, t
172b0 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
172c0 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  on is a referenc
172d0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20  e.      ** to a 
172e0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
172f0 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65  w.* or old.* pse
17300 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c  udo-tables avail
17310 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
17320 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
17330 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
17340 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73  Expr.iTable is s
17350 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a  et to 1 for the.
17360 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70        ** new.* p
17370 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20  seudo-table, or 
17380 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20  0 for the old.* 
17390 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78  pseudo-table. Ex
173a0 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  pr.iColumn.     
173b0 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68   ** is set to th
173c0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
173d0 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20  pseudo-table to 
173e0 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74  read, or to -1 t
173f0 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  o.      ** read 
17400 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e  the rowid field.
17410 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17420 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
17430 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
17440 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72   using an OP_Par
17450 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70  am opcode. The p
17460 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d  1.      ** param
17470 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30  eter is set to 0
17480 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69   for an old.rowi
17490 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20  d reference, or 
174a0 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a  to (i+1).      *
174b0 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61  * to reference a
174c0 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66  nother column of
174d0 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
174e0 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a  o-table, where .
174f0 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68        ** i is th
17500 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
17510 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77  olumn. For a new
17520 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
17530 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a  , p1 is.      **
17540 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77   set to (n+1), w
17550 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75  here n is the nu
17560 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
17570 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74  in each pseudo-t
17580 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46  able..      ** F
17590 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  or a reference t
175a0 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75  o any other colu
175b0 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
175c0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31  pseudo-table, p1
175d0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
175e0 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65   to (n+2+i), whe
175f0 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61  re n and i are a
17600 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f  s defined previo
17610 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20  usly. For.      
17620 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
17630 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63  he table on whic
17640 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62  h triggers are b
17650 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20  eing fired is.  
17660 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20      ** declared 
17670 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  as:.      **.   
17680 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
17690 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
176a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
176b0 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65   Then p1 is inte
176c0 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f  rpreted as follo
176d0 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
176e0 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20     **   p1==0   
176f0 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20  ->    old.rowid 
17700 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20      p1==3   ->  
17710 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20    new.rowid.    
17720 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d    **   p1==1   -
17730 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20  >    old.a      
17740 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20     p1==4   ->   
17750 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20   new.a.      ** 
17760 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20    p1==2   ->    
17770 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31  old.b         p1
17780 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==5   ->    new.
17790 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a  b       .      *
177a0 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
177b0 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
177c0 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20  b;.      int p1 
177d0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
177e0 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  * (pTab->nCol+1)
177f0 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43   + 1 + pExpr->iC
17800 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73  olumn;..      as
17810 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
17820 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
17830 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  >iTable==1 );.  
17840 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
17850 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26  r->iColumn>=-1 &
17860 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
17870 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
17880 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
17890 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45  b->iPKey<0 || pE
178a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54  xpr->iColumn!=pT
178b0 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20  ab->iPKey );.   
178c0 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30     assert( p1>=0
178d0 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43   && p1<(pTab->nC
178e0 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20  ol*2+2) );..    
178f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17900 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c  Op2(v, OP_Param,
17910 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   p1, target);.  
17920 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
17930 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25  (v, "%s.%s -> $%
17940 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  d",.        (pEx
17950 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65  pr->iTable ? "ne
17960 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20  w" : "old"),.   
17970 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f       (pExpr->iCo
17980 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22  lumn<0 ? "rowid"
17990 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e   : pExpr->pTab->
179a0 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
179b0 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20  umn].zName),.   
179c0 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20 20       target.    
179d0 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53    ));..#ifndef S
179e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
179f0 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
17a00 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
17a10 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69   has REAL affini
17a20 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65  ty, it may curre
17a30 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61  ntly be stored a
17a40 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  s an.      ** in
17a50 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65  teger. Use OP_Re
17a60 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61  alAffinity to ma
17a70 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72 65  ke sure it is re
17a80 61 6c 6c 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20  ally real.  */. 
17a90 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
17aa0 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20  iColumn>=0 .    
17ab0 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c     && pTab->aCol
17ac0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
17ad0 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
17ae0 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
17af0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17b00 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
17b10 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
17b20 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17b30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
17b40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
17b50 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     /*.    ** For
17b60 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m A:.    **   CA
17b70 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45  SE x WHEN e1 THE
17b80 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
17b90 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
17ba0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
17bb0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
17bc0 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a  * Form B:.    **
17bd0 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20     CASE WHEN e1 
17be0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
17bf0 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
17c00 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
17c10 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
17c20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63    ** Form A is c
17c30 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65  an be transforme
17c40 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76  d into the equiv
17c50 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20  alent form B as 
17c60 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20  follows:.    ** 
17c70 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31    CASE WHEN x=e1
17c80 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d   THEN r1 WHEN x=
17c90 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20  e2 THEN r2 .... 
17ca0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45     **        WHE
17cb0 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45  N x=eN THEN rN E
17cc0 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
17cd0 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74  .    ** X (if it
17ce0 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70   exists) is in p
17cf0 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
17d00 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45 78 70   ** Y is in pExp
17d10 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68 65 20  r->pRight.  The 
17d20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
17d30 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  al.  If there is
17d40 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20   no.    ** ELSE 
17d50 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74  clause and no ot
17d60 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68 65 73  her term matches
17d70 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
17d80 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
17d90 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c  exprssion is NUL
17da0 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20  L..    ** Ei is 
17db0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
17dc0 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69  >a[i*2] and Ri i
17dd0 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  s pExpr->pList->
17de0 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a  a[i*2+1]..    **
17df0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75  .    ** The resu
17e00 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  lt of the expres
17e10 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66  sion is the Ri f
17e20 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  or the first mat
17e30 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a  ching Ei,.    **
17e40 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
17e50 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20  no matching Ei, 
17e60 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c  the ELSE term Y,
17e70 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a   or if there is.
17e80 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74      ** no ELSE t
17e90 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  erm, NULL..    *
17ea0 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61  /.    default: a
17eb0 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41  ssert( op==TK_CA
17ec0 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  SE ); {.      in
17ed0 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20  t endLabel;     
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ef0 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
17f00 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74  r end of CASE st
17f10 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
17f20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20  nextCase;       
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17f40 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
17f50 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65  next WHEN clause
17f60 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
17f70 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
17f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
17f90 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e  x number of WHEN
17fa0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
17fb0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
17fe0 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  r */.      ExprL
17ff0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18010 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72  List of WHEN ter
18020 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  ms */.      stru
18030 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
18040 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a   *aListelem;  /*
18050 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74   Array of WHEN t
18060 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  erms */.      Ex
18070 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20  pr opCompare;   
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18090 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70  /* The X==Ei exp
180a0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
180b0 20 45 78 70 72 20 63 61 63 68 65 58 3b 20 20 20   Expr cacheX;   
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180d0 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70     /* Cached exp
180e0 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20  ression X */.   
180f0 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18110 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78       /* The X ex
18120 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
18130 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20    Expr *pTest = 
18140 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
18150 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f      /* X==Ei (fo
18160 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69  rm A) or just Ei
18170 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20   (form B) */.   
18180 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74     VVA_ONLY( int
18190 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70   iCacheLevel = p
181a0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
181b0 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73  el; )..      ass
181c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
181d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
181e0 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45  xIsSelect) && pE
181f0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a  xpr->x.pList );.
18200 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70 45        assert((pE
18210 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
18220 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a  xpr % 2) == 0);.
18230 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
18240 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
18250 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
18260 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
18270 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c  .pList;.      aL
18280 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74  istelem = pEList
18290 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  ->a;.      nExpr
182a0 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
182b0 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c  ;.      endLabel
182c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
182d0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
182e0 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70    if( (pX = pExp
182f0 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a  r->pLeft)!=0 ){.
18300 20 20 20 20 20 20 20 20 63 61 63 68 65 58 20 3d          cacheX =
18310 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65   *pX;.        te
18320 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
18330 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
18340 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18350 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  X->op==TK_REGIST
18360 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61  ER );.        ca
18370 63 68 65 58 2e 69 54 61 62 6c 65 20 3d 20 73 71  cheX.iTable = sq
18380 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
18390 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72  p(pParse, pX, &r
183a0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
183b0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
183c0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
183d0 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d 20 54     cacheX.op = T
183e0 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20  K_REGISTER;.    
183f0 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70      opCompare.op
18400 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   = TK_EQ;.      
18410 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66    opCompare.pLef
18420 74 20 3d 20 26 63 61 63 68 65 58 3b 0a 20 20 20  t = &cacheX;.   
18430 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
18440 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
18450 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
18460 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
18470 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
18480 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
18490 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
184a0 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
184b0 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
184c0 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
184d0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
184e0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
184f0 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
18500 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
18510 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
18520 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
18530 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
18540 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
18550 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
18560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18570 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
18580 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
18590 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
185a0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
185b0 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
185c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
185d0 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a  rt( pTest!=0 );.
185e0 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
185f0 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
18600 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
18610 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
18620 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
18630 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
18640 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
18650 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
18660 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18670 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
18680 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
18690 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
186a0 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
186b0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
186c0 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20  (pParse, pTest, 
186d0 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45  nextCase, SQLITE
186e0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
186f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18700 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
18710 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
18720 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74  UMN );.        t
18730 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
18740 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
18750 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
18760 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18770 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
18780 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
18790 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
187a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
187b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
187c0 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62  _Goto, 0, endLab
187d0 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
187e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
187f0 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
18800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18810 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
18820 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
18830 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
18840 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
18850 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18860 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
18870 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
18880 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
18890 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
188a0 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
188b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
188c0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
188d0 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
188e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
188f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18900 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
18910 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18920 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
18930 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
18940 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20  rse->nErr>0 .   
18950 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
18960 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d  e->iCacheLevel==
18970 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20  iCacheLevel );. 
18980 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18990 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
189a0 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
189b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
189c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
189d0 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
189e0 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
189f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
18a00 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
18a10 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20  _Rollback .     
18a20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
18a30 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
18a40 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  rt.           ||
18a50 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
18a60 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20  ==OE_Fail.      
18a70 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
18a80 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f  ffinity==OE_Igno
18a90 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  re.      );.    
18aa0 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70    if( !pParse->p
18ab0 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20  TriggerTab ){.  
18ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
18ad0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18af0 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61       "RAISE() ma
18b00 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
18b10 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d  ithin a trigger-
18b20 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
18b30 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
18b40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
18b50 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
18b60 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
18b70 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
18b80 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
18b90 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
18ba0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
18bb0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
18bc0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
18bd0 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
18be0 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20  nity==OE_Ignore 
18bf0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18c00 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
18c10 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f            v, OP_
18c20 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  Halt, SQLITE_OK,
18c30 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70   OE_Ignore, 0, p
18c40 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30  Expr->u.zToken,0
18c50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
18c70 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
18c80 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  arse, SQLITE_CON
18c90 53 54 52 41 49 4e 54 5f 52 41 49 53 45 2c 0a 20  STRAINT_RAISE,. 
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
18cc0 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45  pr->affinity, pE
18cd0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
18ce0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
18cf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
18d00 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
18d10 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18d20 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
18d30 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
18d40 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18d50 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
18d60 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
18d70 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
18d80 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
18d90 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
18da0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
18db0 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61  esults.** into a
18dc0 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75   register.  Retu
18dd0 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
18de0 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65  number where the
18df0 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20   results.** are 
18e00 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  stored..**.** If
18e10 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
18e20 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
18e30 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  ister that can b
18e40 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a  e deallocated,.*
18e50 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73  * then write its
18e60 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52   number into *pR
18e70 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  eg.  If the resu
18e80 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  lt register is n
18e90 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  ot.** a temporar
18ea0 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  y, then set *pRe
18eb0 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e  g to zero..*/.in
18ec0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
18ed0 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61  eTemp(Parse *pPa
18ee0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
18ef0 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20  , int *pReg){.  
18f00 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
18f10 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
18f20 65 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20 73  e);.  int r2 = s
18f30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
18f40 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
18f50 70 72 2c 20 72 31 29 3b 0a 20 20 69 66 28 20 72  pr, r1);.  if( r
18f60 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70 52  2==r1 ){.    *pR
18f70 65 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65  eg = r1;.  }else
18f80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
18f90 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18fa0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70 52  se, r1);.    *pR
18fb0 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  eg = 0;.  }.  re
18fc0 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn r2;.}../*.*
18fd0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18fe0 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
18ff0 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
19000 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
19010 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
19020 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
19030 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
19040 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
19050 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
19060 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f  ister target..*/
19070 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
19080 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72  Code(Parse *pPar
19090 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
190a0 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
190b0 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73  int inReg;..  as
190c0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
190d0 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
190e0 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
190f0 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e  pExpr && pExpr->
19100 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
19110 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
19120 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
19130 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c  >pVdbe, OP_Copy,
19140 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
19150 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  target);.  }else
19160 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71  {.    inReg = sq
19170 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
19180 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
19190 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
191a0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
191b0 70 56 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d  pVdbe || pParse-
191c0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
191d0 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52  d );.    if( inR
191e0 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50  eg!=target && pP
191f0 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
19200 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19210 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
19220 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
19230 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
19240 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
19250 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a  rn target;.}../*
19260 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19270 65 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20  e that evalutes 
19280 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
19290 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
192a0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
192b0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
192c0 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
192d0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
192e0 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
192f0 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
19300 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
19310 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
19320 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
19330 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
19340 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
19350 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
19360 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
19370 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
19380 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
19390 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
193a0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
193b0 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
193c0 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
193d0 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
193e0 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
193f0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
19400 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
19410 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   reused..*/.int 
19420 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
19430 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
19440 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
19450 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
19460 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
19470 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
19480 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67  t inReg;.  inReg
19490 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
194a0 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
194b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73  , target);.  ass
194c0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
194d0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
194e0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
194f0 20 74 65 72 6d 73 20 74 6f 20 49 4e 53 45 52 54   terms to INSERT
19500 20 6f 72 20 55 50 44 41 54 45 2e 20 20 41 6e 64   or UPDATE.  And
19510 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f   the only.  ** o
19520 74 68 65 72 20 70 6c 61 63 65 20 77 68 65 72 65  ther place where
19530 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e   expressions can
19540 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
19550 74 6f 20 54 4b 5f 52 45 47 49 53 54 45 52 20 69  to TK_REGISTER i
19560 73 0a 20 20 2a 2a 20 69 6e 20 57 48 45 52 45 20  s.  ** in WHERE 
19570 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
19580 67 2e 20 20 53 6f 20 61 73 20 63 75 72 72 65 6e  g.  So as curren
19590 74 6c 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2c  tly implemented,
195a0 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6e   there is.  ** n
195b0 6f 20 77 61 79 20 66 6f 72 20 61 20 54 4b 5f 52  o way for a TK_R
195c0 45 47 49 53 54 45 52 20 74 6f 20 65 78 69 73 74  EGISTER to exist
195d0 20 68 65 72 65 2e 20 20 42 75 74 20 69 74 20 73   here.  But it s
195e0 65 65 6d 73 20 70 72 75 64 65 6e 74 20 74 6f 0a  eems prudent to.
195f0 20 20 2a 2a 20 6b 65 65 70 20 74 68 65 20 41 4c    ** keep the AL
19600 57 41 59 53 28 29 20 69 6e 20 63 61 73 65 20 74  WAYS() in case t
19610 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
19620 6f 76 65 20 63 68 61 6e 67 65 20 77 69 74 68 20  ove change with 
19630 66 75 74 75 72 65 0a 20 20 2a 2a 20 6d 6f 64 69  future.  ** modi
19640 66 69 63 61 74 69 6f 6e 73 20 6f 72 20 65 6e 68  fications or enh
19650 61 6e 63 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  ancements. */.  
19660 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
19670 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
19680 52 29 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20  R) ){  .    int 
19690 69 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d  iMem;.    iMem =
196a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
196b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
196c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
196d0 79 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b  y, inReg, iMem);
196e0 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
196f0 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70  le = iMem;.    p
19700 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70  Expr->op2 = pExp
19710 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72  r->op;.    pExpr
19720 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
19730 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
19740 20 69 6e 52 65 67 3b 0a 7d 0a 0a 23 69 66 20 64   inReg;.}..#if d
19750 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
19760 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
19770 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  N)./*.** Generat
19780 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
19790 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  le explanation o
197a0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
197b0 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
197c0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
197d0 28 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78 70  (Vdbe *pOut, Exp
197e0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
197f0 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
19800 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
19810 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
19820 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
19830 20 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20   *zBinOp = 0;   
19840 2f 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61 74  /* Binary operat
19850 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
19860 61 72 20 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20  ar *zUniOp = 0; 
19870 20 20 2f 2a 20 55 6e 61 72 79 20 6f 70 65 72 61    /* Unary opera
19880 74 6f 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  tor */.  if( pEx
19890 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
198a0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
198b0 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
198c0 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
198d0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
198e0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
198f0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  MN: {.      sqli
19900 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19910 28 70 4f 75 74 2c 20 22 41 47 47 7b 25 64 3a 25  (pOut, "AGG{%d:%
19920 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d}",.           
19930 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
19940 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
19950 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19960 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
19970 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
19980 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
19990 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  e<0 ){.        /
199a0 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
199b0 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20  ens when coding 
199c0 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74  check constraint
199d0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  s */.        sql
199e0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
199f0 66 28 70 4f 75 74 2c 20 22 43 4f 4c 55 4d 4e 28  f(pOut, "COLUMN(
19a00 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f  %d)", pExpr->iCo
19a10 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lumn);.      }el
19a20 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
19a30 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19a40 28 70 4f 75 74 2c 20 22 7b 25 64 3a 25 64 7d 22  (pOut, "{%d:%d}"
19a50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19a70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45  Expr->iTable, pE
19a80 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
19a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
19aa0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19ab0 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
19ac0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
19ad0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
19ae0 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Value ){.       
19af0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
19b00 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 64 22  rintf(pOut, "%d"
19b10 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75  , pExpr->u.iValu
19b20 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
19b30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19b40 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
19b50 75 74 2c 20 22 25 73 22 2c 20 70 45 78 70 72 2d  ut, "%s", pExpr-
19b60 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
19b70 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
19b80 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
19b90 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
19ba0 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61  ING_POINT.    ca
19bb0 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
19bc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
19bd0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
19be0 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %s", pExpr->u.zT
19bf0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
19c00 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
19c10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
19c20 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ING: {.      sql
19c30 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
19c40 66 28 70 4f 75 74 2c 22 25 51 22 2c 20 70 45 78  f(pOut,"%Q", pEx
19c50 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
19c60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19c70 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
19c80 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
19c90 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19ca0 28 70 4f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20  (pOut,"NULL");. 
19cb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19cc0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19cd0 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
19ce0 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
19cf0 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  LOB: {.      sql
19d00 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
19d10 66 28 70 4f 75 74 2c 22 25 73 22 2c 20 70 45 78  f(pOut,"%s", pEx
19d20 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
19d30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19d40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
19d50 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
19d60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19d70 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
19d80 2c 22 56 41 52 49 41 42 4c 45 28 25 73 2c 25 64  ,"VARIABLE(%s,%d
19d90 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19db0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
19dc0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
19dd0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19de0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
19df0 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
19e00 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
19e10 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 52 45 47  Printf(pOut,"REG
19e20 49 53 54 45 52 28 25 64 29 22 2c 20 70 45 78 70  ISTER(%d)", pExp
19e30 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
19e40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19e50 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
19e60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19e70 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
19e80 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
19e90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19ea0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19eb0 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
19ec0 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
19ed0 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
19ee0 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
19ef0 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
19f00 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
19f10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66   const char *zAf
19f20 66 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20  f = "unk";.     
19f30 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
19f40 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
19f50 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 29 7b  pr->u.zToken) ){
19f60 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
19f70 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 20 20  LITE_AFF_TEXT:  
19f80 20 20 7a 41 66 66 20 3d 20 22 54 45 58 54 22 3b    zAff = "TEXT";
19f90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19fa0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19fb0 41 46 46 5f 4e 4f 4e 45 3a 20 20 20 20 7a 41 66  AFF_NONE:    zAf
19fc0 66 20 3d 20 22 4e 4f 4e 45 22 3b 20 20 20 20 20  f = "NONE";     
19fd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
19fe0 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
19ff0 55 4d 45 52 49 43 3a 20 7a 41 66 66 20 3d 20 22  UMERIC: zAff = "
1a000 4e 55 4d 45 52 49 43 22 3b 20 20 62 72 65 61 6b  NUMERIC";  break
1a010 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  ;.        case S
1a020 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
1a030 52 3a 20 7a 41 66 66 20 3d 20 22 49 4e 54 45 47  R: zAff = "INTEG
1a040 45 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ER";  break;.   
1a050 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1a060 5f 41 46 46 5f 52 45 41 4c 3a 20 20 20 20 7a 41  _AFF_REAL:    zA
1a070 66 66 20 3d 20 22 52 45 41 4c 22 3b 20 20 20 20  ff = "REAL";    
1a080 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1a090 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a0a0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a0b0 20 22 43 41 53 54 2d 25 73 28 22 2c 20 7a 41 66   "CAST-%s(", zAf
1a0c0 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
1a0d0 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1a0e0 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1a0f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a100 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a110 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62  t, ")");.      b
1a120 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1a130 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1a140 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
1a150 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a  se TK_LT:      z
1a160 42 69 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20  BinOp = "LT";   
1a170 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a180 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42  e TK_LE:      zB
1a190 69 6e 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20  inOp = "LE";    
1a1a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a1b0 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69   TK_GT:      zBi
1a1c0 6e 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20  nOp = "GT";     
1a1d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a1e0 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e  TK_GE:      zBin
1a1f0 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62  Op = "GE";     b
1a200 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a210 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_NE:      zBinO
1a220 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72  p = "NE";     br
1a230 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a240 5f 45 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _EQ:      zBinOp
1a250 20 3d 20 22 45 51 22 3b 20 20 20 20 20 62 72 65   = "EQ";     bre
1a260 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a270 49 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  IS:      zBinOp 
1a280 3d 20 22 49 53 22 3b 20 20 20 20 20 62 72 65 61  = "IS";     brea
1a290 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1a2a0 53 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d  SNOT:   zBinOp =
1a2b0 20 22 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b   "ISNOT";  break
1a2c0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  ;.    case TK_AN
1a2d0 44 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  D:     zBinOp = 
1a2e0 22 41 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b  "AND";    break;
1a2f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1a300 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1a310 4f 52 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  OR";     break;.
1a320 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
1a330 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41  :    zBinOp = "A
1a340 44 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  DD";    break;. 
1a350 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
1a360 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55      zBinOp = "MU
1a370 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  L";    break;.  
1a380 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
1a390 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42     zBinOp = "SUB
1a3a0 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1a3b0 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20   case TK_REM:   
1a3c0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22    zBinOp = "REM"
1a3d0 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1a3e0 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20  case TK_BITAND: 
1a3f0 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e   zBinOp = "BITAN
1a400 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  D"; break;.    c
1a410 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20  ase TK_BITOR:   
1a420 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22  zBinOp = "BITOR"
1a430 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
1a440 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a  se TK_SLASH:   z
1a450 42 69 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20  BinOp = "DIV";  
1a460 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a470 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42  e TK_LSHIFT:  zB
1a480 69 6e 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b  inOp = "LSHIFT";
1a490 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a4a0 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69   TK_RSHIFT:  zBi
1a4b0 6e 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20  nOp = "RSHIFT"; 
1a4c0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a4d0 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e  TK_CONCAT:  zBin
1a4e0 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62  Op = "CONCAT"; b
1a4f0 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
1a500 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69  TK_UMINUS:  zUni
1a510 4f 70 20 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62  Op = "UMINUS"; b
1a520 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a530 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f  K_UPLUS:   zUniO
1a540 70 20 3d 20 22 55 50 4c 55 53 22 3b 20 20 62 72  p = "UPLUS";  br
1a550 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a560 5f 42 49 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70  _BITNOT:  zUniOp
1a570 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 62 72 65   = "BITNOT"; bre
1a580 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a590 4e 4f 54 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20  NOT:     zUniOp 
1a5a0 3d 20 22 4e 4f 54 22 3b 20 20 20 20 62 72 65 61  = "NOT";    brea
1a5b0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1a5c0 53 4e 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d  SNULL:  zUniOp =
1a5d0 20 22 49 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b   "ISNULL"; break
1a5e0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
1a5f0 54 4e 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20  TNULL: zUniOp = 
1a600 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b  "NOTNULL"; break
1a610 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ;..    case TK_C
1a620 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  OLLATE: {.      
1a630 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1a640 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
1a650 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
1a660 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1a670 74 66 28 70 4f 75 74 2c 22 2e 43 4f 4c 4c 41 54  tf(pOut,".COLLAT
1a680 45 28 25 73 29 22 2c 70 45 78 70 72 2d 3e 75 2e  E(%s)",pExpr->u.
1a690 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
1a6a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1a6b0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
1a6c0 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
1a6d0 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
1a6e0 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
1a6f0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
1a700 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
1a710 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
1a720 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1a730 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  s */.      if( E
1a740 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
1a750 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
1a760 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
1a770 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20    pFarg = 0;.   
1a780 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a790 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d    pFarg = pExpr-
1a7a0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
1a7b0 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  }.      if( op==
1a7c0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
1a7d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a7e0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1a7f0 70 4f 75 74 2c 20 22 41 47 47 5f 46 55 4e 43 54  pOut, "AGG_FUNCT
1a800 49 4f 4e 25 64 3a 25 73 28 22 2c 0a 20 20 20 20  ION%d:%s(",.    
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1a830 6f 70 32 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  op2, pExpr->u.zT
1a840 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
1a850 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1a860 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a870 28 70 4f 75 74 2c 20 22 46 55 4e 43 54 49 4f 4e  (pOut, "FUNCTION
1a880 3a 25 73 28 22 2c 20 70 45 78 70 72 2d 3e 75 2e  :%s(", pExpr->u.
1a890 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
1a8a0 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
1a8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1a8c0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
1a8d0 73 74 28 70 4f 75 74 2c 20 70 46 61 72 67 29 3b  st(pOut, pFarg);
1a8e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1a8f0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1a900 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a  ntf(pOut, ")");.
1a910 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a920 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1a930 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1a940 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
1a950 54 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  TS: {.      sqli
1a960 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a970 28 70 4f 75 74 2c 20 22 45 58 49 53 54 53 28 22  (pOut, "EXISTS("
1a980 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a990 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f  ExplainSelect(pO
1a9a0 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  ut, pExpr->x.pSe
1a9b0 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  lect);.      sql
1a9c0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1a9d0 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 20  f(pOut,")");.   
1a9e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a9f0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
1aa00 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CT: {.      sqli
1aa10 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1aa20 28 70 4f 75 74 2c 20 22 28 22 29 3b 0a 20 20 20  (pOut, "(");.   
1aa30 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1aa40 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45  nSelect(pOut, pE
1aa50 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
1aa60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1aa70 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1aa80 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72  , ")");.      br
1aa90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1aaa0 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
1aab0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1aac0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 49  nPrintf(pOut, "I
1aad0 4e 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  N(");.      sqli
1aae0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1aaf0 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Out, pExpr->pLef
1ab00 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1ab10 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1ab20 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  Out, ",");.     
1ab30 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1ab40 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1ab50 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
1ab60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1ab70 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20  ainSelect(pOut, 
1ab80 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1ab90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1aba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1abb0 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
1abc0 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  Out, pExpr->x.pL
1abd0 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
1abe0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1abf0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1ac00 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  )");.      break
1ac10 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1ac20 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
1ac30 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
1ac40 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
1ac50 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
1ac60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1ac70 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1ac80 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
1ac90 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
1aca0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
1acb0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1acc0 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
1acd0 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
1ace0 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
1acf0 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
1ad00 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
1ad10 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
1ad20 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
1ad30 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
1ad40 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
1ad50 45 78 70 72 20 2a 70 58 20 3d 20 70 45 78 70 72  Expr *pX = pExpr
1ad60 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ->pLeft;.      E
1ad70 78 70 72 20 2a 70 59 20 3d 20 70 45 78 70 72 2d  xpr *pY = pExpr-
1ad80 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
1ad90 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72  Expr;.      Expr
1ada0 20 2a 70 5a 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pZ = pExpr->x.
1adb0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
1adc0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
1add0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1ade0 75 74 2c 20 22 42 45 54 57 45 45 4e 28 22 29 3b  ut, "BETWEEN(");
1adf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ae00 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1ae10 70 58 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pX);.      sqlit
1ae20 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1ae30 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  pOut, ",");.    
1ae40 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1ae50 45 78 70 72 28 70 4f 75 74 2c 20 70 59 29 3b 0a  Expr(pOut, pY);.
1ae60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ae70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1ae80 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c   ",");.      sql
1ae90 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1aea0 70 4f 75 74 2c 20 70 5a 29 3b 0a 20 20 20 20 20  pOut, pZ);.     
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 20 22 29 22 29  rintf(pOut, ")")
1aed0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1aee0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1aef0 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20  _TRIGGER: {.    
1af00 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f    /* If the opco
1af10 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52  de is TK_TRIGGER
1af20 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
1af30 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72  ssion is a refer
1af40 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ence.      ** to
1af50 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
1af60 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
1af70 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76  pseudo-tables av
1af80 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  ailable to.     
1af90 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67   ** trigger prog
1afa0 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61  rams. In this ca
1afb0 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69  se Expr.iTable i
1afc0 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74  s set to 1 for t
1afd0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  he.      ** new.
1afe0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
1aff0 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64  or 0 for the old
1b000 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  .* pseudo-table.
1b010 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20   Expr.iColumn.  
1b020 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
1b030 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   the column of t
1b040 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  he pseudo-table 
1b050 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d  to read, or to -
1b060 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  1 to.      ** re
1b070 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  ad the rowid fie
1b080 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ld..      */.   
1b090 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b0a0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25  nPrintf(pOut, "%
1b0b0 73 28 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20  s(%d)", .       
1b0c0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1b0d0 20 3f 20 22 4e 45 57 22 20 3a 20 22 4f 4c 44 22   ? "NEW" : "OLD"
1b0e0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1b0f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b100 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1b110 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  K_CASE: {.      
1b120 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b130 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53 45  intf(pOut, "CASE
1b140 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (");.      sqlit
1b150 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1b160 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1b170 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b180 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b190 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
1b1a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1b1b0 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45 78  prList(pOut, pEx
1b1c0 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
1b1d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b1e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b1f0 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
1b200 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
1b210 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1b220 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 75 6e 6b  ar *zType = "unk
1b230 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  ";.      switch(
1b240 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1b250 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
1b260 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20 20   OE_Rollback:   
1b270 7a 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62 61 63  zType = "rollbac
1b280 6b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  k";  break;.    
1b290 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72      case OE_Abor
1b2a0 74 3a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  t:      zType = 
1b2b0 22 61 62 6f 72 74 22 3b 20 20 20 20 20 62 72 65  "abort";     bre
1b2c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1b2d0 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20 20 20   OE_Fail:       
1b2e0 7a 54 79 70 65 20 3d 20 22 66 61 69 6c 22 3b 20  zType = "fail"; 
1b2f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b300 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f      case OE_Igno
1b310 72 65 3a 20 20 20 20 20 7a 54 79 70 65 20 3d 20  re:     zType = 
1b320 22 69 67 6e 6f 72 65 22 3b 20 20 20 20 62 72 65  "ignore";    bre
1b330 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1b340 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b350 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 52 41  Printf(pOut, "RA
1b360 49 53 45 2d 25 73 28 25 73 29 22 2c 20 7a 54 79  ISE-%s(%s)", zTy
1b370 70 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  pe, pExpr->u.zTo
1b380 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
1b390 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1b3a0 20 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e 4f 70    }.  if( zBinOp
1b3b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1b3c0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b3d0 74 2c 22 25 73 28 22 2c 20 7a 42 69 6e 4f 70 29  t,"%s(", zBinOp)
1b3e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1b3f0 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1b400 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1b410 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b420 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 2c 22 29  Printf(pOut,",")
1b430 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1b440 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1b450 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1b460 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b470 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22  nPrintf(pOut,")"
1b480 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  );.  }else if( z
1b490 55 6e 69 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c  UniOp ){.    sql
1b4a0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1b4b0 66 28 70 4f 75 74 2c 22 25 73 28 22 2c 20 7a 55  f(pOut,"%s(", zU
1b4c0 6e 69 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  niOp);.    sqlit
1b4d0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1b4e0 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1b4f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1b500 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1b510 2c 22 29 22 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ,")");.  }.}.#en
1b520 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
1b530 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
1b540 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a 0a 23  E_EXPLAIN) */..#
1b550 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1b560 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1b570 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e  PLAIN)./*.** Gen
1b580 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65  erate a human-re
1b590 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69  adable explanati
1b5a0 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  on of an express
1b5b0 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
1b5c0 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e  d sqlite3Explain
1b5d0 45 78 70 72 4c 69 73 74 28 56 64 62 65 20 2a 70  ExprList(Vdbe *p
1b5e0 4f 75 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  Out, ExprList *p
1b5f0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1b600 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c    if( pList==0 |
1b610 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  | pList->nExpr==
1b620 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1b630 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b640 75 74 2c 20 22 28 65 6d 70 74 79 2d 6c 69 73 74  ut, "(empty-list
1b650 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  )");.    return;
1b660 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69  .  }else if( pLi
1b670 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a  st->nExpr==1 ){.
1b680 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b690 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c 69  inExpr(pOut, pLi
1b6a0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
1b6b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1b6c0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
1b6d0 28 70 4f 75 74 29 3b 0a 20 20 20 20 66 6f 72 28  (pOut);.    for(
1b6e0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1b6f0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b700 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b710 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 69 74 65  rintf(pOut, "ite
1b720 6d 5b 25 64 5d 20 3d 20 22 2c 20 69 29 3b 0a 20  m[%d] = ", i);. 
1b730 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b740 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a 20  ainPush(pOut);. 
1b750 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b760 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c  ainExpr(pOut, pL
1b770 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
1b780 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b790 78 70 6c 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b  xplainPop(pOut);
1b7a0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
1b7b0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
1b7c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b7d0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b7e0 74 2c 20 22 20 41 53 20 25 73 22 2c 20 70 4c 69  t, " AS %s", pLi
1b7f0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
1b800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b810 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62  f( pList->a[i].b
1b820 53 70 61 6e 49 73 54 61 62 20 29 7b 0a 20 20 20  SpanIsTab ){.   
1b830 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b840 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1b850 22 20 28 25 73 29 22 2c 20 70 4c 69 73 74 2d 3e  " (%s)", pList->
1b860 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[i].zSpan);.   
1b870 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
1b880 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
1b890 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b8a0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 4f 75 74  e3ExplainNL(pOut
1b8b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1b8c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1b8d0 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20  ainPop(pOut);.  
1b8e0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
1b8f0 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f  LITE_DEBUG */../
1b900 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1b910 20 69 66 20 70 45 78 70 72 20 69 73 20 61 6e 20   if pExpr is an 
1b920 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
1b930 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72  ion that is appr
1b940 6f 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66  opriate.** for f
1b950 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20  actoring out of 
1b960 61 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72  a loop.  Appropr
1b970 69 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  iate expressions
1b980 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a   are:.**.**    *
1b990 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e    Any expression
1b9a0 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20   that evaluates 
1b9b0 74 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f  to two or more o
1b9c0 70 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  pcodes..**.**   
1b9d0 20 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67   *  Any OP_Integ
1b9e0 65 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f  er, OP_Real, OP_
1b9f0 53 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c  String, OP_Blob,
1ba00 20 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20   OP_Null, .**   
1ba10 20 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62      or OP_Variab
1ba20 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
1ba30 20 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63   need to be plac
1ba40 65 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20  ed in a .**     
1ba50 20 20 73 70 65 63 69 66 69 63 20 72 65 67 69 73    specific regis
1ba60 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ter..**.** There
1ba70 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1ba80 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69  factoring out si
1ba90 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e  ngle-instruction
1baa0 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70   constant.** exp
1bab0 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65  ressions that ne
1bac0 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20  ed to be placed 
1bad0 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  in a particular 
1bae0 72 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57  register.  .** W
1baf0 65 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74  e could factor t
1bb00 68 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65  hem out, but the
1bb10 6e 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75  n we would end u
1bb20 70 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f  p adding an.** O
1bb30 50 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74  P_SCopy instruct
1bb40 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  ion to move the 
1bb50 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63  value into the c
1bb60 6f 72 72 65 63 74 20 72 65 67 69 73 74 65 72 0a  orrect register.
1bb70 2a 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69  ** later.  We mi
1bb80 67 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74  ght as well just
1bb90 20 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   use the origina
1bba0 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e  l instruction an
1bbb0 64 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f  d.** avoid the O
1bbc0 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74  P_SCopy..*/.stat
1bbd0 69 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72  ic int isAppropr
1bbe0 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67  iateForFactoring
1bbf0 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
1bc00 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
1bc10 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
1bc20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1bc30 30 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73  0;  /* Only cons
1bc40 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  tant expressions
1bc50 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65   are appropriate
1bc60 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a   for factoring *
1bc70 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1bc80 66 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64  flags & EP_Fixed
1bc90 44 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Dest)==0 ){.    
1bca0 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e  return 1;  /* An
1bcb0 79 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f  y constant witho
1bcc0 75 74 20 61 20 66 69 78 65 64 20 64 65 73 74 69  ut a fixed desti
1bcd0 6e 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70  nation is approp
1bce0 72 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77  riate */.  }.  w
1bcf0 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
1bd00 55 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70  UPLUS ) p = p->p
1bd10 4c 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20  Left;.  switch( 
1bd20 70 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66  p->op ){.#ifndef
1bd30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
1bd40 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
1bd50 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64  se TK_BLOB:.#end
1bd60 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
1bd70 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73  ARIABLE:.    cas
1bd80 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
1bd90 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
1bda0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1bdb0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  L:.    case TK_S
1bdc0 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74  TRING: {.      t
1bdd0 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
1bde0 54 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20  TK_BLOB );.     
1bdf0 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
1be00 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b  ==TK_VARIABLE );
1be10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1be20 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47   p->op==TK_INTEG
1be30 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ER );.      test
1be40 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
1be50 46 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74  FLOAT );.      t
1be60 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
1be70 54 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  TK_NULL );.     
1be80 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
1be90 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20  ==TK_STRING );. 
1bea0 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69       /* Single-i
1beb0 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74  nstruction const
1bec0 61 6e 74 73 20 77 69 74 68 20 61 20 66 69 78 65  ants with a fixe
1bed0 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72  d destination ar
1bee0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  e.      ** bette
1bef0 72 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20  r done in-line. 
1bf00 20 49 66 20 77 65 20 66 61 63 74 6f 72 20 74 68   If we factor th
1bf10 65 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75  em, they will ju
1bf20 73 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20  st end.      ** 
1bf30 75 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e  up generating an
1bf40 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76   OP_SCopy to mov
1bf50 65 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74  e the value to t
1bf60 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20  he destination. 
1bf70 20 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72       ** register
1bf80 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
1bf90 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 0;.    }.    c
1bfa0 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
1bfb0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
1bfc0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
1bfd0 54 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f  T || p->pLeft->o
1bfe0 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
1bff0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1c000 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1c010 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c020 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
1c030 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c040 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
1c050 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70  }../*.** If pExp
1c060 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  r is a constant 
1c070 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1c080 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
1c090 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20  or.** factoring 
1c0a0 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74  out of a loop, t
1c0b0 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65  hen evaluate the
1c0c0 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
1c0d0 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61  nto a register a
1c0e0 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65  nd convert the e
1c0f0 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61  xpression into a
1c100 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20   TK_REGISTER.** 
1c110 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73  expression..*/.s
1c120 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f  tatic int evalCo
1c130 6e 73 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a  nstExpr(Walker *
1c140 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
1c150 45 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a  Expr){.  Parse *
1c160 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
1c170 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74  ->pParse;.  swit
1c180 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
1c190 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
1c1a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
1c1b0 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ISTER: {.      r
1c1c0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
1c1d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c1e0 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20  TK_COLLATE: {.  
1c1f0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
1c200 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
1c210 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
1c220 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
1c230 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
1c240 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54     case TK_CONST
1c250 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f  _FUNC: {.      /
1c260 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  * The arguments 
1c270 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61  to a function ha
1c280 76 65 20 61 20 66 69 78 65 64 20 64 65 73 74 69  ve a fixed desti
1c290 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a  nation..      **
1c2a0 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20   Mark them this 
1c2b0 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e  way to avoid gen
1c2c0 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20  erated unneeded 
1c2d0 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a  OP_SCopy.      *
1c2e0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  * instructions. 
1c2f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c300 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1c310 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1c320 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c330 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1c340 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1c350 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
1c360 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1c370 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73      int i = pLis
1c380 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
1c390 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1c3a0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1c3b0 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  pList->a;.      
1c3c0 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d    for(; i>0; i--
1c3d0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1c3e0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
1c3f0 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29  (pItem->pExpr) )
1c400 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66   pItem->pExpr->f
1c410 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69 78 65 64  lags |= EP_Fixed
1c420 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Dest;.        }.
1c430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1c440 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1c450 20 69 66 28 20 69 73 41 70 70 72 6f 70 72 69 61   if( isAppropria
1c460 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 70  teForFactoring(p
1c470 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Expr) ){.    int
1c480 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e   r1 = ++pParse->
1c490 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32  nMem;.    int r2
1c4a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1c4b0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1c4c0 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   pExpr, r1);.   
1c4d0 20 2f 2a 20 49 66 20 72 32 21 3d 72 31 2c 20 69   /* If r2!=r1, i
1c4e0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 67  t means that reg
1c4f0 69 73 74 65 72 20 72 31 20 69 73 20 6e 65 76 65  ister r1 is neve
1c500 72 20 75 73 65 64 2e 20 20 54 68 61 74 20 69 73  r used.  That is
1c510 20 68 61 72 6d 6c 65 73 73 0a 20 20 20 20 2a 2a   harmless.    **
1c520 20 62 75 74 20 73 75 62 6f 70 74 69 6d 61 6c 2c   but suboptimal,
1c530 20 73 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6b   so we want to k
1c540 6e 6f 77 20 61 62 6f 75 74 20 74 68 65 20 73 69  now about the si
1c550 74 75 61 74 69 6f 6e 20 74 6f 20 66 69 78 20 69  tuation to fix i
1c560 74 2e 0a 20 20 20 20 2a 2a 20 48 65 6e 63 65 20  t..    ** Hence 
1c570 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
1c580 73 65 72 74 3a 20 2a 2f 0a 20 20 20 20 61 73 73  sert: */.    ass
1c590 65 72 74 28 20 72 32 3d 3d 72 31 20 29 3b 0a 20  ert( r2==r1 );. 
1c5a0 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20     pExpr->op2 = 
1c5b0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70  pExpr->op;.    p
1c5c0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  Expr->op = TK_RE
1c5d0 47 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78 70  GISTER;.    pExp
1c5e0 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a  r->iTable = r2;.
1c5f0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1c600 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rune;.  }.  retu
1c610 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1c620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61  .}../*.** Preeva
1c630 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20 73  luate constant s
1c640 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69  ubexpressions wi
1c650 74 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20 73  thin pExpr and s
1c660 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
1c670 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 73  lts in registers
1c680 2e 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72 20  .  Modify pExpr 
1c690 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  so that the cons
1c6a0 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 69 6f  tant subexpresio
1c6b0 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47  ns.** are TK_REG
1c6c0 49 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74 68  ISTER opcodes th
1c6d0 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
1c6e0 70 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c 75  precomputed valu
1c6f0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
1c700 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1c710 70 20 69 66 20 74 68 65 20 6a 75 6d 70 20 74 6f  p if the jump to
1c720 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68 65 63   the cookie-chec
1c730 6b 20 63 6f 64 65 20 68 61 73 0a 2a 2a 20 61 6c  k code has.** al
1c740 72 65 61 64 79 20 6f 63 63 75 72 2e 20 20 53 69  ready occur.  Si
1c750 6e 63 65 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63  nce the cookie-c
1c760 68 65 63 6b 20 6a 75 6d 70 20 69 73 20 67 65 6e  heck jump is gen
1c770 65 72 61 74 65 64 20 70 72 69 6f 72 20 74 6f 0a  erated prior to.
1c780 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 73 65 72  ** any other ser
1c790 69 6f 75 73 20 70 72 6f 63 65 73 73 69 6e 67 2c  ious processing,
1c7a0 20 74 68 69 73 20 63 68 65 63 6b 20 65 6e 73 75   this check ensu
1c7b0 72 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  res that there i
1c7c0 73 20 6e 6f 0a 2a 2a 20 77 61 79 20 74 6f 20 61  s no.** way to a
1c7d0 63 63 69 64 65 6e 74 6c 79 20 62 79 70 61 73 73  ccidently bypass
1c7e0 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e   the constant in
1c7f0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 73 2e 0a 2a  itializations..*
1c800 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c810 65 20 69 73 20 61 6c 73 6f 20 61 20 6e 6f 2d 6f  e is also a no-o
1c820 70 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  p if the SQLITE_
1c830 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20 6f  FactorOutConst o
1c840 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69  ptimization.** i
1c850 73 20 64 69 73 61 62 6c 65 64 20 76 69 61 20 74  s disabled via t
1c860 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  he sqlite3_test_
1c870 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1c880 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
1c890 54 49 4f 4e 53 29 0a 2a 2a 20 69 6e 74 65 72 66  TIONS).** interf
1c8a0 61 63 65 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77  ace.  This allow
1c8b0 73 20 74 65 73 74 20 6c 6f 67 69 63 20 74 6f 20  s test logic to 
1c8c0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1c8d0 73 61 6d 65 20 61 6e 73 77 65 72 20 69 73 0a 2a  same answer is.*
1c8e0 2a 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 20 71  * obtained for q
1c8f0 75 65 72 69 65 73 20 72 65 67 61 72 64 6c 65 73  ueries regardles
1c900 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
1c910 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  not constants ar
1c920 65 0a 2a 2a 20 70 72 65 63 6f 6d 70 75 74 65 64  e.** precomputed
1c930 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20   into registers 
1c940 6f 72 20 69 66 20 74 68 65 79 20 61 72 65 20 69  or if they are i
1c950 6e 73 65 72 74 65 64 20 69 6e 2d 6c 69 6e 65 2e  nserted in-line.
1c960 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c970 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
1c980 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
1c990 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
1c9a0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 66 28   Walker w;.  if(
1c9b0 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1c9c0 6f 74 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  oto ) return;.  
1c9d0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
1c9e0 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d  Disabled(pParse-
1c9f0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 46 61 63 74  >db, SQLITE_Fact
1ca00 6f 72 4f 75 74 43 6f 6e 73 74 29 20 29 20 72 65  orOutConst) ) re
1ca10 74 75 72 6e 3b 0a 20 20 77 2e 78 45 78 70 72 43  turn;.  w.xExprC
1ca20 61 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f  allback = evalCo
1ca30 6e 73 74 45 78 70 72 3b 0a 20 20 77 2e 78 53 65  nstExpr;.  w.xSe
1ca40 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30  lectCallback = 0
1ca50 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
1ca60 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
1ca70 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
1ca80 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  pr);.}.../*.** G
1ca90 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1caa0 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c  t pushes the val
1cab0 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  ue of every elem
1cac0 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ent of the given
1cad0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
1cae0 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65  ist into a seque
1caf0 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
1cb00 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61   beginning at ta
1cb10 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  rget..**.** Retu
1cb20 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1cb30 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61   elements evalua
1cb40 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
1cb50 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
1cb60 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
1cb70 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
1cb80 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1cb90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1cba0 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  t,   /* The expr
1cbb0 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62  ession list to b
1cbc0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e coded */.  int
1cbd0 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20   target,        
1cbe0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
1cbf0 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
1cc00 6e 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20 20  nt doHardCopy   
1cc10 20 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61 72 64    /* Make a hard
1cc20 20 63 6f 70 79 20 6f 66 20 65 76 65 72 79 20 65   copy of every e
1cc30 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  lement */.){.  s
1cc40 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1cc50 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
1cc60 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74  t i, n;.  assert
1cc70 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
1cc80 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1cc90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1cca0 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29  arse->pVdbe!=0 )
1ccb0 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73  ;  /* Never gets
1ccc0 20 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77   this far otherw
1ccd0 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69  ise */.  n = pLi
1cce0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72  st->nExpr;.  for
1ccf0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
1cd00 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20   i=0; i<n; i++, 
1cd10 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pItem++){.    Ex
1cd20 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65  pr *pExpr = pIte
1cd30 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  m->pExpr;.    in
1cd40 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65  t inReg = sqlite
1cd50 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1cd60 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1cd70 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 69 66  arget+i);.    if
1cd80 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b  ( inReg!=target+
1cd90 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  i ){.      sqlit
1cda0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
1cdb0 72 73 65 2d 3e 70 56 64 62 65 2c 20 64 6f 48 61  rse->pVdbe, doHa
1cdc0 72 64 43 6f 70 79 20 3f 20 4f 50 5f 43 6f 70 79  rdCopy ? OP_Copy
1cdd0 20 3a 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20   : OP_SCopy,.   
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdf0 20 20 20 20 20 69 6e 52 65 67 2c 20 74 61 72 67       inReg, targ
1ce00 65 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  et+i);.    }.  }
1ce10 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
1ce20 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1ce30 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45  ode for a BETWEE
1ce40 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
1ce50 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
1ce60 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65   AND z.**.** The
1ce70 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61   above is equiva
1ce80 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20  lent to .**.**  
1ce90 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
1cea0 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73  **.** Code it as
1ceb0 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
1cec0 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
1ced0 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
1cee0 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f  n.** elementatio
1cef0 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69  n of x..*/.stati
1cf00 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42  c void exprCodeB
1cf10 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20  etween(.  Parse 
1cf20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
1cf30 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
1cf40 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
1cf50 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
1cf60 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
1cf70 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73   BETWEEN express
1cf80 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
1cf90 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
1cfa0 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 6a  mp here if the j
1cfb0 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a  ump is taken */.
1cfc0 20 20 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65    int jumpIfTrue
1cfd0 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20  ,   /* Take the 
1cfe0 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57  jump if the BETW
1cff0 45 45 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  EEN is true */. 
1d000 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
1d010 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a     /* Take the j
1d020 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45  ump if the BETWE
1d030 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  EN is NULL */.){
1d040 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b  .  Expr exprAnd;
1d050 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20       /* The AND 
1d060 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d  operator in  x>=
1d070 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20  y AND x<=z  */. 
1d080 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20   Expr compLeft; 
1d090 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20     /* The  x>=y 
1d0a0 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
1d0b0 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20  compRight;   /* 
1d0c0 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20  The  x<=z  term 
1d0d0 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b  */.  Expr exprX;
1d0e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78         /* The  x
1d0f0 20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20    subexpression 
1d100 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1d110 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72  1 = 0; /* Tempor
1d120 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
1d130 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21   */..  assert( !
1d140 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1d150 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1d160 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20  ect) );.  exprX 
1d170 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  = *pExpr->pLeft;
1d180 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20  .  exprAnd.op = 
1d190 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e  TK_AND;.  exprAn
1d1a0 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
1d1b0 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  eft;.  exprAnd.p
1d1c0 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
1d1d0 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f  ht;.  compLeft.o
1d1e0 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d  p = TK_GE;.  com
1d1f0 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
1d200 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  xprX;.  compLeft
1d210 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
1d220 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
1d230 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68  Expr;.  compRigh
1d240 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20  t.op = TK_LE;.  
1d250 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
1d260 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70  = &exprX;.  comp
1d270 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
1d280 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
1d290 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70  [1].pExpr;.  exp
1d2a0 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  rX.iTable = sqli
1d2b0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1d2c0 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
1d2d0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 65 78  &regFree1);.  ex
1d2e0 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  prX.op = TK_REGI
1d2f0 53 54 45 52 3b 0a 20 20 69 66 28 20 6a 75 6d 70  STER;.  if( jump
1d300 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20 73 71  IfTrue ){.    sq
1d310 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1d320 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
1d330 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1d340 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
1d350 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1d360 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65 78  alse(pParse, &ex
1d370 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d  prAnd, dest, jum
1d380 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
1d390 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1d3a0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1d3b0 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45  gFree1);..  /* E
1d3c0 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74  nsure adequate t
1d3d0 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  est coverage */.
1d3e0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1d3f0 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1d400 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
1d410 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1d420 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1d430 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1d440 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1d450 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
1d460 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1d470 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1d480 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
1d490 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1d4a0 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1d4b0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1d4c0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1d4d0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1d4e0 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1d4f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1d500 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
1d510 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1d520 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1d530 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1d540 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
1d550 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d560 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1d570 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1d580 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
1d590 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1d5a0 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1d5b0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1d5c0 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  1!=0 );.}../*.**
1d5d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1d5e0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
1d5f0 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
1d600 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
1d610 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
1d620 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
1d630 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
1d640 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
1d650 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
1d660 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
1d670 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1d680 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
1d690 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
1d6a0 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
1d6b0 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
1d6c0 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
1d6d0 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
1d6e0 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
1d6f0 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54  ll flag is SQLIT
1d700 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a  E_JUMPIFNULL..**
1d710 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
1d720 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
1d730 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
1d740 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
1d750 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
1d760 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
1d770 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
1d780 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
1d790 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
1d7a0 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
1d7b0 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
1d7c0 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
1d7d0 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
1d7e0 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
1d7f0 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
1d800 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
1d810 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
1d820 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
1d830 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
1d840 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1d850 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
1d860 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
1d870 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1d880 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20  xprIfTrue(Parse 
1d890 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1d8a0 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
1d8b0 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1d8c0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1d8d0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1d8e0 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
1d8f0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
1d900 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1d910 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
1d920 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
1d930 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
1d940 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
1d950 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
1d960 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
1d970 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a       return;  /*
1d980 20 45 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44   Existance of VD
1d990 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
1d9a0 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ller */.  if( NE
1d9b0 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20  VER(pExpr==0) ) 
1d9c0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77  return;  /* No w
1d9d0 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ay this can happ
1d9e0 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78  en */.  op = pEx
1d9f0 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
1da00 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1da10 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
1da20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
1da30 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1da40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1da50 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1da60 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1da70 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1da80 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1da90 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1daa0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1dab0 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
1dac0 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
1dad0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
1dae0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1daf0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1db00 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1db10 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1db20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1db30 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
1db40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1db50 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1db60 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  e, 1);.      bre
1db70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1db80 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
1db90 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1dba0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1dbb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1dbc0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
1dbd0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1dbe0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1dbf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1dc00 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1dc10 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1dc20 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1dc30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dc40 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1dc50 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
1dc60 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1dc70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1dc80 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1dc90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1dca0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1dcb0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1dcc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1dcd0 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
1dce0 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
1dcf0 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
1dd00 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
1dd10 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
1dd20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
1dd30 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1dd40 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
1dd50 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
1dd60 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
1dd70 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
1dd80 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
1dd90 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
1dda0 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
1ddb0 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
1ddc0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ddd0 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
1dde0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ddf0 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
1de00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1de10 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
1de20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1de30 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
1de40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1de50 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
1de60 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
1de70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1de80 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
1de90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dea0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1deb0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1dec0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ded0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1dee0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1def0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1df00 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1df10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1df20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1df30 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
1df40 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1df50 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1df60 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df80 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
1df90 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1dfa0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1dfb0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1dfc0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1dfd0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1dfe0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1dff0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1e000 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
1e010 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e020 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
1e030 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e040 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
1e050 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1e060 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e070 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e080 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1e090 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1e0a0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e0b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1e0c0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1e0d0 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
1e0e0 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
1e0f0 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
1e100 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1e110 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e120 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1e130 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1e140 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1e150 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  est, SQLITE_NULL
1e160 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
1e170 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1e180 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1e190 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1e1a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e1b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1e1c0 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
1e1d0 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
1e1e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1e1f0 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
1e200 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
1e210 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
1e220 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
1e230 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e240 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
1e250 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e260 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
1e270 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1e280 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e290 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e2a0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1e2b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e2c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1e2d0 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
1e2e0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1e2f0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1e300 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e310 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1e320 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
1e330 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1e340 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
1e350 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
1e360 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1e370 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  , 1, jumpIfNull)
1e380 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e390 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1e3a0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1e3b0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
1e3c0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
1e3d0 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
1e3e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1e3f0 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  (v);.      int d
1e400 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70  estIfNull = jump
1e410 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20  IfNull ? dest : 
1e420 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20  destIfFalse;.   
1e430 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1e440 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
1e450 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
1e460 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
1e470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e480 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1e490 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
1e4a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1e4b0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1e4c0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
1e4d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1e4e0 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
1e4f0 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
1e500 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e510 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e520 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1e530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e540 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
1e550 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
1e560 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
1e570 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1e580 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1e590 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1e5a0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1e5b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1e5c0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1e5d0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1e5e0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
1e5f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1e600 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1e610 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
1e620 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1e630 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
1e640 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
1e650 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
1e660 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
1e670 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
1e680 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
1e690 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
1e6a0 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
1e6b0 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
1e6c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1e6d0 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
1e6e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1e6f0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
1e700 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
1e710 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
1e720 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
1e730 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
1e740 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
1e750 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
1e760 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
1e770 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e780 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
1e790 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1e7a0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
1e7b0 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
1e7c0 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
1e7d0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1e7e0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
1e7f0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1e800 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
1e810 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
1e820 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
1e830 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
1e840 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
1e850 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1e860 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
1e870 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45  ) ) return; /* E
1e880 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44 42 45  xistance of VDBE
1e890 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
1e8a0 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  er */.  if( pExp
1e8b0 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e  r==0 )    return
1e8c0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
1e8d0 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
1e8e0 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
1e8f0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
1e900 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
1e910 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
1e920 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
1e930 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
1e940 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
1e950 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
1e960 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
1e970 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
1e980 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
1e990 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
1e9a0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1e9c0 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
1e9d0 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
1e9e0 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
1e9f0 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
1ea00 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
1ea10 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
1ea20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
1ea30 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1ea50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
1ea60 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
1ea70 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
1ea80 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
1ea90 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
1eaa0 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
1eab0 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
1eac0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
1ead0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
1eae0 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
1eaf0 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
1eb00 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
1eb10 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
1eb20 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
1eb30 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
1eb40 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
1eb50 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1eb60 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
1eb70 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
1eb80 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
1eb90 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
1eba0 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
1ebb0 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
1ebc0 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
1ebd0 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
1ebe0 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
1ebf0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ec00 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
1ec10 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
1ec20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1ec30 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
1ec40 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
1ec50 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
1ec60 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
1ec70 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
1ec80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1ec90 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
1eca0 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
1ecb0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1ecc0 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
1ecd0 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
1ece0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1ecf0 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
1ed00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1ed10 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
1ed20 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
1ed30 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1ed40 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
1ed50 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
1ed60 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
1ed70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1ed80 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1ed90 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1eda0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1edb0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1edc0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1edd0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1ede0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1edf0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1ee00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ee10 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
1ee20 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1ee30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ee40 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
1ee50 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
1ee60 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1ee70 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
1ee80 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1ee90 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1eea0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1eeb0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1eec0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1eed0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1eee0 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75  r->pLeft, d2, ju
1eef0 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
1ef00 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1ef10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1ef20 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1ef30 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1ef40 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1ef50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ef60 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1ef70 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
1ef80 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1ef90 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
1efa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1efb0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
1efc0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1efd0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1efe0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1eff0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1f000 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f010 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f020 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1f030 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f040 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1f050 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1f060 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1f070 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1f080 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1f090 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74  TK_EQ: {.      t
1f0a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f0b0 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
1f0c0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20  case( op==TK_LE 
1f0d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f0e0 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  e( op==TK_GT );.
1f0f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f100 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op==TK_GE );.   
1f110 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f120 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =TK_EQ );.      
1f130 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f140 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _NE );.      tes
1f150 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1f160 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
1f170 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f180 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f190 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1f1a0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1f1b0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1f1c0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1f1d0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1f1e0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1f1f0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1f200 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f210 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1f220 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1f230 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1f240 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1f250 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f260 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f270 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f280 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1f290 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f2a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f2b0 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1f2c0 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  ISNOT: {.      t
1f2d0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
1f2e0 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1f2f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
1f300 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
1f310 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1f320 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f330 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f340 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1f350 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1f360 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f370 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f380 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1f390 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20  ree2);.      op 
1f3a0 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  = (pExpr->op==TK
1f3b0 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54  _IS) ? TK_NE : T
1f3c0 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f 64 65  K_EQ;.      code
1f3d0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1f3e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
1f3f0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1f400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f410 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
1f420 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
1f430 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f440 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1f450 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f460 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1f470 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f480 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
1f490 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
1f4a0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
1f4b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f4c0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
1f4d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f4e0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
1f4f0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f500 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f510 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f520 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f530 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f540 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
1f550 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
1f560 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f570 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1f580 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f590 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
1f5a0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1f5b0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1f5c0 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
1f5d0 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
1f5e0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1f5f0 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  0, jumpIfNull);.
1f600 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f610 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1f620 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1f630 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
1f640 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
1f650 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
1f660 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1f670 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
1f680 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
1f690 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f6a0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
1f6b0 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
1f6c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1f6d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1f6e0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
1f6f0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
1f700 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
1f710 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1f720 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1f730 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
1f740 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1f750 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1f760 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1f770 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1f780 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f790 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
1f7a0 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
1f7b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1f7c0 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64   OP_IfNot, r1, d
1f7d0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
1f7e0 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  =0);.      testc
1f7f0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f800 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1f810 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1f820 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1f830 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1f840 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1f850 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1f860 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
1f870 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1f880 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
1f890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
1f8a0 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
1f8b0 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
1f8c0 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
1f8d0 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a   0 if the two.**
1f8e0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
1f8f0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e   completely iden
1f900 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31  tical.  Return 1
1f910 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
1f920 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c  only.** by a COL
1f930 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74  LATE operator at
1f940 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20   the top level. 
1f950 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68 65   Return 2 if the
1f960 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63  re are differenc
1f970 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e  es.** other than
1f980 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43   the top-level C
1f990 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
1f9a0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
1f9b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1f9c0 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e  ll return 2 even
1f9d0 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
1f9e0 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c  essions.** reall
1f9f0 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  y are equivalent
1fa00 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  .  If we cannot 
1fa10 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65  prove that the e
1fa20 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
1fa30 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20  * identical, we 
1fa40 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f  return 2 just to
1fa50 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66   be safe.  So if
1fa60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1fa70 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e   returns 2, then
1fa80 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c   you do not real
1fa90 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74  ly know for cert
1faa0 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  ain if the two.*
1fab0 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
1fac0 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
1fad0 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20   if you get a 0 
1fae0 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65  or 1 return, the
1faf0 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20  n you.** can be 
1fb00 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73  sure the express
1fb10 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
1fb20 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65  e.  In the place
1fb30 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20  s where.** this 
1fb40 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c  routine is used,
1fb50 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72   it does not hur
1fb60 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72  t to get an extr
1fb70 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75  a 2 - that.** ju
1fb80 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  st might result 
1fb90 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79  in some slightly
1fba0 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42   slower code.  B
1fbb0 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  ut returning.** 
1fbc0 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f  an incorrect 0 o
1fbd0 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  r 1 could lead t
1fbe0 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e  o a malfunction.
1fbf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
1fc00 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20  xprCompare(Expr 
1fc10 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a  *pA, Expr *pB){.
1fc20 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d    if( pA==0||pB=
1fc30 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1fc40 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b   pB==pA ? 0 : 2;
1fc50 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
1fc60 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
1fc70 74 79 28 70 41 2c 20 45 50 5f 54 6f 6b 65 6e 4f  ty(pA, EP_TokenO
1fc80 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
1fc90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  );.  assert( !Ex
1fca0 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
1fcb0 28 70 42 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  (pB, EP_TokenOnl
1fcc0 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
1fcd0 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
1fce0 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f 78 49  operty(pA, EP_xI
1fcf0 73 53 65 6c 65 63 74 29 20 7c 7c 20 45 78 70 72  sSelect) || Expr
1fd00 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20  HasProperty(pB, 
1fd10 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1fd20 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
1fd30 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c   }.  if( (pA->fl
1fd40 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
1fd50 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26  t)!=(pB->flags &
1fd60 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20   EP_Distinct) ) 
1fd70 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
1fd80 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29  pA->op!=pB->op )
1fd90 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
1fda0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
1fdb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1fdc0 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
1fdd0 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
1fde0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
1fdf0 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f   if( pB->op==TK_
1fe00 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
1fe10 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
1fe20 2c 20 70 42 2d 3e 70 4c 65 66 74 29 3c 32 20 29  , pB->pLeft)<2 )
1fe30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
1fe40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1fe50 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
1fe60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1fe70 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
1fe80 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
1fe90 6e 20 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 2;.  if( sqlit
1fea0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
1feb0 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
1fec0 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 32  ight) ) return 2
1fed0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
1fee0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
1fef0 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e  A->x.pList, pB->
1ff00 78 2e 70 4c 69 73 74 29 20 29 20 72 65 74 75 72  x.pList) ) retur
1ff10 6e 20 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69  n 2;.  if( pA->i
1ff20 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
1ff30 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e  e || pA->iColumn
1ff40 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
1ff50 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
1ff60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ff70 70 41 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pA, EP_IntValue)
1ff80 20 29 7b 0a 20 20 20 20 69 66 28 20 21 45 78 70   ){.    if( !Exp
1ff90 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c  rHasProperty(pB,
1ffa0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
1ffb0 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 21 3d 70   pA->u.iValue!=p
1ffc0 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
1ffd0 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
1ffe0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1fff0 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
20000 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 41 2d  MN && ALWAYS(pA-
20010 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
20020 4d 4e 29 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f  MN) && pA->u.zTo
20030 6b 65 6e 29 7b 0a 20 20 20 20 69 66 28 20 45 78  ken){.    if( Ex
20040 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
20050 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
20060 7c 20 4e 45 56 45 52 28 70 42 2d 3e 75 2e 7a 54  | NEVER(pB->u.zT
20070 6f 6b 65 6e 3d 3d 30 29 20 29 20 72 65 74 75 72  oken==0) ) retur
20080 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 74 72  n 2;.    if( str
20090 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e  cmp(pA->u.zToken
200a0 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d  ,pB->u.zToken)!=
200b0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
200c0 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  n pA->op==TK_COL
200d0 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20  LATE ? 1 : 2;.  
200e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
200f0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   0;.}../*.** Com
20100 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73  pare two ExprLis
20110 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75  t objects.  Retu
20120 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72 65  rn 0 if they are
20130 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a   identical and .
20140 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ** non-zero if t
20150 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e  hey differ in an
20160 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  y way..**.** Thi
20170 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
20180 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
20190 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45  for equivalent E
201a0 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a  xprLists.  The.*
201b0 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e  * only consequen
201c0 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62  ce will be disab
201d0 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  led optimization
201e0 73 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  s.  But this rou
201f0 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76  tine.** must nev
20200 65 72 20 72 65 74 75 72 6e 20 30 20 69 66 20 74  er return 0 if t
20210 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  he two ExprList 
20220 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69 66 66  objects are diff
20230 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d  erent, or.** a m
20240 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  alfunction will 
20250 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77  result..**.** Tw
20260 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20  o NULL pointers 
20270 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
20280 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20  o be the same.  
20290 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  But a NULL point
202a0 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66  er.** always dif
202b0 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  fers from a non-
202c0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
202d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
202e0 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72  ListCompare(Expr
202f0 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69  List *pA, ExprLi
20300 73 74 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69  st *pB){.  int i
20310 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26  ;.  if( pA==0 &&
20320 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pB==0 ) return 
20330 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c  0;.  if( pA==0 |
20340 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e  | pB==0 ) return
20350 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45   1;.  if( pA->nE
20360 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29  xpr!=pB->nExpr )
20370 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72   return 1;.  for
20380 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70  (i=0; i<pA->nExp
20390 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
203a0 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e  r *pExprA = pA->
203b0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
203c0 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70  Expr *pExprB = p
203d0 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  B->a[i].pExpr;. 
203e0 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e     if( pA->a[i].
203f0 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61  sortOrder!=pB->a
20400 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20  [i].sortOrder ) 
20410 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
20420 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
20430 70 61 72 65 28 70 45 78 70 72 41 2c 20 70 45 78  pare(pExprA, pEx
20440 70 72 42 29 20 29 20 72 65 74 75 72 6e 20 31 3b  prB) ) return 1;
20450 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
20460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
20470 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
20480 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
20490 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
204a0 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74  tree walker.** t
204b0 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63  o count referenc
204c0 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75  es to table colu
204d0 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d  mns in the argum
204e0 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61  ents of an .** a
204f0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
20500 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  n, in order to i
20510 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  mplement the.** 
20520 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54  sqlite3FunctionT
20530 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65  hisSrc() routine
20540 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43  ..*/.struct SrcC
20550 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74  ount {.  SrcList
20560 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65   *pSrc;   /* One
20570 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d   particular FROM
20580 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73   clause in a nes
20590 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ted query */.  i
205a0 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20  nt nThis;       
205b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
205c0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
205d0 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a  ns in pSrcList *
205e0 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20  /.  int nOther; 
205f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20600 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
20610 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72  columns in other
20620 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f   FROM clauses */
20630 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  .};../*.** Count
20640 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
20650 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
20660 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  umns..*/.static 
20670 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74  int exprSrcCount
20680 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
20690 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
206a0 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29    /* The NEVER()
206b0 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74   on the second t
206c0 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73  erm is because s
206d0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
206e0 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a  esThisSrc().  **
206f0 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65   is always calle
20700 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  d before sqlite3
20710 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
20720 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74  gates() and so t
20730 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d  he.  ** TK_COLUM
20740 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  Ns have not yet 
20750 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69  been converted i
20760 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
20770 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69  N.  If.  ** sqli
20780 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
20790 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64  hisSrc() is used
207a0 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20   differently in 
207b0 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a  the future, the.
207c0 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c    ** NEVER() wil
207d0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d  l need to be rem
207e0 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70  oved. */.  if( p
207f0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
20800 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78  UMN || NEVER(pEx
20810 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
20820 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e  OLUMN) ){.    in
20830 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
20840 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57  SrcCount *p = pW
20850 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75  alker->u.pSrcCou
20860 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  nt;.    SrcList 
20870 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
20880 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20890 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
208a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
208b0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d  r->iTable==pSrc-
208c0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
208d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
208e0 20 69 66 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72   if( i<pSrc->nSr
208f0 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54  c ){.      p->nT
20900 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  his++;.    }else
20910 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65  {.      p->nOthe
20920 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  r++;.    }.  }. 
20930 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
20940 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  inue;.}../*.** D
20950 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20  etermine if any 
20960 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  of the arguments
20970 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46 75   to the pExpr Fu
20980 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  nction reference
20990 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52  .** pSrcList.  R
209a0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
209b0 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74  ey do.  Also ret
209c0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
209d0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
209e0 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20  no arguments or 
209f0 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e  has only constan
20a00 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65  t arguments.  Re
20a10 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45  turn false if pE
20a20 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  xpr.** reference
20a30 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f  s columns but no
20a40 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62  t columns of tab
20a50 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72  les found in pSr
20a60 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cList..*/.int sq
20a70 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
20a80 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a 70  sThisSrc(Expr *p
20a90 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70  Expr, SrcList *p
20aa0 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b  SrcList){.  Walk
20ab0 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53  er w;.  struct S
20ac0 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61  rcCount cnt;.  a
20ad0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
20ae0 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
20af0 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  N );.  memset(&w
20b00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
20b10 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
20b20 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e  ck = exprSrcCoun
20b30 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75  t;.  w.u.pSrcCou
20b40 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74  nt = &cnt;.  cnt
20b50 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74  .pSrc = pSrcList
20b60 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20  ;.  cnt.nThis = 
20b70 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20  0;.  cnt.nOther 
20b80 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  = 0;.  sqlite3Wa
20b90 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70  lkExprList(&w, p
20ba0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
20bb0 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68    return cnt.nTh
20bc0 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68  is>0 || cnt.nOth
20bd0 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  er==0;.}../*.** 
20be0 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
20bf0 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
20c00 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
20c10 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
20c20 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
20c30 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
20c40 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
20c50 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
20c60 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
20c70 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
20c80 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  umn(sqlite3 *db,
20c90 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
20ca0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
20cb0 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74  fo->aCol = sqlit
20cc0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
20cd0 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  .       db,.    
20ce0 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a     pInfo->aCol,.
20cf0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
20d00 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20  nfo->aCol[0]),. 
20d10 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
20d20 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69  olumn,.       &i
20d30 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
20d40 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
20d50 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
20d60 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
20d70 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
20d80 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
20d90 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
20da0 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
20db0 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
20dc0 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
20dd0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
20de0 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
20df0 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
20e00 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
20e10 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
20e20 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
20e30 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
20e40 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
20e50 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
20e60 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
20e70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
20e80 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
20e90 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69  nFunc,.       &i
20ea0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
20eb0 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
20ec0 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72  his is the xExpr
20ed0 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74  Callback for a t
20ee0 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20  ree walker.  It 
20ef0 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d  is used to.** im
20f00 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45  plement sqlite3E
20f10 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
20f20 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
20f30 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
20f40 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
20f50 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
20f60 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
20f70 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
20f80 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a  gregate(Walker *
20f90 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
20fa0 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
20fb0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
20fc0 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
20fd0 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
20fe0 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
20ff0 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
21000 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
21010 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
21020 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
21030 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20  NC->pAggInfo;.. 
21040 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
21050 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
21060 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
21070 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
21080 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
21090 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
210a0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
210b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
210c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
210d0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  LUMN );.      /*
210e0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
210f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
21100 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
21110 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
21120 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
21130 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
21140 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
21150 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c  if( ALWAYS(pSrcL
21160 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
21170 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
21180 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
21190 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
211a0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
211b0 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
211c0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
211d0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
211e0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
211f0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  l;.          ass
21200 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
21210 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
21220 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
21230 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
21240 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
21250 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
21260 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
21270 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
21280 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
21290 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
212a0 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20  pExpr refers to 
212b0 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  a table.        
212c0 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69      ** that is i
212d0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
212e0 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
212f0 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20  te query.  .    
21300 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
21310 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61         ** Make a
21320 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
21330 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e  column in pAggIn
21340 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68  fo->aCol[] if th
21350 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
21360 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74  ** is not an ent
21370 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ry there already
21380 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
21390 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
213a0 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
213b0 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d  pCol = pAggInfo-
213c0 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  >aCol;.         
213d0 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41     for(k=0; k<pA
213e0 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
213f0 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   k++, pCol++){. 
21400 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
21410 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70   pCol->iTable==p
21420 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
21430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21440 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d    pCol->iColumn=
21450 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
21460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21470 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
21480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
214a0 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67      if( (k>=pAgg
214b0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20  Info->nColumn). 
214c0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
214d0 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  k = addAggInfoCo
214e0 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  lumn(pParse->db,
214f0 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a   pAggInfo))>=0 .
21500 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
21520 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
21530 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  Col[k];.        
21540 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
21550 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
21560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
21570 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ol->iTable = pEx
21580 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
21590 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
215a0 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
215b0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
215c0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d          pCol->iM
215d0 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
215e0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
215f0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
21600 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
21610 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
21620 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
21640 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  ( pAggInfo->pGro
21650 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
21660 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e          int j, n
21670 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21680 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20    ExprList *pGB 
21690 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  = pAggInfo->pGro
216a0 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20  upBy;.          
216b0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
216c0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
216d0 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20  m = pGB->a;.    
216e0 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
216f0 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pGB->nExpr;.    
21700 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
21710 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70  j=0; j<n; j++, p
21720 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
21730 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
21740 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pE = pTerm->pEx
21750 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
21760 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
21770 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
21780 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  E->iTable==pExpr
21790 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217b0 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70    pE->iColumn==p
217c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
217d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
217e0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
217f0 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  erColumn = j;.  
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
21820 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
21860 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
21870 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
21880 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
21890 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
218a0 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69  pAggInfo->nSorti
218b0 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20  ngColumn++;.    
218c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
218d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
218e0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
218f0 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66  s now an entry f
21900 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67  or pExpr in pAgg
21910 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69  Info->aCol[] (ei
21920 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
21930 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77   ** because it w
21940 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20  as there before 
21950 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  or because we ju
21960 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a  st created it)..
21970 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43              ** C
21980 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72  onvert the pExpr
21990 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f   to be a TK_AGG_
219a0 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67  COLUMN referring
219b0 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   to that.       
219c0 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f       ** pAggInfo
219d0 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a  ->aCol[] entry..
219e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
219f0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53             ExprS
21a00 65 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45  etIrreducible(pE
21a10 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
21a20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
21a30 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
21a40 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
21a50 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c  >op = TK_AGG_COL
21a60 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UMN;.           
21a70 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
21a80 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20  i16)k;.         
21a90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
21aa0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
21ab0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
21ac0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
21ad0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
21ae0 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
21af0 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
21b00 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
21b10 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
21b20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
21b30 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  CTION: {.      i
21b40 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
21b50 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29   & NC_InAggFunc)
21b60 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57  ==0.       && pW
21b70 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
21b80 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20  th==pExpr->op2. 
21b90 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21ba0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
21bb0 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
21bc0 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
21bd0 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
21be0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
21bf0 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
21c00 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
21c10 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
21c20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
21c30 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
21c40 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
21c50 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
21c60 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
21c70 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
21c80 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
21c90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
21ca0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
21cb0 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70  (pItem->pExpr, p
21cc0 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Expr)==0 ){.    
21cd0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21ce0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
21d00 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46   i>=pAggInfo->nF
21d10 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unc ){.         
21d20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69   /* pExpr is ori
21d30 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e  ginal.  Make a n
21d40 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67  ew entry in pAgg
21d50 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20  Info->aFunc[].  
21d60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21d70 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
21d80 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  C(pParse->db);. 
21d90 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64           i = add
21da0 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72  AggInfoFunc(pPar
21db0 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
21dc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
21dd0 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   i>=0 ){.       
21de0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
21df0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
21e00 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
21e10 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t) );.          
21e20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49    pItem = &pAggI
21e30 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20  nfo->aFunc[i];. 
21e40 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
21e50 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
21e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
21e70 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  em->iMem = ++pPa
21e80 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
21e90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
21ea0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
21eb0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
21ec0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ue) );.         
21ed0 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20     pItem->pFunc 
21ee0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
21ef0 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
21f00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21f10 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54       pExpr->u.zT
21f20 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53 74 72  oken, sqlite3Str
21f30 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a  len30(pExpr->u.z
21f40 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20 20  Token),.        
21f50 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
21f60 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70  ->x.pList ? pExp
21f70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
21f80 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a  r : 0, enc, 0);.
21f90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21fa0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
21fb0 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  P_Distinct ){.  
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
21fd0 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70  m->iDistinct = p
21fe0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
21ff0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
22000 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22010 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
22020 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
22030 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
22040 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22050 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72     /* Make pExpr
22060 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70   point to the ap
22070 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e  propriate pAggIn
22080 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72  fo->aFunc[] entr
22090 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  y.        */.   
220a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
220b0 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
220c0 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
220d0 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
220e0 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   );.        Expr
220f0 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28 70  SetIrreducible(p
22100 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Expr);.        p
22110 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
22120 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  6)i;.        pEx
22130 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
22140 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
22150 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
22160 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
22170 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
22180 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
22190 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
221a0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
221b0 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
221c0 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
221d0 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c  atesInSelect(Wal
221e0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
221f0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
22200 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
22210 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55  ER(pWalker);.  U
22220 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
22230 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75  pSelect);.  retu
22240 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
22250 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
22260 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  e the pExpr expr
22270 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
22280 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
22290 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
222a0 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
222b0 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
222c0 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a  d to AggInfo obj
222d0 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41  ect that pNC->pA
222e0 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73  ggInfo.** points
222f0 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c   to.  Additional
22300 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64   entries are mad
22310 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  e on the AggInfo
22320 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65   object as.** ne
22330 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
22340 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
22350 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
22360 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
22370 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
22380 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
22390 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
223a0 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69  rNames()..*/.voi
223b0 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
223c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e  lyzeAggregates(N
223d0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
223e0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
223f0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
22400 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
22410 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
22420 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
22430 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77  zeAggregate;.  w
22440 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
22450 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
22460 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20  atesInSelect;.  
22470 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
22480 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
22490 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
224a0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
224b0 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
224c0 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
224d0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
224e0 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
224f0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
22500 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
22510 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
22520 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
22530 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
22540 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
22550 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
22560 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
22570 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
22580 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
22590 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
225a0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
225b0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
225c0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
225d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
225e0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
225f0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
22600 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
22610 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
22620 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
22630 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
22640 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
22650 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
22660 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
22670 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65  llocate a single
22680 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f   new register fo
22690 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f  r use to hold so
226a0 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  me intermediate 
226b0 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73  result..*/.int s
226c0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
226d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
226e0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
226f0 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20  TempReg==0 ){.  
22700 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73    return ++pPars
22710 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72  e->nMem;.  }.  r
22720 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54  eturn pParse->aT
22730 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d  empReg[--pParse-
22740 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f  >nTempReg];.}../
22750 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
22760 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69  a register, maki
22770 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ng available for
22780 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20   reuse for some 
22790 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65  other.** purpose
227a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
227b0 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74  ister is current
227c0 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79  ly being used by
227d0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
227e0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64  e, then.** the d
227f0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65  allocation is de
22800 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
22810 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69   column cache li
22820 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20  ne that uses.** 
22830 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63  the register bec
22840 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76  omes stale..*/.v
22850 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
22860 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  seTempReg(Parse 
22870 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
22880 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26  g){.  if( iReg &
22890 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  & pParse->nTempR
228a0 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
228b0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
228c0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
228d0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
228e0 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d  e *p;.    for(i=
228f0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
22900 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
22910 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
22920 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , p++){.      if
22930 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
22940 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65  ){.        p->te
22950 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20  mpReg = 1;.     
22960 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
22970 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
22980 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
22990 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
229a0 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  ] = iReg;.  }.}.
229b0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
229c0 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20  or deallocate a 
229d0 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f  block of nReg co
229e0 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
229f0 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ers.*/.int sqlit
22a00 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50  e3GetTempRange(P
22a10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
22a20 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
22a30 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73  , n;.  i = pPars
22a40 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->iRangeReg;.  
22a50 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  n = pParse->nRan
22a60 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65  geReg;.  if( nRe
22a70 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  g<=n ){.    asse
22a80 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d  rt( !usedAsColum
22a90 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
22aa0 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20  , i+n-1) );.    
22ab0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
22ac0 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  g += nReg;.    p
22ad0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
22ae0 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73   -= nReg;.  }els
22af0 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73  e{.    i = pPars
22b00 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
22b10 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
22b20 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Reg;.  }.  retur
22b30 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  n i;.}.void sqli
22b40 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
22b50 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
22b60 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
22b70 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65   nReg){.  sqlite
22b80 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
22b90 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
22ba0 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67  Reg);.  if( nReg
22bb0 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  >pParse->nRangeR
22bc0 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  eg ){.    pParse
22bd0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52  ->nRangeReg = nR
22be0 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
22bf0 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67  iRangeReg = iReg
22c00 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
22c10 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72  ark all temporar
22c20 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62  y registers as b
22c30 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65  eing unavailable
22c40 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76   for reuse..*/.v
22c50 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72  oid sqlite3Clear
22c60 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72  TempRegCache(Par
22c70 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
22c80 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20  Parse->nTempReg 
22c90 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
22ca0 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a  RangeReg = 0;.}.