/ Hex Artifact Content
Login

Artifact 33ae44812d25799000dbcfd54bb2142b30cdd049:


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 69 66 28 20 6f 70      }.    if( op
0e10: 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20  ==TK_COLLATE || 
0e20: 28 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  (op==TK_REGISTER
0e30: 20 26 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43   && p->op2==TK_C
0e40: 4f 4c 4c 41 54 45 29 20 29 7b 0a 20 20 20 20 20  OLLATE) ){.     
0e50: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
0e60: 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  GetCollSeq(pPars
0e70: 65 2c 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70  e, ENC(db), 0, p
0e80: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
0e90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
0ea0: 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62 21      if( p->pTab!
0eb0: 3d 30 0a 20 20 20 20 20 26 26 20 28 6f 70 3d 3d  =0.     && (op==
0ec0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c  TK_AGG_COLUMN ||
0ed0: 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20   op==TK_COLUMN. 
0ee0: 20 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d           || op==
0ef0: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
0f00: 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20  p==TK_TRIGGER). 
0f10: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f     ){.      /* o
0f20: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
0f30: 26 20 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70  & p->pTab!=0 hap
0f40: 70 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20  pens when pExpr 
0f50: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
0f60: 20 20 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c       ** a TK_COL
0f70: 55 4d 4e 20 62 75 74 20 77 61 73 20 70 72 65 76  UMN but was prev
0f80: 69 6f 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64  iously evaluated
0f90: 20 61 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61   and cached in a
0fa0: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20   register */.   
0fb0: 20 20 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43     int j = p->iC
0fc0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28  olumn;.      if(
0fd0: 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   j>=0 ){.       
0fe0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
0ff0: 6c 6c 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43  ll = p->pTab->aC
1000: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
1010: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1020: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
1030: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
1040: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ll, 0);.      }.
1050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1060: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c   }.    if( p->fl
1070: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
1080: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 41 4c   ){.      if( AL
1090: 57 41 59 53 28 70 2d 3e 70 4c 65 66 74 29 20 26  WAYS(p->pLeft) &
10a0: 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  & (p->pLeft->fla
10b0: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
10c0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
10d0: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
10e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10f0: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
1100: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1110: 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  se{.      break;
1120: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1130: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
1140: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f  lSeq(pParse, pCo
1150: 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c  ll) ){ .    pCol
1160: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
1170: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
1180: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20  .** pExpr is an 
1190: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d  operand of a com
11a0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
11b0: 2e 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a  .  aff2 is the.*
11c0: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
11d0: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65  of the other ope
11e0: 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
11f0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
1200: 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  ** type affinity
1210: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1220: 75 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d  used for the com
1230: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
1240: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
1250: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1260: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
1270: 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72  ar aff2){.  char
1280: 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45   aff1 = sqlite3E
1290: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
12a0: 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26  r);.  if( aff1 &
12b0: 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a  & aff2 ){.    /*
12c0: 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74   Both sides of t
12d0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72  he comparison ar
12e0: 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e  e columns. If on
12f0: 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20  e has numeric.  
1300: 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75    ** affinity, u
1310: 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69  se that. Otherwi
1320: 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69  se use no affini
1330: 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ty..    */.    i
1340: 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  f( sqlite3IsNume
1350: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31  ricAffinity(aff1
1360: 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75  ) || sqlite3IsNu
1370: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1380: 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  f2) ){.      ret
1390: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
13a0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73  UMERIC;.    }els
13b0: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
13c0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
13d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
13e0: 66 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66  f( !aff1 && !aff
13f0: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74  2 ){.    /* Neit
1400: 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20  her side of the 
1410: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
1420: 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65  column.  Compare
1430: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
1440: 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  lts directly..  
1450: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
1460: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1470: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1480: 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63   One side is a c
1490: 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72  olumn, the other
14a0: 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65   is not. Use the
14b0: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
14c0: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
14d0: 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66  ( aff1==0 || aff
14e0: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  2==0 );.    retu
14f0: 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29  rn (aff1 + aff2)
1500: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ;.  }.}../*.** p
1510: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
1520: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
1530: 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
1540: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
1550: 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69  ould.** be appli
1560: 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61  ed to both opera
1570: 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  nds prior to doi
1580: 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ng the compariso
1590: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
15a0: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  r comparisonAffi
15b0: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
15c0: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
15d0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
15e0: 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78  op==TK_EQ || pEx
15f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  pr->op==TK_IN ||
1600: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1610: 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  T ||.          p
1620: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
1630: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1640: 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GE || pExpr->op
1650: 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20  ==TK_LE ||.     
1660: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
1670: 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_NE || pExpr->
1680: 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78  op==TK_IS || pEx
1690: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
16a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
16b0: 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  xpr->pLeft );.  
16c0: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70  aff = sqlite3Exp
16d0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
16e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
16f0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
1700: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1710: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1720: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
1730: 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  aff);.  }else if
1740: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1750: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1760: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66  elect) ){.    af
1770: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1780: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1790: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
17a0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
17b0: 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69   aff);.  }else i
17c0: 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61  f( !aff ){.    a
17d0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
17e0: 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NONE;.  }.  retu
17f0: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
1800: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1810: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
1820: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
1830: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
1840: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
1850: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
1860: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
1870: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
1880: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
1890: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
18a0: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
18b0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
18c0: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
18d0: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
18e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
18f0: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
1900: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
1910: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
1920: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
1930: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
1940: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
1950: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
1960: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1970: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
1980: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1990: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
19a0: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
19b0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
19c0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
19d0: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
19e0: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
19f0: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
1a00: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
1a10: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a20: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
1a30: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
1a40: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
1a50: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
1a60: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
1a70: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
1a80: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
1a90: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
1aa0: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
1ab0: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
1ac0: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
1ad0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1ae0: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
1af0: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
1b00: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
1b10: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
1b20: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1b30: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
1b40: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
1b50: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
1b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b70: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1b80: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1b90: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
1ba0: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
1bb0: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1bc0: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
1bd0: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
1be0: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
1bf0: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
1c00: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
1c10: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1c20: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
1c30: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
1c40: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
1c50: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
1c60: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
1c70: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
1c80: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
1c90: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
1ca0: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
1cb0: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
1cc0: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
1cd0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
1ce0: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
1cf0: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
1d00: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
1d10: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
1d20: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1d30: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1d40: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
1d50: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
1d60: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
1d70: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
1d80: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
1d90: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1da0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
1db0: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
1dc0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
1dd0: 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ate ){.    pColl
1de0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1df0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
1e00: 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  eft);.  }else if
1e10: 28 20 70 52 69 67 68 74 20 26 26 20 28 70 52 69  ( pRight && (pRi
1e20: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
1e30: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
1e40: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1e50: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1e60: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
1e70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
1e80: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1e90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1ea0: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
1eb0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
1ec0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1ed0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1ee0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
1ef0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
1f00: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
1f10: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1f20: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1f30: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
1f40: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
1f50: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1f60: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
1f70: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
1f80: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
1f90: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1fa0: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1fb0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1fc0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
1fd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1fe0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
1ff0: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
2000: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
2010: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
2020: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
2030: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
2040: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
2050: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
2060: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
2070: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
2080: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
2090: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
20a0: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
20b0: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
20c0: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
20d0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
20e0: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
20f0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
2100: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2110: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
2120: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
2130: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
2140: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
2150: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
2160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2170: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
2180: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
2190: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
21c0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
21d0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
21e0: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
21f0: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
2200: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66  urn addr;.}..#if
2210: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
2220: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
2230: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
2240: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
2250: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
2260: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
2270: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
2280: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
2290: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
22a0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
22b0: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
22c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
22d0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
22e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
22f0: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
2300: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2310: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
2320: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
2330: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
2340: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
2350: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
2360: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
2370: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2380: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
2390: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
23a0: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
23b0: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
23c0: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
23d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23e0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
23f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
2400: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
2410: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
2420: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
2430: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
2440: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
2450: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
2460: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
2470: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
2480: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
2490: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
24a0: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
24b0: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
24c0: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
24d0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
24e0: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
24f0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
2500: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
2510: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
2520: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
2530: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
2540: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
2550: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
2560: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
2570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2580: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
2590: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
25a0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
25b0: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
25c0: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
25d0: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
25e0: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
25f0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2600: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
2610: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
2620: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
2630: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
2640: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
2650: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
2660: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
2670: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
2680: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
2690: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
26a0: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
26b0: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
26c0: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
26d0: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
26e0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
26f0: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
2700: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
2710: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
2720: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
2730: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2740: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
2750: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2760: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73  tOfExpr(p->pOffs
2770: 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  et, pnHeight);. 
2780: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
2790: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
27a0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
27b0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
27c0: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
27d0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
27e0: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
27f0: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
2800: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
2810: 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72  Select(p->pPrior
2820: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , pnHeight);.  }
2830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2840: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
2850: 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73  ariable in the s
2860: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2870: 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65  as an .** argume
2880: 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f  nt. An expressio
2890: 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72  n with no childr
28a0: 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f  en, Expr.pList o
28b0: 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65  r .** Expr.pSele
28c0: 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20  ct member has a 
28d0: 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79  height of 1. Any
28e0: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
28f0: 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68  n.** has a heigh
2900: 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d  t equal to the m
2910: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
2920: 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72   any other .** r
2930: 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70  eferenced Expr p
2940: 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  lus one..*/.stat
2950: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
2960: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
2970: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
2980: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
2990: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
29a0: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
29b0: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
29c0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
29d0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
29e0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
29f0: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
2a00: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
2a10: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
2a20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68  ;.  }else{.    h
2a30: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
2a40: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65  p->x.pList, &nHe
2a50: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ight);.  }.  p->
2a60: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
2a70: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
2a80: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2a90: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
2aa0: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
2ab0: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
2ac0: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
2ad0: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2ae0: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
2af0: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
2b00: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
2b10: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
2b20: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
2b30: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
2b40: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
2b50: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78  , Expr *p){.  ex
2b60: 70 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a  prSetHeight(p);.
2b70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
2b80: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
2b90: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a   p->nHeight);.}.
2ba0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2bb0: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2bc0: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
2bd0: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
2be0: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
2bf0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
2c00: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
2c10: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
2c20: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2c30: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
2c40: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
2c50: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
2c60: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
2c70: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
2c80: 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ht;.}.#else.  #d
2c90: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
2ca0: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
2cb0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
2cc0: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
2cd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ce0: 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f  is the core allo
2cf0: 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e  cator for Expr n
2d00: 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  odes..**.** Cons
2d10: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
2d20: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
2d30: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
2d40: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
2d50: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
2d60: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f   and for the pTo
2d70: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ken argument is 
2d80: 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  a single allocat
2d90: 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20  ion.** obtained 
2da0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
2db0: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
2dc0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
2dd0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2de0: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2df0: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
2e00: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
2e10: 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  **.** If dequote
2e20: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2e30: 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20  he token (if it 
2e40: 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f  exists) is dequo
2e50: 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ted..** If dequo
2e60: 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20  te is false, no 
2e70: 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72  dequoting is per
2e80: 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64  formance.  The d
2e90: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
2ea0: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
2eb0: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
2ec0: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
2ed0: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
2ee0: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
2ef0: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
2f00: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
2f10: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
2f20: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
2f30: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
2f40: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
2f50: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
2f60: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
2f70: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
2f80: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
2f90: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
2fa0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
2fb0: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
2fc0: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
2fd0: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
2fe0: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
2ff0: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
3000: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
3010: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
3020: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
3030: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
3040: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
3050: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
3060: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
3070: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
3080: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
3090: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
30a0: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
30b0: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
30c0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
30d0: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
30e0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
30f0: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
3100: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3110: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
3120: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
3130: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3140: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
3150: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
3160: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  t Token *pToken,
3170: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
3180: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
3190: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64   NULL */.  int d
31a0: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
31b0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
31c0: 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  quote */.){.  Ex
31d0: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
31e0: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e  nExtra = 0;.  in
31f0: 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20  t iValue = 0;.. 
3200: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
3210: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e     if( op!=TK_IN
3220: 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d  TEGER || pToken-
3230: 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  >z==0.          
3240: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
3250: 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69  32(pToken->z, &i
3260: 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
3270: 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b     nExtra = pTok
3280: 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61  en->n+1;.      a
3290: 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30  ssert( iValue>=0
32a0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
32b0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
32c0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
32d0: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
32e0: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
32f0: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  ){.    pNew->op 
3300: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
3310: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
3320: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
3330: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
3340: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
3350: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
3360: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3370: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3380: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33a0: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
33b0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
33c0: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
33d0: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
33e0: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
33f0: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
3400: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
3410: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
3420: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
3430: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
3440: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
3450: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
3460: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3470: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3480: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3490: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
34a0: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
34b0: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
34c0: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
34d0: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
34e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
34f0: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3500: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
3510: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
3520: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3530: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
3540: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3550: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
3560: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3570: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3580: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3590: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
35a0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
35b0: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
35c0: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
35d0: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
35e0: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
35f0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3600: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
3610: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
3620: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3640: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
3650: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
3660: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3670: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3690: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
36a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
36b0: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
36c0: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
36d0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
36e0: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
36f0: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3700: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
3710: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3720: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
3730: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
3740: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
3750: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
3760: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3770: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3780: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3790: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
37a0: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
37b0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
37c0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
37d0: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
37e0: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
37f0: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3800: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
3810: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
3820: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
3830: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
3840: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
3850: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
3860: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
3870: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
3880: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
3890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
38a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
38b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
38c0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
38d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
38e0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
38f0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
3900: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
3910: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
3920: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
3930: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
3940: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20  s |= EP_Collate 
3950: 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b  & pRight->flags;
3960: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
3970: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52  Left ){.      pR
3980: 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65  oot->pLeft = pLe
3990: 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d  ft;.      pRoot-
39a0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c  >flags |= EP_Col
39b0: 6c 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c  late & pLeft->fl
39c0: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  ags;.    }.    e
39d0: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52 6f  xprSetHeight(pRo
39e0: 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ot);.  }.}../*.*
39f0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 45 78 70  * Allocate a Exp
3a00: 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69  r node which joi
3a10: 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77  ns as many as tw
3a20: 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a  o subtrees..**.*
3a30: 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66  * One or both of
3a40: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 63 61   the subtrees ca
3a50: 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75  n be NULL.  Retu
3a60: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
3a70: 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20  the new.** Expr 
3a80: 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e  node.  Or, if an
3a90: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
3aa0: 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64  s, set pParse->d
3ab0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c  b->mallocFailed,
3ac0: 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75 62  .** free the sub
3ad0: 74 72 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e  trees and return
3ae0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a   NULL..*/.Expr *
3af0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20  sqlite3PExpr(.  
3b00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3b10: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
3b20: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
3b30: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
3b40: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
3b50: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
3b60: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
3b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
3b80: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45  t operand */.  E
3b90: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20  xpr *pRight,    
3ba0: 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
3bb0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e  operand */.  con
3bc0: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  st Token *pToken
3bd0: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
3be0: 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45   token */.){.  E
3bf0: 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70  xpr *p;.  if( op
3c00: 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 4c 65 66  ==TK_AND && pLef
3c10: 74 20 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20  t && pRight ){. 
3c20: 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e     /* Take advan
3c30: 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69  tage of short-ci
3c40: 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69  rcuit false opti
3c50: 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44  mization for AND
3c60: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   */.    p = sqli
3c70: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
3c80: 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52  e->db, pLeft, pR
3c90: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
3ca0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45      p = sqlite3E
3cb0: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
3cc0: 3e 64 62 2c 20 6f 70 2c 20 70 54 6f 6b 65 6e 2c  >db, op, pToken,
3cd0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
3ce0: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
3cf0: 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  es(pParse->db, p
3d00: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
3d10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20  ;.  }.  if( p ) 
3d20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
3d30: 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61  rCheckHeight(pPa
3d40: 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29  rse, p->nHeight)
3d50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3d70: 6e 20 31 20 69 66 20 61 6e 20 65 78 70 72 65 73  n 1 if an expres
3d80: 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 46 41 4c  sion must be FAL
3d90: 53 45 20 69 6e 20 61 6c 6c 20 63 61 73 65 73 20  SE in all cases 
3da0: 61 6e 64 20 30 20 69 66 20 74 68 65 0a 2a 2a 20  and 0 if the.** 
3db0: 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
3dc0: 20 62 65 20 74 72 75 65 2e 20 20 54 68 69 73 20   be true.  This 
3dd0: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
3de0: 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74 6f  on.  If is OK to
3df0: 0a 2a 2a 20 72 65 74 75 72 6e 20 30 20 68 65 72  .** return 0 her
3e00: 65 20 65 76 65 6e 20 69 66 20 74 68 65 20 65 78  e even if the ex
3e10: 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79 20  pression really 
3e20: 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20  is always false 
3e30: 28 61 20 0a 2a 2a 20 66 61 6c 73 65 20 6e 65 67  (a .** false neg
3e40: 61 74 69 76 65 29 2e 20 20 42 75 74 20 69 74 20  ative).  But it 
3e50: 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75  is a bug to retu
3e60: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
3e70: 65 73 73 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20  ession.** might 
3e80: 62 65 20 74 72 75 65 20 69 6e 20 73 6f 6d 65 20  be true in some 
3e90: 72 61 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63  rare circumstanc
3ea0: 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69  es (a false posi
3eb0: 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74  tive.).**.** Not
3ec0: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78  e that if the ex
3ed0: 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74  pression is part
3ee0: 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   of conditional 
3ef0: 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f  for a.** LEFT JO
3f00: 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e  IN, then we cann
3f10: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20  ot determine at 
3f20: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
3f30: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69  ther or not.** i
3f40: 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c  s it true or fal
3f50: 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65  se, so always re
3f60: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
3f70: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
3f80: 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b 0a  False(Expr *p){.
3f90: 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69    int v = 0;.  i
3fa0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
3fb0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
3fc0: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
3fd0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
3fe0: 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76  rIsInteger(p, &v
3ff0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
4000: 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a  return v==0;.}..
4010: 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65  /*.** Join two e
4020: 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67  xpressions using
4030: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
4040: 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78 70  .  If either exp
4050: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55  ression is.** NU
4060: 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  LL, then just re
4070: 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65  turn the other e
4080: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
4090: 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   If one side or 
40a0: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
40b0: 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74 6f   AND is known to
40c0: 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   be false, then 
40d0: 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72 65  instead.** of re
40e0: 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20 65  turning an AND e
40f0: 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74 20  xpression, just 
4100: 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61 6e  return a constan
4110: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  t expression wit
4120: 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66 20  h.** a value of 
4130: 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a  false..*/.Expr *
4140: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73  sqlite3ExprAnd(s
4150: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
4160: 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70   *pLeft, Expr *p
4170: 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c  Right){.  if( pL
4180: 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  eft==0 ){.    re
4190: 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d  turn pRight;.  }
41a0: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d  else if( pRight=
41b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
41c0: 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20   pLeft;.  }else 
41d0: 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
41e0: 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65 78  lse(pLeft) || ex
41f0: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52  prAlwaysFalse(pR
4200: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
4210: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
4220: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
4230: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4240: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
4250: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4260: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
4270: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
4280: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
4290: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
42a0: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
42b0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
42c0: 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29  b, TK_AND, 0, 0)
42d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
42e0: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
42f0: 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c  db, pNew, pLeft,
4300: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
4310: 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d  turn pNew;.  }.}
4320: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
4330: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
4340: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75  on node for a fu
4350: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74  nction with mult
4360: 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iple.** argument
4370: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
4380: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
4390: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
43a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
43b0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
43c0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
43d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
43e0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
43f0: 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20  rt( pToken );.  
4400: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
4410: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46  prAlloc(db, TK_F
4420: 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c  UNCTION, pToken,
4430: 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   1);.  if( pNew=
4440: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4450: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
4460: 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41  db, pList); /* A
4470: 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  void memory leak
4480: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
4490: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
44a0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
44b0: 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  x.pList = pList;
44c0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
44d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
44e0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
44f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
4500: 53 65 74 48 65 69 67 68 74 28 70 50 61 72 73 65  SetHeight(pParse
4510: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
4520: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
4530: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
4540: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
4550: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
4560: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
4570: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
4580: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
4590: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
45a0: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
45b0: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
45c0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
45d0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
45e0: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
45f0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
4600: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
4610: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
4620: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
4630: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
4640: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
4650: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
4660: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
4670: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
4680: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
4690: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
46a0: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
46b0: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
46c0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
46d0: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
46e0: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
46f0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
4700: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
4710: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
4720: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4730: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
4740: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
4750: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
4760: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
4770: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
4780: 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c  equenial variabl
4790: 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61  e number is.** a
47a0: 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ssigned..*/.void
47b0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69   sqlite3ExprAssi
47c0: 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73  gnVarNumber(Pars
47d0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
47e0: 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74  *pExpr){.  sqlit
47f0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4800: 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  >db;.  const cha
4810: 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78  r *z;..  if( pEx
4820: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
4830: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
4840: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
4850: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
4860: 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  |EP_Reduced|EP_T
4870: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a  okenOnly) );.  z
4880: 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
4890: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21  en;.  assert( z!
48a0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
48b0: 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28  z[0]!=0 );.  if(
48c0: 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   z[1]==0 ){.    
48d0: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
48e0: 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73  he form "?".  As
48f0: 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61  sign the next va
4900: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
4910: 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30  .    assert( z[0
4920: 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45  ]=='?' );.    pE
4930: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
4940: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
4950: 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  >nVar);.  }else{
4960: 0a 20 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30  .    ynVar x = 0
4970: 3b 0a 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71  ;.    u32 n = sq
4980: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
4990: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
49a0: 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  '?' ){.      /* 
49b0: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
49c0: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
49d0: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
49e0: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
49f0: 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73      ** use it as
4a00: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75   the variable nu
4a10: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36  mber */.      i6
4a20: 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  4 i;.      int b
4a30: 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41  Ok = 0==sqlite3A
4a40: 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c  toi64(&z[1], &i,
4a50: 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46   n-1, SQLITE_UTF
4a60: 38 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  8);.      pExpr-
4a70: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28  >iColumn = x = (
4a80: 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74  ynVar)i;.      t
4a90: 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b  estcase( i==0 );
4aa0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4ab0: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74   i==1 );.      t
4ac0: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
4ad0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
4ae0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
4af0: 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20  BER]-1 );.      
4b00: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
4b10: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4b20: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4b30: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69  MBER] );.      i
4b40: 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31  f( bOk==0 || i<1
4b50: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
4b60: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4b70: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
4b80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4b90: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4ba0: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
4bb0: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
4bc0: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
4be0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
4bf0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
4c00: 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78  BER]);.        x
4c10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4c20: 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73 65      if( i>pParse
4c30: 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ->nVar ){.      
4c40: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
4c50: 20 28 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d   (int)i;.      }
4c60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4c70: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c    /* Wildcards l
4c80: 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61  ike ":aaa", "$aa
4c90: 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52  a" or "@aaa".  R
4ca0: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
4cb0: 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  riable.      ** 
4cc0: 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 70 72  number as the pr
4cd0: 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f  ior appearance o
4ce0: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c  f the same name,
4cf0: 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a   or if the name.
4d00: 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76        ** has nev
4d10: 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f  er appeared befo
4d20: 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61  re, reuse the sa
4d30: 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  me variable numb
4d40: 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  er.      */.    
4d50: 20 20 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20    ynVar i;.     
4d60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
4d70: 73 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b  se->nzVar; i++){
4d80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
4d90: 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26  rse->azVar[i] &&
4da0: 20 73 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e   strcmp(pParse->
4db0: 61 7a 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29  azVar[i],z)==0 )
4dc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
4dd0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d  r->iColumn = x =
4de0: 20 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20   (ynVar)i+1;.   
4df0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4e00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4e10: 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29        if( x==0 )
4e20: 20 78 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   x = pExpr->iCol
4e30: 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b  umn = (ynVar)(++
4e40: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
4e50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30     }.    if( x>0
4e60: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e   ){.      if( x>
4e70: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b  pParse->nzVar ){
4e80: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a  .        char **
4e90: 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73  a;.        a = s
4ea0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
4eb0: 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  db, pParse->azVa
4ec0: 72 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d  r, x*sizeof(a[0]
4ed0: 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
4ee0: 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  a==0 ) return;  
4ef0: 2f 2a 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65  /* Error reporte
4f00: 64 20 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61  d through db->ma
4f10: 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20  llocFailed */.  
4f20: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a        pParse->az
4f30: 56 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20  Var = a;.       
4f40: 20 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73   memset(&a[pPars
4f50: 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78  e->nzVar], 0, (x
4f60: 2d 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a  -pParse->nzVar)*
4f70: 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20  sizeof(a[0]));. 
4f80: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
4f90: 7a 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20  zVar = x;.      
4fa0: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d  }.      if( z[0]
4fb0: 21 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d  !='?' || pParse-
4fc0: 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29  >azVar[x-1]==0 )
4fd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4fe0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72  3DbFree(db, pPar
4ff0: 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b  se->azVar[x-1]);
5000: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
5010: 3e 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71  >azVar[x-1] = sq
5020: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
5030: 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  b, z, n);.      
5040: 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69  }.    }.  } .  i
5050: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72  f( !pParse->nErr
5060: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   && pParse->nVar
5070: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
5080: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
5090: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
50a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
50b0: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
50c0: 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  ny SQL variables
50d0: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
50e0: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
50f0: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
5100: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n tree..*/.void 
5110: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5120: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
5130: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
5140: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5150: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a  /* Sanity check:
5160: 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
5170: 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e   IntValue is non
5180: 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20  -negative if it 
5190: 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65  exists */.  asse
51a0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
51b0: 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61  erty(p, EP_IntVa
51c0: 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61  lue) || p->u.iVa
51d0: 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  lue>=0 );.  if( 
51e0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
51f0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
5200: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  nly) ){.    sqli
5210: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
5220: 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  , p->pLeft);.   
5230: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
5240: 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  te(db, p->pRight
5250: 29 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72  );.    if( !Expr
5260: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5270: 50 5f 52 65 64 75 63 65 64 29 20 26 26 20 28 70  P_Reduced) && (p
5280: 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d  ->flags2 & EP2_M
5290: 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 21 3d 30  allocedToken)!=0
52a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
52b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
52c0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a  .zToken);.    }.
52d0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
52e0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
52f0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
5300: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
5310: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
5320: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
5330: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
5340: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
5350: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  db, p->x.pList);
5360: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5370: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5380: 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20  y(p, EP_Static) 
5390: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
53a0: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  Free(db, p);.  }
53b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
53c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
53d0: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
53e0: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
53f0: 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  n structure .** 
5400: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
5410: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
5420: 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  is is always one
5430: 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   of EXPR_FULLSIZ
5440: 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43  E,.** EXPR_REDUC
5450: 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54  EDSIZE or EXPR_T
5460: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f  OKENONLYSIZE..*/
5470: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
5480: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
5490: 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48  *p){.  if( ExprH
54a0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
54b0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65  _TokenOnly) ) re
54c0: 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  turn EXPR_TOKENO
54d0: 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45  NLYSIZE;.  if( E
54e0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
54f0: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20  , EP_Reduced) ) 
5500: 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55  return EXPR_REDU
5510: 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72  CEDSIZE;.  retur
5520: 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  n EXPR_FULLSIZE;
5530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75  .}../*.** The du
5540: 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72  pedExpr*Size() r
5550: 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74  outines each ret
5560: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
5570: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
5580: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63  .** to store a c
5590: 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73  opy of an expres
55a0: 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69  sion or expressi
55b0: 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64  on tree.  They d
55c0: 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20  iffer in.** how 
55d0: 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65  much of the tree
55e0: 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a   is measured..**
55f0: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5600: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20  rStructSize()   
5610: 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74    Size of only t
5620: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
5630: 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  e .**     dupedE
5640: 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20  xprNodeSize()   
5650: 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72      Size of Expr
5660: 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b   + space for tok
5670: 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  en.**     dupedE
5680: 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20  xprSize()       
5690: 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e      Expr + token
56a0: 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f   + subtree compo
56b0: 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  nents.**.*******
56c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
56f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5700: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
5710: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
5720: 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  ze() function re
5730: 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73  turns two values
5740: 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a   OR-ed together:
5750: 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70    .** (1) the sp
5760: 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
5770: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
5780: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e  xpr structure on
5790: 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74  ly and .** (2) t
57a0: 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20  he EP_xxx flags 
57b0: 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68  that indicate wh
57c0: 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65  at the structure
57d0: 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e   size should be.
57e0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
57f0: 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20  alues is always 
5800: 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
5810: 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45     EXPR_FULLSIZE
5820: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45  .**      EXPR_RE
5830: 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50  DUCEDSIZE   | EP
5840: 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20  _Reduced.**     
5850: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
5860: 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  IZE | EP_TokenOn
5870: 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ly.**.** The siz
5880: 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  e of the structu
5890: 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  re can be found 
58a0: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72  by masking the r
58b0: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f  eturn value.** o
58c0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  f this routine w
58d0: 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20  ith 0xfff.  The 
58e0: 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75  flags can be fou
58f0: 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68  nd by masking th
5900: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
5910: 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65  e with EP_Reduce
5920: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a  d|EP_TokenOnly..
5930: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
5940: 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52  with flags==EXPR
5950: 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73  DUP_REDUCE, this
5960: 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20   routines works 
5970: 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20  on full-size.** 
5980: 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72  (unreduced) Expr
5990: 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79   objects as they
59a0: 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63   or originally c
59b0: 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68  onstructed by th
59c0: 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72  e parser..** Dur
59d0: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ing expression a
59e0: 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69  nalysis, extra i
59f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f  nformation is co
5a00: 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64  mputed and moved
5a10: 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70   into.** later p
5a20: 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72  arts of teh Expr
5a30: 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74   object and that
5a40: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
5a50: 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f  on might get cho
5a60: 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74  pped.** off if t
5a70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
5a80: 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20   reduced.  Note 
5a90: 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65  also that it doe
5aa0: 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a  s not work to.**
5ab0: 20 6d 61 6b 65 20 61 20 45 58 50 52 44 55 50 5f   make a EXPRDUP_
5ac0: 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61  REDUCE copy of a
5ad0: 20 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73   reduced express
5ae0: 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ion.  It is only
5af0: 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64   legal.** to red
5b00: 75 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65  uce a pristine e
5b10: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66  xpression tree f
5b20: 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20  rom the parser. 
5b30: 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
5b40: 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45  ion.** of dupedE
5b50: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
5b60: 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65  contain multiple
5b70: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
5b80: 65 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70  ents that attemp
5b90: 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20  t.** to enforce 
5ba0: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
5bb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
5bc0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
5bd0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
5be0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53  flags){.  int nS
5bf0: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ize;.  assert( f
5c00: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
5c10: 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30  DUCE || flags==0
5c20: 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20   ); /* Only one 
5c30: 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77  flag value allow
5c40: 65 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 28  ed */.  if( 0==(
5c50: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
5c60: 44 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69  DUCE) ){.    nSi
5c70: 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49  ze = EXPR_FULLSI
5c80: 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ZE;.  }else{.   
5c90: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
5ca0: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20  sAnyProperty(p, 
5cb0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
5cc0: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
5cd0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
5ce0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
5cf0: 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20  romJoin) ); .   
5d00: 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61   assert( (p->fla
5d10: 67 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63  gs2 & EP2_Malloc
5d20: 65 64 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20  edToken)==0 );. 
5d30: 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66     assert( (p->f
5d40: 6c 61 67 73 32 20 26 20 45 50 32 5f 49 72 72 65  lags2 & EP2_Irre
5d50: 64 75 63 69 62 6c 65 29 3d 3d 30 20 29 3b 0a 20  ducible)==0 );. 
5d60: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
5d70: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20  || p->pRight || 
5d80: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
5d90: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
5da0: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45  _REDUCEDSIZE | E
5db0: 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d  P_Reduced;.    }
5dc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a  else{.      nSiz
5dd0: 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  e = EXPR_TOKENON
5de0: 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65  LYSIZE | EP_Toke
5df0: 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nOnly;.    }.  }
5e00: 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b  .  return nSize;
5e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
5e20: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5e30: 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74  the space in byt
5e40: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  es required to s
5e50: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a  tore the copy .*
5e60: 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  * of the Expr st
5e70: 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f  ructure and a co
5e80: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75  py of the Expr.u
5e90: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28  .zToken string (
5ea0: 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e  if that.** strin
5eb0: 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a  g is defined.).*
5ec0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
5ed0: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45  edExprNodeSize(E
5ee0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
5ef0: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
5f00: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
5f10: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20  tSize(p, flags) 
5f20: 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21  & 0xfff;.  if( !
5f30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5f40: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
5f50: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
5f60: 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73  {.    nByte += s
5f70: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
5f80: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20  ->u.zToken)+1;. 
5f90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e   }.  return ROUN
5fa0: 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a  D8(nByte);.}../*
5fb0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5fc0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
5fd0: 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74  equired to creat
5fe0: 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  e a duplicate of
5ff0: 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73   the .** express
6000: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
6010: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
6020: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
6030: 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61  ument is a.** ma
6040: 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58  sk containing EX
6050: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
6060: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
6070: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
6080: 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61  es space to crea
6090: 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
60a0: 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20   Expr struct.** 
60b0: 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62  itself and the b
60c0: 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74  uffer referred t
60d0: 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  o by Expr.u.zTok
60e0: 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a  en, if any..**.*
60f0: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
6100: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
6110: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65  set, then the re
6120: 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75  turn value inclu
6130: 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f  des .** space to
6140: 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45   duplicate all E
6150: 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65  xpr nodes in the
6160: 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20   tree formed by 
6170: 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61  Expr.pLeft .** a
6180: 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76  nd Expr.pRight v
6190: 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f  ariables (but no
61a0: 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74  t for any struct
61b0: 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  ures pointed to 
61c0: 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64  or .** descended
61d0: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
61e0: 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78  .pList or Expr.x
61f0: 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c  .pSelect variabl
6200: 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  es)..*/.static i
6210: 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  nt dupedExprSize
6220: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
6230: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
6240: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  e = 0;.  if( p )
6250: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75  {.    nByte = du
6260: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
6270: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  p, flags);.    i
6280: 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50  f( flags&EXPRDUP
6290: 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20  _REDUCE ){.     
62a0: 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45   nByte += dupedE
62b0: 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74  xprSize(p->pLeft
62c0: 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64  , flags) + duped
62d0: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67  ExprSize(p->pRig
62e0: 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ht, flags);.    
62f0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
6300: 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Byte;.}../*.** T
6310: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
6320: 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
6330: 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63  e3ExprDup(), exc
6340: 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75  ept that if pzBu
6350: 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20  ffer .** is not 
6360: 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66  NULL then *pzBuf
6370: 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  fer is assumed t
6380: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
6390: 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  fer large enough
63a0: 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68   .** to store th
63b0: 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  e copy of expres
63c0: 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69  sion p, the copi
63d0: 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65  es of p->u.zToke
63e0: 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61  n.** (if applica
63f0: 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f  ble), and the co
6400: 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70  pies of the p->p
6410: 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67  Left and p->pRig
6420: 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  ht expressions,.
6430: 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72  ** if any. Befor
6440: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
6450: 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f  Buffer is set to
6460: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
6470: 70 61 73 73 65 64 20 74 68 65 0a 2a 2a 20 70 6f  passed the.** po
6480: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66  rtion of the buf
6490: 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  fer copied into 
64a0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
64b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
64c0: 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65   *exprDup(sqlite
64d0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
64e0: 69 6e 74 20 66 6c 61 67 73 2c 20 75 38 20 2a 2a  int flags, u8 **
64f0: 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70  pzBuffer){.  Exp
6500: 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20  r *pNew = 0;    
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6520: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
6530: 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20 70 20  turn */.  if( p 
6540: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
6550: 20 69 73 52 65 64 75 63 65 64 20 3d 20 28 66 6c   isReduced = (fl
6560: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
6570: 43 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a 41 6c  CE);.    u8 *zAl
6580: 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20 73 74 61  loc;.    u32 sta
6590: 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20  ticFlag = 0;..  
65a0: 20 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66    assert( pzBuff
65b0: 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64 75 63  er==0 || isReduc
65c0: 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  ed );..    /* Fi
65d0: 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74  gure out where t
65e0: 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20  o write the new 
65f0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20  Expr structure. 
6600: 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a 42 75 66  */.    if( pzBuf
6610: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c  fer ){.      zAl
6620: 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b  loc = *pzBuffer;
6630: 0a 20 20 20 20 20 20 73 74 61 74 69 63 46 6c 61  .      staticFla
6640: 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20  g = EP_Static;. 
6650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6660: 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  zAlloc = sqlite3
6670: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
6680: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c  dupedExprSize(p,
6690: 20 66 6c 61 67 73 29 29 3b 0a 20 20 20 20 7d 0a   flags));.    }.
66a0: 20 20 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72      pNew = (Expr
66b0: 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 20 20   *)zAlloc;..    
66c0: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
66d0: 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a    /* Set nNewSiz
66e0: 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c  e to the size al
66f0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
6700: 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
6710: 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 79  d to.      ** by
6720: 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65   pNew. This is e
6730: 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53  ither EXPR_FULLS
6740: 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45  IZE, EXPR_REDUCE
6750: 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 20 20 2a  DSIZE or.      *
6760: 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  * EXPR_TOKENONLY
6770: 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20  SIZE. nToken is 
6780: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6790: 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75  r of bytes consu
67a0: 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  med.      ** by 
67b0: 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
67c0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
67d0: 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  ng (if any)..   
67e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73     */.      cons
67f0: 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75  t unsigned nStru
6800: 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78  ctSize = dupedEx
6810: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
6820: 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 63 6f  flags);.      co
6830: 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65  nst int nNewSize
6840: 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26   = nStructSize &
6850: 20 30 78 66 66 66 3b 0a 20 20 20 20 20 20 69 6e   0xfff;.      in
6860: 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t nToken;.      
6870: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
6880: 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61  erty(p, EP_IntVa
6890: 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f  lue) && p->u.zTo
68a0: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  ken ){.        n
68b0: 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53  Token = sqlite3S
68c0: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
68d0: 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  ken) + 1;.      
68e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
68f0: 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Token = 0;.     
6900: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 52   }.      if( isR
6910: 65 64 75 63 65 64 20 29 7b 0a 20 20 20 20 20 20  educed ){.      
6920: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
6930: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
6940: 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20  Reduced)==0 );. 
6950: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41         memcpy(zA
6960: 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a  lloc, p, nNewSiz
6970: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
6980: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 69  .        int nSi
6990: 7a 65 20 3d 20 65 78 70 72 53 74 72 75 63 74 53  ze = exprStructS
69a0: 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ize(p);.        
69b0: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
69c0: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , nSize);.      
69d0: 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63    memset(&zAlloc
69e0: 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52  [nSize], 0, EXPR
69f0: 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29  _FULLSIZE-nSize)
6a00: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6a10: 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52   /* Set the EP_R
6a20: 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e  educed, EP_Token
6a30: 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61  Only, and EP_Sta
6a40: 74 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70  tic flags approp
6a50: 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20  riately. */.    
6a60: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d    pNew->flags &=
6a70: 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50   ~(EP_Reduced|EP
6a80: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74  _TokenOnly|EP_St
6a90: 61 74 69 63 29 3b 0a 20 20 20 20 20 20 70 4e 65  atic);.      pNe
6aa0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72  w->flags |= nStr
6ab0: 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65  uctSize & (EP_Re
6ac0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
6ad0: 6c 79 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ly);.      pNew-
6ae0: 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63  >flags |= static
6af0: 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Flag;..      /* 
6b00: 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54  Copy the p->u.zT
6b10: 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20  oken string, if 
6b20: 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  any. */.      if
6b30: 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( nToken ){.    
6b40: 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e      char *zToken
6b50: 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65   = pNew->u.zToke
6b60: 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c  n = (char*)&zAll
6b70: 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20  oc[nNewSize];.  
6b80: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f        memcpy(zTo
6b90: 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken, p->u.zToken
6ba0: 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  , nToken);.     
6bb0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d   }..      if( 0=
6bc0: 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77  =((p->flags|pNew
6bd0: 2d 3e 66 6c 61 67 73 29 20 26 20 45 50 5f 54 6f  ->flags) & EP_To
6be0: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
6bf0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
6c00: 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65  he pNew->x.pSele
6c10: 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c  ct or pNew->x.pL
6c20: 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20  ist member. */. 
6c30: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
6c40: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6c50: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
6c60: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78           pNew->x
6c70: 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  .pSelect = sqlit
6c80: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
6c90: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 73  p->x.pSelect, is
6ca0: 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20  Reduced);.      
6cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6cc0: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74     pNew->x.pList
6cd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
6ce0: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  stDup(db, p->x.p
6cf0: 4c 69 73 74 2c 20 69 73 52 65 64 75 63 65 64 29  List, isReduced)
6d00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6d10: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69    }..      /* Fi
6d20: 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66  ll in pNew->pLef
6d30: 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67  t and pNew->pRig
6d40: 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ht. */.      if(
6d50: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
6d60: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
6d70: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
6d80: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 41  y) ){.        zA
6d90: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
6da0: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61  rNodeSize(p, fla
6db0: 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  gs);.        if(
6dc0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
6dd0: 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65  (pNew, EP_Reduce
6de0: 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
6df0: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 65 78  pNew->pLeft = ex
6e00: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
6e10: 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ft, EXPRDUP_REDU
6e20: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20  CE, &zAlloc);.  
6e30: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52          pNew->pR
6e40: 69 67 68 74 20 3d 20 65 78 70 72 44 75 70 28 64  ight = exprDup(d
6e50: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
6e60: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
6e70: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  Alloc);.        
6e80: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 7a  }.        if( pz
6e90: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
6ea0: 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20      *pzBuffer = 
6eb0: 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20 20  zAlloc;.        
6ec0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
6ed0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61         pNew->fla
6ee0: 67 73 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  gs2 = 0;.       
6ef0: 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79   if( !ExprHasAny
6f00: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
6f10: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
6f20: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
6f30: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
6f40: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  Dup(db, p->pLeft
6f50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
6f60: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73  pNew->pRight = s
6f70: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
6f80: 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b  , p->pRight, 0);
6f90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6fa0: 20 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   }..    }.  }.  
6fb0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
6fc0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
6fd0: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
6fe0: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
6ff0: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
7000: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
7010: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
7020: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
7030: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
7040: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
7050: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
7060: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
7070: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
7080: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
7090: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
70a0: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
70b0: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
70c0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
70d0: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
70e0: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
70f0: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
7100: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
7110: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
7120: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
7130: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
7140: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
7150: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
7160: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
7170: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
7180: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
7190: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
71a0: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
71b0: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
71c0: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
71d0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
71e0: 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
71f0: 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74  tains a combinat
7200: 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44  ion of the EXPRD
7210: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
7220: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
7230: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
7240: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  et, then the str
7250: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
7260: 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65  is a.** truncate
7270: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
7280: 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75   usual Expr stru
7290: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
72a0: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
72b0: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
72c0: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
72d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
72e0: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  base schema..*/.
72f0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
7300: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
7310: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
7320: 6c 61 67 73 29 7b 0a 20 20 72 65 74 75 72 6e 20  lags){.  return 
7330: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66  exprDup(db, p, f
7340: 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45 78 70 72  lags, 0);.}.Expr
7350: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
7360: 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  rListDup(sqlite3
7370: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
7380: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
7390: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b   ExprList *pNew;
73a0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
73b0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
73c0: 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74  *pOldItem;.  int
73d0: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
73e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
73f0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
7400: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
7410: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
7420: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
7430: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45  rn 0;.  pNew->iE
7440: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e  Cursor = 0;.  pN
7450: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20  ew->nExpr = i = 
7460: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  p->nExpr;.  if( 
7470: 28 66 6c 61 67 73 20 26 20 45 58 50 52 44 55 50  (flags & EXPRDUP
7480: 5f 52 45 44 55 43 45 29 3d 3d 30 20 29 20 66 6f  _REDUCE)==0 ) fo
7490: 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=1; i<p->nExp
74a0: 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65  r; i+=i){}.  pNe
74b0: 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73  w->a = pItem = s
74c0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
74d0: 77 28 64 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28  w(db,  i*sizeof(
74e0: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
74f0: 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20  ( pItem==0 ){.  
7500: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7510: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
7520: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20  eturn 0;.  } .  
7530: 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b  pOldItem = p->a;
7540: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
7550: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
7560: 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b  em++, pOldItem++
7570: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c  ){.    Expr *pOl
7580: 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d  dExpr = pOldItem
7590: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 74  ->pExpr;.    pIt
75a0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  em->pExpr = sqli
75b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
75c0: 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b  OldExpr, flags);
75d0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
75e0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
75f0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7600: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  ->zName);.    pI
7610: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
7620: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7630: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e   pOldItem->zSpan
7640: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f  );.    pItem->so
7650: 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74  rtOrder = pOldIt
7660: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
7670: 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d     pItem->done =
7680: 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62   0;.    pItem->b
7690: 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64  SpanIsTab = pOld
76a0: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
76b0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 4f 72  ;.    pItem->iOr
76c0: 64 65 72 42 79 43 6f 6c 20 3d 20 70 4f 6c 64 49  derByCol = pOldI
76d0: 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c  tem->iOrderByCol
76e0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c  ;.    pItem->iAl
76f0: 69 61 73 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ias = pOldItem->
7700: 69 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65  iAlias;.  }.  re
7710: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7720: 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20  .** If cursors, 
7730: 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20  triggers, views 
7740: 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61  and subqueries a
7750: 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66  re all omitted f
7760: 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64  rom.** the build
7770: 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74  , then none of t
7780: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
7790: 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f  tines, except fo
77a0: 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  r .** sqlite3Sel
77b0: 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65  ectDup(), can be
77c0: 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33   called. sqlite3
77d0: 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73  SelectDup() is s
77e0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c  ometimes.** call
77f0: 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61  ed with a NULL a
7800: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
7810: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7820: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
7830: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7840: 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c  IT_TRIGGER) \. |
7850: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
7860: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
7870: 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
7880: 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69  3SrcListDup(sqli
7890: 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74  te3 *db, SrcList
78a0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
78b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
78c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
78d0: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d   nByte;.  if( p=
78e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
78f0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
7900: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
7910: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
7920: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
7930: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
7940: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7950: 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  aw(db, nByte );.
7960: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7970: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7980: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
7990: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
79a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
79b0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
79c0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
79d0: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
79e0: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
79f0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
7a00: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
7a10: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
7a20: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
7a30: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65   pNewItem->pSche
7a40: 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ma = pOldItem->p
7a50: 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77  Schema;.    pNew
7a60: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
7a70: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
7a80: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
7a90: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
7aa0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
7ab0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
7ac0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
7ad0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
7ae0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
7af0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7b00: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c  b, pOldItem->zAl
7b10: 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ias);.    pNewIt
7b20: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  em->jointype = p
7b30: 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  OldItem->jointyp
7b40: 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  e;.    pNewItem-
7b50: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
7b60: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
7b70: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72    pNewItem->addr
7b80: 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74  FillSub = pOldIt
7b90: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b  em->addrFillSub;
7ba0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72  .    pNewItem->r
7bb0: 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49  egReturn = pOldI
7bc0: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
7bd0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73      pNewItem->is
7be0: 43 6f 72 72 65 6c 61 74 65 64 20 3d 20 70 4f 6c  Correlated = pOl
7bf0: 64 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61  dItem->isCorrela
7c00: 74 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ted;.    pNewIte
7c10: 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  m->viaCoroutine 
7c20: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 76 69 61 43  = pOldItem->viaC
7c30: 6f 72 6f 75 74 69 6e 65 3b 0a 20 20 20 20 70 4e  oroutine;.    pN
7c40: 65 77 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d  ewItem->zIndex =
7c50: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7c60: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7c70: 49 6e 64 65 78 29 3b 0a 20 20 20 20 70 4e 65 77  Index);.    pNew
7c80: 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
7c90: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6e 6f 74   = pOldItem->not
7ca0: 49 6e 64 65 78 65 64 3b 0a 20 20 20 20 70 4e 65  Indexed;.    pNe
7cb0: 77 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20 3d 20  wItem->pIndex = 
7cc0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 6e 64 65 78  pOldItem->pIndex
7cd0: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  ;.    pTab = pNe
7ce0: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
7cf0: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
7d00: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
7d10: 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
7d20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
7d30: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Item->pSelect = 
7d40: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
7d50: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
7d60: 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a  Select, flags);.
7d70: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f      pNewItem->pO
7d80: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
7d90: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7da0: 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20  >pOn, flags);.  
7db0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69    pNewItem->pUsi
7dc0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ng = sqlite3IdLi
7dd0: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
7de0: 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20  em->pUsing);.   
7df0: 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73   pNewItem->colUs
7e00: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63  ed = pOldItem->c
7e10: 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65  olUsed;.  }.  re
7e20: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
7e30: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
7e40: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
7e50: 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  b, IdList *p){. 
7e60: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
7e70: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
7e80: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7e90: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
7ea0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
7eb0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
7ec0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7ed0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7ee0: 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a  ->nId = p->nId;.
7ef0: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
7f00: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7f10: 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66  b, p->nId*sizeof
7f20: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
7f30: 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b  f( pNew->a==0 ){
7f40: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
7f50: 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ee(db, pNew);.  
7f60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7f70: 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    /* Note that b
7f80: 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65 20  ecause the size 
7f90: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  of the allocatio
7fa0: 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20  n for p->a[] is 
7fb0: 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61  not.  ** necessa
7fc0: 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20  rily a power of 
7fd0: 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69  two, sqlite3IdLi
7fe0: 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e  stAppend() may n
7ff0: 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a  ot be called.  *
8000: 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61  * on the duplica
8010: 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  te created by th
8020: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  is function. */.
8030: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8040: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
8050: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
8060: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
8070: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
8080: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
8090: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
80a0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
80b0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
80c0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
80d0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
80e0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
80f0: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
8100: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
8110: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
8120: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
8130: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
8140: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
8150: 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63   flags){.  Selec
8160: 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72  t *pNew, *pPrior
8170: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
8180: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
8190: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
81a0: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
81b0: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
81c0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
81d0: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
81e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
81f0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
8200: 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  st, flags);.  pN
8210: 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  ew->pSrc = sqlit
8220: 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c  e3SrcListDup(db,
8230: 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29   p->pSrc, flags)
8240: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
8250: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8260: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
8270: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
8280: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
8290: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
82a0: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
82b0: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
82c0: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
82d0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
82e0: 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b  pHaving, flags);
82f0: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
8300: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
8310: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
8320: 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a  rderBy, flags);.
8330: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
8340: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  op;.  pNew->pPri
8350: 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20 73 71  or = pPrior = sq
8360: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
8370: 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c  b, p->pPrior, fl
8380: 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ags);.  if( pPri
8390: 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
83a0: 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65  xt = pNew;.  pNe
83b0: 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  w->pNext = 0;.  
83c0: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
83d0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
83e0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
83f0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  gs);.  pNew->pOf
8400: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
8410: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66  prDup(db, p->pOf
8420: 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  fset, flags);.  
8430: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
8440: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
8450: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73  t = 0;.  pNew->s
8460: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
8470: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
8480: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65  Ephemeral;.  pNe
8490: 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
84a0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  0;.  pNew->addrO
84b0: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
84c0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
84d0: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
84e0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
84f0: 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72  phm[2] = -1;.  r
8500: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65  eturn pNew;.}.#e
8510: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
8520: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
8530: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
8540: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
8550: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
8560: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
8570: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
8580: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
8590: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
85a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
85b0: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
85c0: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
85d0: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
85e0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
85f0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
8600: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
8610: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
8620: 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73  , the entire lis
8630: 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a  t is freed and.*
8640: 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  * NULL is return
8650: 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c  ed.  If non-NULL
8660: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
8670: 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
8680: 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  eed.** that the 
8690: 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75  new entry was su
86a0: 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e  ccessfully appen
86b0: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ded..*/.ExprList
86c0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
86d0: 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65  tAppend(.  Parse
86e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
86f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8700: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
8710: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
8720: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
8730: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
8740: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
8750: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
8760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
8770: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
8780: 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65  pended. Might be
8790: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
87a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
87b0: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c  se->db;.  if( pL
87c0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
87d0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
87e0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
87f0: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
8800: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
8810: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
8820: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
8830: 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71     pList->a = sq
8840: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8850: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  (db, sizeof(pLis
8860: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
8870: 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29  f( pList->a==0 )
8880: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
8890: 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74  }else if( (pList
88a0: 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74  ->nExpr & (pList
88b0: 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29  ->nExpr-1))==0 )
88c0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
88d0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
88e0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
88f0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
8900: 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65   a = sqlite3DbRe
8910: 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d  alloc(db, pList-
8920: 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  >a, pList->nExpr
8930: 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  *2*sizeof(pList-
8940: 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  >a[0]));.    if(
8950: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67   a==0 ){.      g
8960: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
8970: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
8980: 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   a;.  }.  assert
8990: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b  ( pList->a!=0 );
89a0: 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20 20  .  if( 1 ){.    
89b0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
89c0: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
89d0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
89e0: 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d  Expr++];.    mem
89f0: 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
8a00: 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20  zeof(*pItem));. 
8a10: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
8a20: 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72  = pExpr;.  }.  r
8a30: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f  eturn pList;..no
8a40: 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20  _mem:     .  /* 
8a50: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
8a60: 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68  mory if malloc h
8a70: 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20  as failed. */.  
8a80: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8a90: 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
8aa0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8ab0: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
8ac0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
8ad0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
8ae0: 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  xprList.a[].zNam
8af0: 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  e element of the
8b00: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
8b10: 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20  dded item.** on 
8b20: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
8b30: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ist..**.** pList
8b40: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66   might be NULL f
8b50: 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20  ollowing an OOM 
8b60: 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d  error.  But pNam
8b70: 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
8b80: 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61  e.** NULL.  If a
8b90: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
8ba0: 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50  on fails, the pP
8bb0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
8bc0: 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69  Failed flag.** i
8bd0: 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s set..*/.void s
8be0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
8bf0: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
8c00: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
8c10: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
8c20: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
8c30: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
8c40: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
8c50: 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61  h to add the spa
8c60: 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  n. */.  Token *p
8c70: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
8c80: 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64  /* Name to be ad
8c90: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  ded */.  int deq
8ca0: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
8cb0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73   /* True to caus
8cc0: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65  e the name to be
8cd0: 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a   dequoted */.){.
8ce0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
8cf0: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
8d00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
8d10: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
8d20: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
8d30: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
8d40: 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  tem;.    assert(
8d50: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
8d60: 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26  );.    pItem = &
8d70: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
8d80: 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73  nExpr-1];.    as
8d90: 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61  sert( pItem->zNa
8da0: 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74  me==0 );.    pIt
8db0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
8dc0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61  te3DbStrNDup(pPa
8dd0: 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e  rse->db, pName->
8de0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
8df0: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
8e00: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20   pItem->zName ) 
8e10: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70  sqlite3Dequote(p
8e20: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
8e30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
8e40: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
8e50: 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  zSpan element of
8e60: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8e70: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
8e80: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
8e90: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
8ea0: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
8eb0: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
8ec0: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
8ed0: 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76  pSpan should nev
8ee0: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
8ef0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
8f00: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
8f10: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
8f20: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
8f30: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
8f40: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
8f50: 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72  stSetSpan(.  Par
8f60: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8f70: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
8f80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8f90: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
8fa0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
8fb0: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
8fc0: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72   span. */.  Expr
8fd0: 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20  Span *pSpan     
8fe0: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20      /* The span 
8ff0: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29  to be added */.)
9000: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
9010: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9020: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
9030: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
9040: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
9050: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
9060: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
9070: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69  em *pItem = &pLi
9080: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
9090: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
90a0: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
90b0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
90c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
90d0: 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70  d || pItem->pExp
90e0: 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20  r==pSpan->pExpr 
90f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
9100: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
9110: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
9120: 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  m->zSpan = sqlit
9130: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
9140: 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53  (char*)pSpan->zS
9150: 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tart,.          
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9170: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
9180: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
9190: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
91a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
91b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
91c0: 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69  st pEList contai
91d0: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69  ns more than iLi
91e0: 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a  mit elements,.**
91f0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
9200: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
9210: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
9220: 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c  e3ExprListCheckL
9230: 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a  ength(.  Parse *
9240: 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69  pParse,.  ExprLi
9250: 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f  st *pEList,.  co
9260: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63  nst char *zObjec
9270: 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20  t.){.  int mx = 
9280: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
9290: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
92a0: 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63  COLUMN];.  testc
92b0: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
92c0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
92d0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
92e0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
92f0: 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b  ->nExpr==mx+1 );
9300: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26  .  if( pEList &&
9310: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d   pEList->nExpr>m
9320: 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
9330: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9340: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
9350: 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65  ns in %s", zObje
9360: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ct);.  }.}../*.*
9370: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
9380: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  re expression li
9390: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
93a0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
93b0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
93c0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
93d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
93e0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
93f0: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
9400: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
9410: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
9420: 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74  t->a!=0 || pList
9430: 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20  ->nExpr==0 );.  
9440: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
9450: 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
9460: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
9470: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
9480: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
9490: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
94a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
94b0: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
94c0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
94d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
94e0: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20  m->zSpan);.  }. 
94f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9500: 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
9510: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9520: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
9530: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
9540: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
9550: 6c 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e  lbacks.  Walker.
9560: 75 2e 70 69 20 69 73 20 61 20 70 6f 69 6e 74 65  u.pi is a pointe
9570: 72 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67  r.** to an integ
9580: 65 72 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  er.  These routi
9590: 6e 65 73 20 61 72 65 20 63 68 65 63 6b 69 6e 67  nes are checking
95a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
95b0: 6f 20 73 65 65 0a 2a 2a 20 69 66 20 69 74 20 69  o see.** if it i
95c0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53  s a constant.  S
95d0: 65 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20  et *Walker.u.pi 
95e0: 74 6f 20 30 20 69 66 20 74 68 65 20 65 78 70 72  to 0 if the expr
95f0: 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74  ession is.** not
9600: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a   constant..**.**
9610: 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20   These callback 
9620: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
9630: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
9640: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
9650: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
9660: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a  xprIsConstant().
9670: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
9680: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
9690: 6f 69 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c  oin().**     sql
96a0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
96b0: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a  ntOrFunction().*
96c0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
96d0: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
96e0: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
96f0: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
9700: 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b  {..  /* If pWalk
9710: 65 72 2d 3e 75 2e 69 20 69 73 20 33 20 74 68 65  er->u.i is 3 the
9720: 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68  n any term of th
9730: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
9740: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a  t comes from.  *
9750: 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
9760: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
9770: 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73  oin disqualifies
9780: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
9790: 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20    ** from being 
97a0: 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74  considered const
97b0: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57  ant. */.  if( pW
97c0: 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26  alker->u.i==3 &&
97d0: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
97e0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
97f0: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70  omJoin) ){.    p
9800: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b  Walker->u.i = 0;
9810: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
9820: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77  Abort;.  }..  sw
9830: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
9840: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
9850: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
9860: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
9870: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
9880: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
9890: 20 20 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c 6b      ** and pWalk
98a0: 65 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20  er->u.i==2 */.  
98b0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
98c0: 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  ON:.      if( pW
98d0: 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29 20  alker->u.i==2 ) 
98e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
98f0: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
9900: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
9910: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  D:.    case TK_C
9920: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
9930: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
9940: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
9950: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74  _COLUMN:.      t
9960: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9970: 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20  op==TK_ID );.   
9980: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9990: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
99a0: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
99b0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
99c0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
99d0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
99e0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
99f0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
9a00: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e       pWalker->u.
9a10: 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  i = 0;.      ret
9a20: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
9a30: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
9a40: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
9a50: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
9a60: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
9a70: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
9a80: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
9a90: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9aa0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
9ab0: 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  S ); /* selectNo
9ac0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
9ad0: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
9ae0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
9af0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73  ontinue;.  }.}.s
9b00: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
9b10: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
9b20: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
9b30: 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29  Select *NotUsed)
9b40: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
9b50: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
9b60: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20   pWalker->u.i = 
9b70: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
9b80: 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20  Abort;.}.static 
9b90: 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28  int exprIsConst(
9ba0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69  Expr *p, int ini
9bb0: 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72  tFlag){.  Walker
9bc0: 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
9bd0: 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
9be0: 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46 6c    w.u.i = initFl
9bf0: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
9c00: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
9c10: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
9c20: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
9c30: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
9c40: 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65  nstant;.  sqlite
9c50: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
9c60: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e 69  ;.  return w.u.i
9c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
9c80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
9c90: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
9ca0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9cb0: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61  is constant.** a
9cc0: 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  nd 0 if it invol
9cd0: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
9ce0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e   function calls.
9cf0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
9d00: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
9d10: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
9d20: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
9d30: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
9d40: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
9d50: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
9d60: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
9d70: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
9d80: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
9d90: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9da0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45  ExprIsConstant(E
9db0: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
9dc0: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
9dd0: 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   1);.}../*.** Wa
9de0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
9df0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
9e00: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
9e10: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
9e20: 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f  * that does no o
9e30: 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68  riginate from th
9e40: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
9e50: 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e  auses of a join.
9e60: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
9e70: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
9e80: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
9e90: 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73  n calls or terms
9ea0: 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f   from.** an ON o
9eb0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
9ec0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
9ed0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
9ee0: 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oin(Expr *p){.  
9ef0: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
9f00: 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 3);.}../*.
9f10: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
9f20: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
9f30: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
9f40: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
9f50: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
9f60: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
9f70: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
9f80: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
9f90: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
9fa0: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
9fb0: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
9fc0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
9fd0: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
9fe0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
9ff0: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
a000: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
a010: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
a020: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
a030: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
a040: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
a050: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
a060: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
a070: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29  unction(Expr *p)
a080: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
a090: 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d 0a  sConst(p, 2);.}.
a0a0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
a0b0: 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73  pression p codes
a0c0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
a0d0: 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
a0e0: 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
a0f0: 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
a100: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
a110: 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
a120: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
a130: 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
a140: 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
a150: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
a160: 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
a170: 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
a180: 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
a190: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
a1a0: 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
a1b0: 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
a1c0: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
a1d0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
a1e0: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
a1f0: 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72  pValue){.  int r
a200: 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  c = 0;..  /* If 
a210: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
a220: 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65   an integer lite
a230: 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e  ral that fits in
a240: 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
a250: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74  .  ** integer, t
a260: 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61  hen the EP_IntVa
a270: 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61  lue flag will ha
a280: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
a290: 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  set */.  assert(
a2a0: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47   p->op!=TK_INTEG
a2b0: 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20  ER || (p->flags 
a2c0: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  & EP_IntValue)!=
a2d0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
a2e0: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
a2f0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63  p->u.zToken, &rc
a300: 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  )==0 );..  if( p
a310: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
a320: 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56  Value ){.    *pV
a330: 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c  alue = p->u.iVal
a340: 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ue;.    return 1
a350: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
a360: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
a370: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
a380: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a390: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
a3a0: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
a3b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a3c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a3d0: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
a3e0: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
a3f0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
a400: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
a410: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  &v) ){.        a
a420: 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37  ssert( v!=(-2147
a430: 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20  483647-1) );.   
a440: 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d       *pValue = -
a450: 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  v;.        rc = 
a460: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
a470: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a480: 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b    default: break
a490: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
a4a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
a4b0: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72  rn FALSE if ther
a4c0: 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
a4d0: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
a4e0: 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a  on can be NULL..
a4f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
a500: 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65  ression might be
a510: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
a520: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f  expression is to
a530: 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20  o complex.** to 
a540: 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45  tell return TRUE
a550: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
a560: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61  outine is used a
a570: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
a580: 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73  n, to skip OP_Is
a590: 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20  Null opcodes.** 
a5a0: 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61  when we know tha
a5b0: 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  t a value cannot
a5c0: 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65   be NULL.  Hence
a5d0: 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  , a false positi
a5e0: 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  ve.** (returning
a5f0: 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61   TRUE when in fa
a600: 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ct the expressio
a610: 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e  n can never be N
a620: 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65  ULL) might.** be
a630: 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d   a small perform
a640: 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20  ance hit but is 
a650: 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65  otherwise harmle
a660: 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65  ss.  On the othe
a670: 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c  r.** hand, a fal
a680: 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74  se negative (ret
a690: 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65  urning FALSE whe
a6a0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75  n the result cou
a6b0: 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77  ld be NULL).** w
a6c0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
a6d0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63  t in an incorrec
a6e0: 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68  t answer.  So wh
a6f0: 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
a700: 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a  urn.** TRUE..*/.
a710: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
a720: 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45  anBeNull(const E
a730: 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70  xpr *p){.  u8 op
a740: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
a750: 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
a760: 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
a770: 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
a780: 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
a790: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
a7a0: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
a7b0: 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
a7c0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
a7d0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
a7e0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
a7f0: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
a800: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
a810: 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  B:.      return 
a820: 30 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  0;.    default:.
a830: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
a840: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
a850: 65 72 61 74 65 20 61 6e 20 4f 50 5f 49 73 4e 75  erate an OP_IsNu
a860: 6c 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ll instruction t
a870: 68 61 74 20 74 65 73 74 73 20 72 65 67 69 73 74  hat tests regist
a880: 65 72 20 69 52 65 67 20 61 6e 64 20 6a 75 6d 70  er iReg and jump
a890: 73 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  s.** to location
a8a0: 20 69 44 65 73 74 20 69 66 20 74 68 65 20 76 61   iDest if the va
a8b0: 6c 75 65 20 69 6e 20 69 52 65 67 20 69 73 20 4e  lue in iReg is N
a8c0: 55 4c 4c 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ULL.  The value 
a8d0: 69 6e 20 69 52 65 67 20 0a 2a 2a 20 77 61 73 20  in iReg .** was 
a8e0: 63 6f 6d 70 75 74 65 64 20 62 79 20 70 45 78 70  computed by pExp
a8f0: 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 6c 6f  r.  If we can lo
a900: 6f 6b 20 61 74 20 70 45 78 70 72 20 61 74 20 63  ok at pExpr at c
a910: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e 64 0a  ompile-time and.
a920: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 74 68 61  ** determine tha
a930: 74 20 69 74 20 63 61 6e 20 6e 65 76 65 72 20 67  t it can never g
a940: 65 6e 65 72 61 74 65 20 61 20 4e 55 4c 4c 2c 20  enerate a NULL, 
a950: 74 68 65 6e 20 74 68 65 20 4f 50 5f 49 73 4e 75  then the OP_IsNu
a960: 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ll operation.** 
a970: 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 0a  can be omitted..
a980: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
a990: 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d  xprCodeIsNullJum
a9a0: 70 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  p(.  Vdbe *v,   
a9b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a9c0: 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
a9d0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  ruction */.  con
a9e0: 73 74 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  st Expr *pExpr, 
a9f0: 20 2f 2a 20 4f 6e 6c 79 20 67 65 6e 65 72 61 74   /* Only generat
aa00: 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 66 20 74  e OP_IsNull if t
aa10: 68 69 73 20 65 78 70 72 20 63 61 6e 20 62 65 20  his expr can be 
aa20: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52  NULL */.  int iR
aa30: 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  eg,           /*
aa40: 20 54 65 73 74 20 74 68 65 20 76 61 6c 75 65 20   Test the value 
aa50: 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
aa60: 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69   for NULL */.  i
aa70: 6e 74 20 69 44 65 73 74 20 20 20 20 20 20 20 20  nt iDest        
aa80: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
aa90: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
aaa0: 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  null */.){.  if(
aab0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
aac0: 65 4e 75 6c 6c 28 70 45 78 70 72 29 20 29 7b 0a  eNull(pExpr) ){.
aad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
aae0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
aaf0: 6c 6c 2c 20 69 52 65 67 2c 20 69 44 65 73 74 29  ll, iReg, iDest)
ab00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
ab10: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
ab20: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
ab30: 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  on is a constant
ab40: 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a   which would be.
ab50: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20  ** unchanged by 
ab60: 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68  OP_Affinity with
ab70: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67 69   the affinity gi
ab80: 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
ab90: 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
aba0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
abb0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
abc0: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50  ermine if the OP
abd0: 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74  _Affinity operat
abe0: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d  ion.** can be om
abf0: 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20  itted.  When in 
ac00: 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c  doubt return FAL
ac10: 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67  SE.  A false neg
ac20: 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d  ative.** is harm
ac30: 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70  less.  A false p
ac40: 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72  ositive, however
ac50: 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20  , can result in 
ac60: 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73  the wrong.** ans
ac70: 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  wer..*/.int sqli
ac80: 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
ac90: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e  finityChange(con
aca0: 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72  st Expr *p, char
acb0: 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a   aff){.  u8 op;.
acc0: 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54    if( aff==SQLIT
acd0: 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72 65 74  E_AFF_NONE ) ret
ace0: 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  urn 1;.  while( 
acf0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
ad00: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
ad10: 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
ad20: 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
ad30: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
ad40: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
ad50: 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
ad60: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
ad70: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
ad80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
ad90: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
ada0: 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
adb0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
adc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
add0: 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
ade0: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
adf0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c  QLITE_AFF_REAL |
ae00: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
ae10: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
ae20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
ae30: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ING: {.      ret
ae40: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
ae50: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a  AFF_TEXT;.    }.
ae60: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
ae70: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
ae80: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
ae90: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
aea0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
aeb0: 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f  >iTable>=0 );  /
aec0: 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61  * p cannot be pa
aed0: 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f  rt of a CHECK co
aee0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
aef0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c    return p->iCol
af00: 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20  umn<0.          
af10: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
af20: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
af30: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
af40: 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20  UMERIC);.    }. 
af50: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
af60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
af70: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
af80: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
af90: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
afa0: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
afb0: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
afc0: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
afd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
afe0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
aff0: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
b000: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
b010: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
b020: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
b030: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
b040: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
b050: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
b060: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
b070: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
b080: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
b090: 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20   if we are able 
b0a0: 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  to the IN operat
b0b0: 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  or optimization 
b0c0: 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66  on a.** query of
b0d0: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
b0e0: 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45        x IN (SELE
b0f0: 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68  CT ...).**.** Wh
b100: 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  ere the SELECT..
b110: 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73 20 73  . clause is as s
b120: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
b130: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
b140: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  s.** routine..**
b150: 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74 20 6f  .** The Select o
b160: 62 6a 65 63 74 20 70 61 73 73 65 64 20 69 6e 20  bject passed in 
b170: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
b180: 20 70 72 65 70 72 6f 63 65 73 73 65 64 20 61 6e   preprocessed an
b190: 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68  d no.** errors h
b1a0: 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a  ave been found..
b1b0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
b1c0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
b1d0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e  static int isCan
b1e0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53  didateForInOpt(S
b1f0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
b200: 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78  List *pSrc;.  Ex
b210: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
b220: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
b230: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b240: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
b250: 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74          /* right
b260: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e  -hand side of IN
b270: 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20   is SELECT */.  
b280: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
b290: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
b2a0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20         /* Not a 
b2b0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
b2c0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
b2d0: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
b2e0: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
b2f0: 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  ) ){.    testcas
b300: 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
b310: 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
b320: 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
b330: 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
b340: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
b350: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
b360: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
b370: 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
b380: 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75  gate );.    retu
b390: 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54  rn 0; /* No DIST
b3a0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64  INCT keyword and
b3b0: 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
b3c0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20  nctions */.  }. 
b3d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
b3e0: 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20  upBy==0 );      
b3f0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
b400: 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
b410: 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c  e */.  if( p->pL
b420: 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
b430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b440: 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c   Has no LIMIT cl
b450: 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ause */.  assert
b460: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
b470: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
b480: 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61   /* No LIMIT mea
b490: 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a  ns no OFFSET */.
b4a0: 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
b4b0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
b4d0: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
b4e0: 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  */.  pSrc = p->p
b4f0: 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
b500: 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Src!=0 );.  if( 
b510: 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
b520: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
b530: 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72     /* Single ter
b540: 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  m in FROM clause
b550: 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
b560: 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72  a[0].pSelect ) r
b570: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
b580: 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75  FROM is not a su
b590: 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a  bquery or view *
b5a0: 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  /.  pTab = pSrc-
b5b0: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66  >a[0].pTab;.  if
b5c0: 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29  ( NEVER(pTab==0)
b5d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
b5e0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65  ssert( pTab->pSe
b5f0: 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  lect==0 );      
b600: 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
b610: 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69  ause is not a vi
b620: 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  ew */.  if( IsVi
b630: 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
b640: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f  turn 0;        /
b650: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f  * FROM clause no
b660: 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
b670: 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
b680: 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
b690: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
b6a0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
b6b0: 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d      /* One colum
b6c0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
b6d0: 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c  set */.  if( pEL
b6e0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
b6f0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
b700: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65   return 0; /* Re
b710: 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sult is a column
b720: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
b730: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b740: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b750: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
b760: 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72  an OP_Once instr
b770: 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63  uction and alloc
b780: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ate space for it
b790: 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20 74  s flag. Return t
b7a0: 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  he .** address o
b7b0: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
b7c0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
b7d0: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50 61  lite3CodeOnce(Pa
b7e0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
b7f0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
b800: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
b810: 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  ;      /* Virtua
b820: 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
b830: 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75 72  coded */.  retur
b840: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
b850: 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20  Op1(v, OP_Once, 
b860: 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29  pParse->nOnce++)
b870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b880: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
b890: 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
b8a0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  tation of the IN
b8b0: 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e   (...) operator.
b8c0: 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d  .** The pX param
b8d0: 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72  eter is the expr
b8e0: 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48  ession on the RH
b8f0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
b900: 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d  ator, which.** m
b910: 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61  ight be either a
b920: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
b930: 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65  ions or a subque
b940: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  ry..**.** The jo
b950: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
b960: 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20  e is to find or 
b970: 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20  create a b-tree 
b980: 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a  object that can.
b990: 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65  ** be used eithe
b9a0: 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65  r to test for me
b9b0: 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20  mbership in the 
b9c0: 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74  RHS set or to it
b9d0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a  erate through.**
b9e0: 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
b9f0: 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69  the RHS set, ski
ba00: 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73  pping duplicates
ba10: 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72  ..**.** A cursor
ba20: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68   is opened on th
ba30: 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  e b-tree object 
ba40: 74 68 61 74 20 74 68 65 20 52 48 53 20 6f 66 20  that the RHS of 
ba50: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
ba60: 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c  ** and pX->iTabl
ba70: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
ba80: 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75  index of that cu
ba90: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
baa0: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f  returned value o
bab0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
bac0: 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d  indicates the b-
bad0: 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f  tree type, as fo
bae0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49  llows:.**.**   I
baf0: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20  N_INDEX_ROWID   
bb00: 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20     - The cursor 
bb10: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
bb20: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
bb30: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
bb40: 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63  DEX_ASC  - The c
bb50: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
bb60: 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67   on an ascending
bb70: 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
bb80: 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
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 65  s opened on a de
bbb0: 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a  scending index..
bbc0: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50  **   IN_INDEX_EP
bbd0: 48 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63  H        - The c
bbe0: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
bbf0: 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20   on a specially 
bc00: 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20  created and.**  
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc20: 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64         populated
bc30: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
bc40: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
bc50: 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74  ing b-tree might
bc60: 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
bc70: 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70  RHS expression p
bc80: 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  X is a simple.**
bc90: 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20 61   subquery such a
bca0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
bcb0: 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f  ECT <column> FRO
bcc0: 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
bcd0: 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  If the RHS of th
bce0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
bcf0: 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72   a list or a mor
bd00: 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65  e complex subque
bd10: 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65  ry, then.** an e
bd20: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d  phemeral table m
bd30: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
bd40: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
bd50: 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a  he RHS and then.
bd60: 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61  ** pX->iTable ma
bd70: 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
bd80: 68 65 20 65 70 68 65 72 6d 65 72 61 6c 20 74 61  he ephermeral ta
bd90: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
bda0: 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61  n.** existing ta
bdb0: 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ble.  .**.** If 
bdc0: 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70  the prNotFound p
bdd0: 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74  arameter is 0, t
bde0: 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 77  hen the b-tree w
bdf0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
be00: 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67  terate.** throug
be10: 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  h the set member
be20: 73 2c 20 73 6b 69 70 70 69 6e 67 20 61 6e 79 20  s, skipping any 
be30: 64 75 70 6c 69 63 61 74 65 73 2e 20 49 6e 20 74  duplicates. In t
be40: 68 69 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65  his case an.** e
be50: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
be60: 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65  ust be used unle
be70: 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  ss the selected 
be80: 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72  <column> is guar
be90: 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
bea0: 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20  unique - either 
beb0: 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e  because it is an
bec0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
bed0: 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20 68 61   KEY or it.** ha
bee0: 73 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  s a UNIQUE const
bef0: 72 61 69 6e 74 20 6f 72 20 55 4e 49 51 55 45 20  raint or UNIQUE 
bf00: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  index..**.** If 
bf10: 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70  the prNotFound p
bf20: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
bf30: 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  0, then the b-tr
bf40: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
bf50: 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74  .** for fast set
bf60: 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
bf70: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
bf80: 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
bf90: 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
bfa0: 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
bfb0: 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45  mn> is an INTEGE
bfc0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
bfd0: 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a   an index can .*
bfe0: 2a 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20  * be found with 
bff0: 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20  <column> as its 
c000: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
c010: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
c020: 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
c030: 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
c040: 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
c050: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
c060: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f  .** needs to kno
c070: 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  w whether or not
c080: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63   the structure c
c090: 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e  ontains an SQL N
c0a0: 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e  ULL .** value in
c0b0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 72 72 65 63   order to correc
c0c0: 74 6c 79 20 65 76 61 6c 75 61 74 65 20 65 78 70  tly evaluate exp
c0d0: 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58  ressions like "X
c0e0: 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20   IN (Y, Z)"..** 
c0f0: 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
c100: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
c110: 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74  (...) might cont
c120: 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ain a NULL value
c130: 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20   at.** runtime, 
c140: 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20  then a register 
c150: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
c160: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
c170: 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20  mber written.** 
c180: 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20  to *prNotFound. 
c190: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  If there is no c
c1a0: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
c1b0: 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a  ...) contains a.
c1c0: 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74  ** NULL value, t
c1d0: 68 65 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20  hen *prNotFound 
c1e0: 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
c1f0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  d..**.** If a re
c200: 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61  gister is alloca
c210: 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61  ted and its loca
c220: 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a  tion stored in *
c230: 70 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65 6e  prNotFound, then
c240: 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69 61 6c 20  .** its initial 
c250: 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20 20  value is NULL.  
c260: 49 66 20 74 68 65 20 28 2e 2e 2e 29 20 64 6f 65  If the (...) doe
c270: 73 20 6e 6f 74 20 72 65 6d 61 69 6e 20 63 6f 6e  s not remain con
c280: 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 74 68 65  stant.** for the
c290: 20 64 75 72 61 74 69 6f 6e 20 6f 66 20 74 68 65   duration of the
c2a0: 20 71 75 65 72 79 20 28 69 2e 65 2e 20 74 68 65   query (i.e. the
c2b0: 20 53 45 4c 45 43 54 20 77 69 74 68 69 6e 20 74   SELECT within t
c2c0: 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20 69 73 20 61  he (...).** is a
c2d0: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
c2e0: 75 65 72 79 29 20 74 68 65 6e 20 74 68 65 20 76  uery) then the v
c2f0: 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f  alue of the allo
c300: 63 61 74 65 64 20 72 65 67 69 73 74 65 72 20 69  cated register i
c310: 73 0a 2a 2a 20 72 65 73 65 74 20 74 6f 20 4e 55  s.** reset to NU
c320: 4c 4c 20 65 61 63 68 20 74 69 6d 65 20 74 68 65  LL each time the
c330: 20 73 75 62 71 75 65 72 79 20 69 73 20 72 65 72   subquery is rer
c340: 75 6e 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  un. This allows 
c350: 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
c360: 20 75 73 65 20 76 64 62 65 20 63 6f 64 65 20 65   use vdbe code e
c370: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
c380: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
c390: 2a 20 20 20 69 66 28 20 72 65 67 69 73 74 65 72  *   if( register
c3a0: 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20  ==NULL ){.**    
c3b0: 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73   has_null = <tes
c3c0: 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63 74  t if data struct
c3d0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c  ure contains nul
c3e0: 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67 69 73 74  l>.**     regist
c3f0: 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a  er = 1.**   }.**
c400: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
c410: 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67 20 74 68  avoid running th
c420: 65 20 3c 74 65 73 74 20 69 66 20 64 61 74 61 20  e <test if data 
c430: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
c440: 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74  ns null>.** test
c450: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
c460: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   is necessary..*
c470: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
c480: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
c490: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
c4a0: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
c4b0: 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 69  rse, Expr *pX, i
c4c0: 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 7b  nt *prNotFound){
c4d0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20  .  Select *p;   
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
c500: 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  CT to the right 
c510: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
c520: 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
c530: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
c540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
c550: 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20  e of RHS table. 
c560: 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20  IN_INDEX_* */.  
c570: 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
c580: 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20  e->nTab++;      
c590: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
c5a0: 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65  of the RHS table
c5b0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65   */.  int mustBe
c5c0: 55 6e 69 71 75 65 20 3d 20 28 70 72 4e 6f 74 46  Unique = (prNotF
c5d0: 6f 75 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a 20 54  ound==0);   /* T
c5e0: 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20  rue if RHS must 
c5f0: 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56  be unique */.  V
c600: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
c610: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
c620: 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
c630: 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f  machine being co
c640: 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ded */..  assert
c650: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
c660: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
c670: 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73  o see if an exis
c680: 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
c690: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
c6a0: 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20  to.  ** satisfy 
c6b0: 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73  the query.  This
c6c0: 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74   is preferable t
c6d0: 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e  o generating a n
c6e0: 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72  ew .  ** ephemer
c6f0: 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  al table..  */. 
c700: 20 70 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f   p = (ExprHasPro
c710: 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
c720: 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e  Select) ? pX->x.
c730: 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20  pSelect : 0);.  
c740: 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 72 73  if( ALWAYS(pPars
c750: 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 69  e->nErr==0) && i
c760: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c770: 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c  pt(p) ){.    sql
c780: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
c790: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
c7a0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
c7b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
c7c0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
c7f0: 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  e <table>. */.  
c800: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c820: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
c830: 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20  ession <column> 
c840: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  */.    int iCol;
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c870: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
c880: 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20   <column> */.   
c890: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
c8c0: 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62  ase idx for pTab
c8d0: 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
c8e0: 20 70 20 29 3b 20 20 20 20 20 20 20 20 20 20 20   p );           
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c900: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
c910: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
c920: 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
c930: 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c950: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
c960: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
c970: 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
c980: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
c990: 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20  .pExpr!=0 ); /* 
c9a0: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
c9b0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
c9c0: 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
c9d0: 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20   p->pSrc!=0 );  
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c9f0: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
ca00: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
ca10: 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  ) */.    pTab = 
ca20: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
ca30: 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20  ab;.    pExpr = 
ca40: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
ca50: 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20  pExpr;.    iCol 
ca60: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
ca70: 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64  ;.   .    /* Cod
ca80: 65 20 61 6e 20 4f 50 5f 56 65 72 69 66 79 43 6f  e an OP_VerifyCo
ca90: 6f 6b 69 65 20 61 6e 64 20 4f 50 5f 54 61 62 6c  okie and OP_Tabl
caa0: 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65  eLock for <table
cab0: 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  >. */.    iDb = 
cac0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
cad0: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
cae0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c  Schema);.    sql
caf0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
cb00: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
cb10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61  );.    sqlite3Ta
cb20: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
cb30: 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
cb40: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
cb50: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66  ;..    /* This f
cb60: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
cb70: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20  called from two 
cb80: 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20  places. In both 
cb90: 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20  cases the vdbe. 
cba0: 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
cbb0: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
cbc0: 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69  . So assume sqli
cbd0: 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20  te3GetVdbe() is 
cbe0: 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75  always.    ** su
cbf0: 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20  ccessful here.. 
cc00: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
cc10: 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  (v);.    if( iCo
cc20: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l<0 ){.      int
cc30: 20 69 41 64 64 72 3b 0a 0a 20 20 20 20 20 20 69   iAddr;..      i
cc40: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
cc50: 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
cc60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
cc70: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
cc80: 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
cc90: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
cca0: 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
ccb0: 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20  INDEX_ROWID;..  
ccc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
ccd0: 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
cce0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ccf0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
cd20: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
cd30: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ..      /* The c
cd40: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
cd50: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  e used by the co
cd60: 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20  mparison. If an 
cd70: 69 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20  index is to.    
cd80: 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20    ** be used in 
cd90: 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d  place of a temp-
cda0: 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62  table, it must b
cdb0: 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64  e ordered accord
cdc0: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ing.      ** to 
cdd0: 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  this collation s
cde0: 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20  equence.  */.   
cdf0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71     CollSeq *pReq
ce00: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
ce10: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
ce20: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
ce30: 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20  , pExpr);..     
ce40: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
ce50: 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  he affinity that
ce60: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
ce70: 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20   perform the .  
ce80: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
ce90: 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
cea0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
ceb0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a   the column. If.
cec0: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e        ** it is n
ced0: 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ot, it is not po
cee0: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e  ssible to use an
cef0: 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a  y index..      *
cf00: 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69  /.      int affi
cf10: 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65  nity_ok = sqlite
cf20: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
cf30: 28 70 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  (pX, pTab->aCol[
cf40: 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b  iCol].affinity);
cf50: 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78  ..      for(pIdx
cf60: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
cf70: 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20  Idx && eType==0 
cf80: 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20  && affinity_ok; 
cf90: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
cfa0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
cfb0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
cfc0: 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20  ]==iCol).       
cfd0: 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64    && sqlite3Find
cfe0: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
cff0: 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  db), pIdx->azCol
d000: 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20  l[0], 0)==pReq. 
d010: 20 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73          && (!mus
d020: 74 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49  tBeUnique || (pI
d030: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26  dx->nColumn==1 &
d040: 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  & pIdx->onError!
d050: 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20  =OE_None)).     
d060: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
d070: 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20  int iAddr;.     
d080: 20 20 20 20 20 63 68 61 72 20 2a 70 4b 65 79 3b       char *pKey;
d090: 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4b  .  .          pK
d0a0: 65 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ey = (char *)sql
d0b0: 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
d0c0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
d0d0: 20 20 20 20 20 20 20 20 20 20 69 41 64 64 72 20            iAddr 
d0e0: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
d0f0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 0a 20 20  e(pParse);.  .  
d100: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d110: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
d120: 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20  OpenRead, iTab, 
d130: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c  pIdx->tnum, iDb,
d140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d160: 70 4b 65 79 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f  pKey,P4_KEYINFO_
d170: 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
d180: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
d190: 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
d1a0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
d1b0: 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e     assert( IN_IN
d1c0: 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d  DEX_INDEX_DESC =
d1d0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
d1e0: 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20  _ASC+1 );.      
d1f0: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
d200: 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b  NDEX_INDEX_ASC +
d210: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
d220: 72 5b 30 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20  r[0];..         
d230: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d240: 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
d250: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
d260: 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21 70 54 61  NotFound && !pTa
d270: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
d280: 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  tNull ){.       
d290: 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64       *prNotFound
d2a0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
d2b0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  m;.            s
d2c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d2d0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
d2e0: 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20  *prNotFound);.  
d2f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d300: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d310: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79  }.  }..  if( eTy
d320: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==0 ){.    /* 
d330: 43 6f 75 6c 64 20 6e 6f 74 20 66 6f 75 6e 64 20  Could not found 
d340: 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
d350: 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73  e or index to us
d360: 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74  e as the RHS b-t
d370: 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77  ree..    ** We w
d380: 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65  ill have to gene
d390: 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  rate an ephemera
d3a0: 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68  l table to do th
d3b0: 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20  e job..    */.  
d3c0: 20 20 75 33 32 20 73 61 76 65 64 4e 51 75 65 72    u32 savedNQuer
d3d0: 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
d3e0: 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20  nQueryLoop;.    
d3f0: 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  int rMayHaveNull
d400: 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20   = 0;.    eType 
d410: 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a  = IN_INDEX_EPH;.
d420: 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75      if( prNotFou
d430: 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e  nd ){.      *prN
d440: 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61  otFound = rMayHa
d450: 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  veNull = ++pPars
d460: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
d470: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d480: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
d490: 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20  *prNotFound);.  
d4a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74    }else{.      t
d4b0: 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d  estcase( pParse-
d4c0: 3e 6e 51 75 65 72 79 4c 6f 6f 70 3e 30 20 29 3b  >nQueryLoop>0 );
d4d0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
d4e0: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20  QueryLoop = 0;. 
d4f0: 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65       if( pX->pLe
d500: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26  ft->iColumn<0 &&
d510: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
d520: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
d530: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
d540: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
d550: 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  EX_ROWID;.      
d560: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
d570: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
d580: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61  (pParse, pX, rMa
d590: 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65  yHaveNull, eType
d5a0: 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
d5b0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
d5c0: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65  QueryLoop = save
d5d0: 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d  dNQueryLoop;.  }
d5e0: 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54  else{.    pX->iT
d5f0: 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d  able = iTab;.  }
d600: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
d610: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
d620: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
d630: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
d640: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73  ries used as a s
d650: 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69  ubquery expressi
d660: 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f  on, EXISTS,.** o
d670: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  r IN operators. 
d680: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
d690: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
d6a0: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
d6b0: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
d6c0: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
d6d0: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
d6e0: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
d6f0: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
d700: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
d710: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
d720: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
d730: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
d740: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
d750: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
d760: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
d770: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
d780: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
d790: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
d7a0: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
d7b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
d7c0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
d7d0: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
d7e0: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
d7f0: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
d800: 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
d810: 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
d820: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
d830: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
d840: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
d850: 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
d860: 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
d870: 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
d880: 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
d890: 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
d8a0: 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
d8b0: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
d8c0: 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
d8d0: 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
d8e0: 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
d8f0: 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
d900: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
d910: 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
d920: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
d930: 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
d940: 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
d950: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
d960: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
d970: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
d980: 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
d990: 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
d9a0: 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
d9b0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
d9c0: 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65  NULLs..** Furthe
d9d0: 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e 20 69 73  rmore, the IN is
d9e0: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
d9f0: 73 65 20 61 6e 64 20 74 68 61 74 20 77 65 20 72  se and that we r
da00: 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f  eally want.** to
da10: 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 74 68   iterate over th
da20: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
da30: 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f 72 64 65  operator in orde
da40: 72 20 74 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63  r to quickly loc
da50: 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65  ate.** all corre
da60: 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65  sponding LHS ele
da70: 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74 68 69 73  ments.  All this
da80: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73   routine does is
da90: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74   initialize.** t
daa0: 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
dab0: 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
dac0: 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c  l to NULL.  Call
dad0: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  ing routines wil
dae0: 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f  l take.** care o
daf0: 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
db00: 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 20 74  register value t
db10: 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68  o non-NULL if th
db20: 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
db30: 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
db40: 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72  yHaveNull is zer
db50: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
db60: 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
db70: 69 73 20 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a  is being used.**
db80: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
db90: 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54  testing only.  T
dba0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
dbb0: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e  to initialize an
dbc0: 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74  y.** registers t
dbd0: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 70  o indicate the p
dbe0: 72 65 73 65 6e 63 65 20 6f 72 20 61 62 73 65 6e  resence or absen
dbf0: 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74  ce of NULLs on t
dc00: 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f  he RHS..**.** Fo
dc10: 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  r a SELECT or EX
dc20: 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72  ISTS operator, r
dc30: 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
dc40: 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  er that holds th
dc50: 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f  e.** result.  Fo
dc60: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f  r IN operators o
dc70: 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
dc80: 63 75 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e  curs, the return
dc90: 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a   value is 0..*/.
dca0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dcb0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
dcc0: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
dcd0: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
dce0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
dcf0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
dd00: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
dd10: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
dd20: 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45   /* The IN, SELE
dd30: 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70  CT, or EXISTS op
dd40: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
dd50: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20  rMayHaveNull,   
dd60: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
dd70: 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65  that records whe
dd80: 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74  ther NULLs exist
dd90: 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74   in RHS */.  int
dda0: 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20   isRowid        
ddb0: 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
ddc0: 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61   LHS of IN opera
ddd0: 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a  tor is a rowid *
dde0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41  /.){.  int testA
ddf0: 64 64 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  ddr = -1;       
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de10: 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20  * One-time test 
de20: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74  address */.  int
de30: 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20   rReg = 0;      
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
de60: 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69   storing resulti
de70: 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ng */.  Vdbe *v 
de80: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
de90: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
dea0: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
deb0: 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
dec0: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
ded0: 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  Parse);..  /* Th
dee0: 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  is code must be 
def0: 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72  run in its entir
df00: 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69  ety every time i
df10: 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
df20: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20  .  ** if any of 
df30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
df40: 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
df50: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
df60: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
df70: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
df80: 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
df90: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
dfa0: 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
dfb0: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
dfc0: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
dfd0: 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
dfe0: 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
dff0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
e000: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
e010: 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
e020: 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
e030: 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
e040: 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
e050: 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
e060: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
e070: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
e080: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
e090: 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79   if( !ExprHasAny
e0a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
e0b0: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b  EP_VarSelect) ){
e0c0: 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20  .    testAddr = 
e0d0: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
e0e0: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 23 69  pParse);.  }..#i
e0f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e100: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20  T_EXPLAIN.  if( 
e110: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
e120: 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
e130: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
e140: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70  rintf(.        p
e150: 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43  Parse->db, "EXEC
e160: 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52  UTE %s%s SUBQUER
e170: 59 20 25 64 22 2c 20 74 65 73 74 41 64 64 72 3e  Y %d", testAddr>
e180: 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45  =0?"":"CORRELATE
e190: 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78  D ",.        pEx
e1a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c  pr->op==TK_IN?"L
e1b0: 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20 70  IST":"SCALAR", p
e1c0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
e1d0: 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  ctId.    );.    
e1e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e1f0: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
e200: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
e210: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
e220: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
e230: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63  .#endif..  switc
e240: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
e250: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
e260: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
e270: 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
e280: 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
e290: 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  of the LHS of th
e2a0: 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  e IN */.      in
e2b0: 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
e2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
e2d0: 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
e2e0: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
e2f0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  tion */.      Ex
e300: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
e310: 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65  r->pLeft; /* the
e320: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
e330: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
e340: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
e350: 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  fo = 0;      /* 
e360: 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Key information 
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 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
e790: 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a   = isRowid ? 0 :
e7a0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
e7b0: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
e7c0: 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   1);..      if( 
e7d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
e7e0: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
e7f0: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
e800: 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
e810: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
e820: 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..).        **. 
e830: 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
e840: 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
e850: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
e860: 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
e870: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
e880: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
e890: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65  llocated and ope
e8a0: 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  ned above..     
e8b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65     */.        Se
e8c0: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
e8d0: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
e8e0: 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20  *pEList;..      
e8f0: 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77    assert( !isRow
e900: 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  id );.        sq
e910: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
e920: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
e930: 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
e940: 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  e);.        dest
e950: 2e 61 66 66 53 64 73 74 20 3d 20 28 75 38 29 61  .affSdst = (u8)a
e960: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
e970: 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
e980: 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
e990: 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
e9a0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45  le );.        pE
e9b0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
e9c0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
e9d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
e9e0: 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20  eyInfo==0 ); /* 
e9f0: 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e  Caused by OOM in
ea00: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
ea10: 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20  lloc() */.      
ea20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
ea30: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
ea40: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 64  r->x.pSelect, &d
ea50: 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
ea60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ea70: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4b 65 79  pParse->db, pKey
ea80: 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
ea90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
eaa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c     }.        pEL
eab0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
eac0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
ead0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
eae0: 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f  pKeyInfo!=0 ); /
eaf0: 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65  * OOM will cause
eb00: 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c 69   exit after sqli
eb10: 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20  te3Select() */. 
eb20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
eb30: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
eb40: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
eb50: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
eb60: 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
eb70: 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  >aColl[0] = sqli
eb80: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
eb90: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
eba0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61         pEList->a
ebf0: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
ec00: 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
ec10: 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
ec20: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
ec30: 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
ec40: 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
ec50: 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
ec60: 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63        ** For eac
ec70: 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
ec80: 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
ec90: 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
eca0: 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
ecb0: 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
ecc0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
ecd0: 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
ece0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
ecf0: 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
ed00: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
ed10: 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
ed20: 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
ed30: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
ed40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
ed50: 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
ed60: 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
ed70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
ed80: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
ed90: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
eda0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
edb0: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
edc0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
edd0: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  tem;.        int
ede0: 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20   r1, r2, r3;..  
edf0: 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e        if( !affin
ee00: 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ity ){.         
ee10: 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49   affinity = SQLI
ee20: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
ee30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
ee40: 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
ee50: 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
ee60: 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  o->aColl[0] = sq
ee70: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
ee80: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
ee90: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
eea0: 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  }..        /* Lo
eeb0: 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
eec0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65  expression in <e
eed0: 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20  xprlist>. */.   
eee0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
eef0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
ef00: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  se);.        r2 
ef10: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
ef20: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
ef30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ef40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
ef50: 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20  l, 0, r2);.     
ef60: 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e     for(i=pList->
ef70: 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69  nExpr, pItem=pLi
ef80: 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  st->a; i>0; i--,
ef90: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
efa0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
efb0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
efc0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61           int iVa
efd0: 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20  lToIns;..       
efe0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70     /* If the exp
eff0: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63  ression is not c
f000: 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20  onstant then we 
f010: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20  will need to.   
f020: 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c         ** disabl
f030: 65 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20  e the test that 
f040: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62  was generated ab
f050: 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ove that makes s
f060: 75 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ure.          **
f070: 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20   this code only 
f080: 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20  executes once.  
f090: 42 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f  Because for a no
f0a0: 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20  n-constant.     
f0b0: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
f0c0: 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  on we need to re
f0d0: 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61  run this code ea
f0e0: 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  ch time..       
f0f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
f100: 69 66 28 20 74 65 73 74 41 64 64 72 3e 3d 30 20  if( testAddr>=0 
f110: 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
f120: 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29  sConstant(pE2) )
f130: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
f140: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
f150: 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41 64 64  oNoop(v, testAdd
f160: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
f170: 74 65 73 74 41 64 64 72 20 3d 20 2d 31 3b 0a 20  testAddr = -1;. 
f180: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
f190: 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
f1a0: 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
f1b0: 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
f1c0: 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
f1d0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
f1e0: 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20 73  if( isRowid && s
f1f0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
f200: 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f  ger(pE2, &iValTo
f210: 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Ins) ){.        
f220: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f230: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
f240: 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54  rtInt, pExpr->iT
f250: 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f  able, r2, iValTo
f260: 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ins);.          
f270: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f280: 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45     r3 = sqlite3E
f290: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
f2a0: 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a  arse, pE2, r1);.
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
f2c0: 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  isRowid ){.     
f2d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f2e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f2f0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a  _MustBeInt, r3,.
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f320: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
f330: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
f340: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f350: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f360: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70   OP_Insert, pExp
f370: 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
f380: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
f390: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f3b0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
f3c0: 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20  eRecord, r3, 1, 
f3d0: 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
f3e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f3f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f400: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
f410: 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f430: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f440: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
f450: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
f460: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r2);.           
f470: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
f480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f490: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f4a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f4b0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
f4c0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f4d0: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
f4e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f4f0: 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
f500: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f510: 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
f520: 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e  , (void *)pKeyIn
f530: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
f540: 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d  ANDOFF);.      }
f550: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f560: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
f570: 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
f580: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
f590: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
f5a0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68 61 73    /* If this has
f5b0: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
f5c0: 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74  SELECT.  Generat
f5d0: 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
f5e0: 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65  e.      ** value
f5f0: 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20   of this select 
f600: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  in a memory cell
f610: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20   and record the 
f620: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  number.      ** 
f630: 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
f640: 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20  ll in iColumn.  
f650: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
f660: 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20 20 20  ISTS, write.    
f670: 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
f680: 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f  0 (not exists) o
f690: 72 20 31 20 28 65 78 69 73 74 73 29 20 69 6e 74  r 1 (exists) int
f6a0: 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a  o a memory cell.
f6b0: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 63        ** and rec
f6c0: 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  ord that memory 
f6d0: 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e  cell in iColumn.
f6e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f6f0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
f720: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63  statement to enc
f730: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  ode */.      Sel
f740: 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20  ectDest dest;   
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61     /* How to dea
f770: 6c 20 77 69 74 68 20 53 45 4c 45 43 74 20 72 65  l with SELECt re
f780: 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74  sult */..      t
f790: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
f7a0: 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
f7b0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f7c0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
f7d0: 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61  ELECT );.      a
f7e0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
f7f0: 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70  ==TK_EXISTS || p
f800: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
f810: 45 43 54 20 29 3b 0a 0a 20 20 20 20 20 20 61 73  ECT );..      as
f820: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
f830: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f840: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
f850: 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72      pSel = pExpr
f860: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
f870: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
f880: 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
f890: 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65  0, ++pParse->nMe
f8a0: 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  m);.      if( pE
f8b0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
f8c0: 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65  CT ){.        de
f8d0: 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d  st.eDest = SRT_M
f8e0: 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  em;.        sqli
f8f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f900: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73   OP_Null, 0, des
f910: 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
f920: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
f930: 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65  (v, "Init subque
f940: 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
f950: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f960: 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
f970: 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20  SRT_Exists;.    
f980: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f990: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
f9a0: 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ger, 0, dest.iSD
f9b0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
f9c0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f9d0: 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75  Init EXISTS resu
f9e0: 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lt"));.      }. 
f9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fa00: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
fa10: 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29  b, pSel->pLimit)
fa20: 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c  ;.      pSel->pL
fa30: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45  imit = sqlite3PE
fa40: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
fa50: 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20  NTEGER, 0, 0,.  
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa80: 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
fa90: 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53 65  s[1]);.      pSe
faa0: 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  l->iLimit = 0;. 
fab0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
fac0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
fad0: 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  Sel, &dest) ){. 
fae0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
faf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
fb00: 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Reg = dest.iSDPa
fb10: 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65  rm;.      ExprSe
fb20: 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45 78  tIrreducible(pEx
fb30: 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  pr);.      break
fb40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
fb50: 66 28 20 74 65 73 74 41 64 64 72 3e 3d 30 20 29  f( testAddr>=0 )
fb60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fb70: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73  eJumpHere(v, tes
fb80: 74 41 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71  tAddr);.  }.  sq
fb90: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
fba0: 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 0a 20  p(pParse, 1);.. 
fbb0: 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a   return rReg;.}.
fbc0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
fbd0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
fbe0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
fbf0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
fc00: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
fc10: 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78  ode for an IN ex
fc20: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
fc30: 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
fc40: 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78  T ...).**      x
fc50: 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
fc60: 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  e, ...).**.** Th
fc70: 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
fc80: 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c   (LHS) is a scal
fc90: 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ar expression.  
fca0: 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
fcb0: 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20  ide (RHS).** is 
fcc0: 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
fcd0: 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e   or more values.
fce0: 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
fcf0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
fd00: 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69  LHS is.** contai
fd10: 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
fd20: 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f  HS.  The value o
fd30: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
fd40: 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c   is unknown (NUL
fd50: 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53  L).** if the LHS
fd60: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
fd70: 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  he LHS is not co
fd80: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
fd90: 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a  he RHS and the.*
fda0: 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f  * RHS contains o
fdb0: 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
fdc0: 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  values..**.** Th
fdd0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
fde0: 61 74 65 73 20 63 6f 64 65 20 77 69 6c 6c 20 6a  ates code will j
fdf0: 75 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c  ump to destIfFal
fe00: 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  se if the LHS is
fe10: 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e   not .** contain
fe20: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
fe30: 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55  S.  If due to NU
fe40: 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  LLs we cannot de
fe50: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c  termine if the L
fe60: 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e  HS.** is contain
fe70: 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68  ed in the RHS th
fe80: 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49  en jump to destI
fe90: 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c  fNull.  If the L
fea0: 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a  HS is contained.
feb0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ** within the RH
fec0: 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  S then fall thro
fed0: 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ugh..*/.static v
fee0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
fef0: 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a  odeIN(.  Parse *
ff00: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
ff10: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
ff20: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
ff30: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
ff40: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
ff50: 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65   /* The IN expre
ff60: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
ff70: 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20  estIfFalse,     
ff80: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
ff90: 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
ffa0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
ffb0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
ffc0: 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a  Null        /* J
ffd0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
ffe0: 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e  results are unkn
fff0: 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  own due to NULLs
10000 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68   */.){.  int rRh
10010 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f  sHasNull = 0;  /
10020 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
10030 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63  is true if RHS c
10040 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
10050 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 61 66  ues */.  char af
10060 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 2f  finity;        /
10070 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66  * Comparison aff
10080 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a  inity to use */.
10090 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20    int eType;    
100a0 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
100b0 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  of the RHS */.  
100c0 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20  int r1;         
100d0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
100e0 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20  ry use register 
100f0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
10100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
10110 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
10120 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
10130 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
10140 52 48 53 2e 20 20 20 41 66 74 65 72 20 74 68 69  RHS.   After thi
10150 73 20 73 74 65 70 2c 20 74 68 65 20 74 61 62 6c  s step, the tabl
10160 65 20 77 69 74 68 20 63 75 72 73 6f 72 0a 20 20  e with cursor.  
10170 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ** pExpr->iTable
10180 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74   will contains t
10190 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
101a0 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 0a  ake up the RHS..
101b0 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73    */.  v = pPars
101c0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
101d0 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
101e0 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65    /* OOM detecte
101f0 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  d prior to this 
10200 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62  routine */.  Vdb
10210 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
10220 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22   "begin IN expr"
10230 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71  ));.  eType = sq
10240 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
10250 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
10260 26 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a  &rRhsHasNull);..
10270 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
10280 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
10290 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
102a0 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
102b0 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ults.  ** of the
102c0 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66   expression. aff
102d0 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20  inityStr stores 
102e0 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
102f0 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a  suitable for.  *
10300 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52  * P4 of OP_MakeR
10310 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66  ecord..  */.  af
10320 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69  finity = compari
10330 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
10340 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74  r);..  /* Code t
10350 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70  he LHS, the <exp
10360 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
10370 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a  IN (...)"..  */.
10380 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
10390 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
103a0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
103b0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
103c0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
103d0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
103e0 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a  r->pLeft, r1);..
103f0 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20    /* If the LHS 
10400 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
10410 65 20 72 65 73 75 6c 74 20 69 73 20 65 69 74 68  e result is eith
10420 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c  er false or NULL
10430 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20   depending.  ** 
10440 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 20 52  on whether the R
10450 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72 20 6e  HS is empty or n
10460 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  ot, respectively
10470 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  ..  */.  if( des
10480 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
10490 61 6c 73 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53  alse ){.    /* S
104a0 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20  hortcut for the 
104b0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
104c0 65 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64 20  e the false and 
104d0 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72  NULL outcomes ar
104e0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  e.    ** the sam
104f0 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
10500 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10510 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65  P_IsNull, r1, de
10520 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c  stIfNull);.  }el
10530 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  se{.    int addr
10540 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
10550 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
10560 75 6c 6c 2c 20 72 31 29 3b 0a 20 20 20 20 73 71  ull, r1);.    sq
10570 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10580 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45  v, OP_Rewind, pE
10590 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
105a0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 73  tIfFalse);.    s
105b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
105c0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
105d0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
105e0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
105f0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
10600 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
10610 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
10620 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
10630 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53  is case, the RHS
10640 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66   is the ROWID of
10650 20 74 61 62 6c 65 20 62 2d 74 72 65 65 0a 20 20   table b-tree.  
10660 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
10670 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10680 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20  _MustBeInt, r1, 
10690 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
106a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
106b0 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
106c0 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  sts, pExpr->iTab
106d0 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
106e0 20 72 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   r1);.  }else{. 
106f0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
10700 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 61  se, the RHS is a
10710 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a  n index b-tree..
10720 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
10730 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
10740 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 31 2c  OP_Affinity, r1,
10750 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79   1, 0, &affinity
10760 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  , 1);..    /* If
10770 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73   the set members
10780 68 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20  hip test fails, 
10790 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
107a0 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22  of the .    ** "
107b0 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72  x IN (...)" expr
107c0 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  ession must be e
107d0 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e  ither 0 or NULL.
107e0 20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20 20   If the set.    
107f0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e  ** contains no N
10800 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e  ULL values, then
10810 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30   the result is 0
10820 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a 20 20  . If the set .  
10830 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e    ** contains on
10840 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
10850 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20  alues, then the 
10860 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
10870 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
10880 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20  is also NULL..  
10890 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 52 68    */.    if( rRh
108a0 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20 64  sHasNull==0 || d
108b0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
108c0 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
108d0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
108e0 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f  uns if it is kno
108f0 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  wn at compile ti
10900 6d 65 20 74 68 61 74 20 74 68 65 20 52 48 53 0a  me that the RHS.
10910 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20        ** cannot 
10920 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c  contain NULL val
10930 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ues. This happen
10940 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a  s as the result.
10950 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e        ** of a "N
10960 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
10970 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  int in the datab
10980 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
10990 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
109a0 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72 61 6e  so run this bran
109b0 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20 65 71  ch if NULL is eq
109c0 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53  uivalent to FALS
109d0 45 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  E.      ** for t
109e0 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 49  his particular I
109f0 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
10a00 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
10a10 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
10a20 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
10a30 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
10a40 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c 20  estIfFalse, r1, 
10a50 31 29 3b 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1);..    }else{.
10a60 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
10a70 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48 53   branch, the RHS
10a80 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68 74   of the IN might
10a90 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20   contain a NULL 
10aa0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  and.      ** the
10ab0 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 4e   presence of a N
10ac0 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20 6d  ULL on the RHS m
10ad0 61 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e 63  akes a differenc
10ae0 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  e in the.      *
10af0 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20  * outcome..     
10b00 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31   */.      int j1
10b10 2c 20 6a 32 2c 20 6a 33 3b 0a 0a 20 20 20 20 20  , j2, j3;..     
10b20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   /* First check 
10b30 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48  to see if the LH
10b40 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  S is contained i
10b50 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 73  n the RHS.  If s
10b60 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  o,.      ** then
10b70 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
10b80 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48   NULLs in the RH
10b90 53 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  S does not matte
10ba0 72 2c 20 73 6f 20 6a 75 6d 70 0a 20 20 20 20 20  r, so jump.     
10bb0 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20   ** over all of 
10bc0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f  the code that fo
10bd0 6c 6c 6f 77 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  llows..      */.
10be0 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
10bf0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
10c00 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
10c10 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72  pr->iTable, 0, r
10c20 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  1, 1);..      /*
10c30 20 48 65 72 65 20 77 65 20 62 65 67 69 6e 20 67   Here we begin g
10c40 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74  enerating code t
10c50 68 61 74 20 72 75 6e 73 20 69 66 20 74 68 65 20  hat runs if the 
10c60 4c 48 53 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  LHS is not.     
10c70 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69   ** contained wi
10c80 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 47  thin the RHS.  G
10c90 65 6e 65 72 61 74 65 20 61 64 64 69 74 69 6f 6e  enerate addition
10ca0 61 6c 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20  al code that.   
10cb0 20 20 20 2a 2a 20 74 65 73 74 73 20 74 68 65 20     ** tests the 
10cc0 52 48 53 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20  RHS for NULLs.  
10cd0 49 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61  If the RHS conta
10ce0 69 6e 73 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a  ins a NULL then.
10cf0 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f        ** jump to
10d00 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66   destIfNull.  If
10d10 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4e 55   there are no NU
10d20 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 74  LLs in the RHS t
10d30 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d  hen.      ** jum
10d40 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65  p to destIfFalse
10d50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10d60 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
10d70 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
10d80 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75  tNull, rRhsHasNu
10d90 6c 6c 29 3b 0a 20 20 20 20 20 20 6a 33 20 3d 20  ll);.      j3 = 
10da0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10db0 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
10dc0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10dd0 20 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c   0, rRhsHasNull,
10de0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
10df0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10e00 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
10e10 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20  rRhsHasNull);.  
10e20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
10e30 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a  umpHere(v, j3);.
10e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10e50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
10e60 64 49 6d 6d 2c 20 72 52 68 73 48 61 73 4e 75 6c  dImm, rRhsHasNul
10e70 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  l, 1);.      sql
10e80 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10e90 28 76 2c 20 6a 32 29 3b 0a 0a 20 20 20 20 20 20  (v, j2);..      
10ea0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 61  /* Jump to the a
10eb0 70 70 72 6f 70 72 69 61 74 65 20 74 61 72 67 65  ppropriate targe
10ec0 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  t depending on w
10ed0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20  hether or not.  
10ee0 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 63      ** the RHS c
10ef0 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 20  ontains a NULL. 
10f00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
10f10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10f20 76 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73 48 61  v, OP_If, rRhsHa
10f30 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  sNull, destIfNul
10f40 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
10f50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10f60 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
10f70 66 46 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20  fFalse);..      
10f80 2f 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20  /* The OP_Found 
10f90 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
10fa0 69 73 20 62 72 61 6e 63 68 20 6a 75 6d 70 73 20  is branch jumps 
10fb0 68 65 72 65 20 77 68 65 6e 20 74 72 75 65 2c 20  here when true, 
10fc0 0a 20 20 20 20 20 20 2a 2a 20 63 61 75 73 69 6e  .      ** causin
10fd0 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e  g the overall IN
10fe0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
10ff0 75 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74  uation to fall t
11000 68 72 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f  hrough..      */
11010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11020 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
11030 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
11040 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
11050 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
11060 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
11070 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
11080 31 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  1);.  VdbeCommen
11090 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78  t((v, "end IN ex
110a0 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  pr"));.}.#endif 
110b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
110c0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
110d0 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38  * Duplicate an 8
110e0 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73  -byte value.*/.s
110f0 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70 38  tatic char *dup8
11100 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63  bytes(Vdbe *v, c
11110 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a  onst char *in){.
11120 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71    char *out = sq
11130 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
11140 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
11150 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74  ), 8);.  if( out
11160 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f   ){.    memcpy(o
11170 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a  ut, in, 8);.  }.
11180 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a    return out;.}.
11190 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
111a0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
111b0 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  INT./*.** Genera
111c0 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
111d0 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
111e0 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  the floating poi
111f0 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63  nt.** value desc
11200 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d  ribed by z[0..n-
11210 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
11220 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iMem..**.** The
11230 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c   z[] string will
11240 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65   probably not be
11250 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
11260 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a  .  But the .** z
11270 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73  [n] character is
11280 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
11290 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  e something that
112a0 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a   does not look.*
112b0 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69  * like the conti
112c0 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  nuation of the n
112d0 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
112e0 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56   void codeReal(V
112f0 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
11300 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74  ar *z, int negat
11310 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  eFlag, int iMem)
11320 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a  {.  if( ALWAYS(z
11330 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62  !=0) ){.    doub
11340 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68  le value;.    ch
11350 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69  ar *zV;.    sqli
11360 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75  te3AtoF(z, &valu
11370 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
11380 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54  30(z), SQLITE_UT
11390 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  F8);.    assert(
113a0 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76   !sqlite3IsNaN(v
113b0 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20  alue) ); /* The 
113c0 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72  new AtoF never r
113d0 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20  eturns NaN */.  
113e0 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67    if( negateFlag
113f0 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
11400 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38  e;.    zV = dup8
11410 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
11420 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c  &value);.    sql
11430 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11440 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d  , OP_Real, 0, iM
11450 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45  em, 0, zV, P4_RE
11460 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  AL);.  }.}.#endi
11470 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  f.../*.** Genera
11480 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
11490 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
114a0 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
114b0 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
114c0 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
114d0 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
114e0 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  .** Expr.u.zToke
114f0 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38  n is always UTF8
11500 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e   and zero-termin
11510 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
11520 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72  void codeInteger
11530 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11540 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
11550 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d   negFlag, int iM
11560 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  em){.  Vdbe *v =
11570 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
11580 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
11590 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
115a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
115b0 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b  pExpr->u.iValue;
115c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
115d0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67  0 );.    if( neg
115e0 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20  Flag ) i = -i;. 
115f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11600 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
11610 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
11620 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63  }else{.    int c
11630 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b  ;.    i64 value;
11640 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11650 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  *z = pExpr->u.zT
11660 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  oken;.    assert
11670 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20  ( z!=0 );.    c 
11680 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  = sqlite3Atoi64(
11690 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74  z, &value, sqlit
116a0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53  e3Strlen30(z), S
116b0 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
116c0 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d   if( c==0 || (c=
116d0 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29  =2 && negFlag) )
116e0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  {.      char *zV
116f0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46  ;.      if( negF
11700 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63  lag ){ value = c
11710 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  ==2 ? SMALLEST_I
11720 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d  NT64 : -value; }
11730 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38  .      zV = dup8
11740 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
11750 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73  &value);.      s
11760 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11770 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
11780 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34   iMem, 0, zV, P4
11790 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
117a0 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
117b0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
117c0 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
117d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
117e0 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
117f0 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
11800 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
11810 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20  ", z);.#else.   
11820 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a     codeReal(v, z
11830 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29  , negFlag, iMem)
11840 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
11850 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61   }.}../*.** Clea
11860 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e  r a cache entry.
11870 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11880 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
11890 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
118a0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
118b0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65  *p){.  if( p->te
118c0 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28  mpReg ){.    if(
118d0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
118e0 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
118f0 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
11900 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
11910 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
11920 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d  nTempReg++] = p-
11930 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  >iReg;.    }.   
11940 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
11950 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  .  }.}.../*.** R
11960 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c  ecord in the col
11970 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20 61  umn cache that a
11980 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75   particular colu
11990 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72  mn from a.** par
119a0 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73  ticular table is
119b0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72   stored in a par
119c0 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72  ticular register
119d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
119e0 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
119f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
11a00 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f  nt iTab, int iCo
11a10 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  l, int iReg){.  
11a20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e  int i;.  int min
11a30 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72  Lru;.  int idxLr
11a40 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  u;.  struct yCol
11a50 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73  Cache *p;..  ass
11a60 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20 20  ert( iReg>0 );  
11a70 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d 62  /* Register numb
11a80 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70  ers are always p
11a90 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73 73  ositive */.  ass
11aa0 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26  ert( iCol>=-1 &&
11ab0 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20   iCol<32768 );  
11ac0 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e  /* Finite column
11ad0 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f   numbers */..  /
11ae0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c  * The SQLITE_Col
11af0 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69  umnCache flag di
11b00 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d  sables the colum
11b10 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69  n cache.  This i
11b20 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20  s used.  ** for 
11b30 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74  testing only - t
11b40 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51  o verify that SQ
11b50 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73  Lite always gets
11b60 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72   the same answer
11b70 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77  .  ** with and w
11b80 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d  ithout the colum
11b90 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  n cache..  */.  
11ba0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
11bb0 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d  Disabled(pParse-
11bc0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75  >db, SQLITE_Colu
11bd0 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72  mnCache) ) retur
11be0 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72  n;..  /* First r
11bf0 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
11c00 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a  ing entry..  **.
11c10 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
11c20 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d  he way the colum
11c30 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65  n cache is curre
11c40 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72  ntly used, we ar
11c50 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a  e guaranteed.  *
11c60 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63  * that the objec
11c70 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72  t will never alr
11c80 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65  eady be in cache
11c90 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67  .  Verify this g
11ca0 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23  uarantee..  */.#
11cb0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
11cc0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
11cd0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
11ce0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
11cf0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
11d00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65    assert( p->iRe
11d10 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c  g==0 || p->iTabl
11d20 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43  e!=iTab || p->iC
11d30 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20  olumn!=iCol );. 
11d40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
11d50 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c  Find an empty sl
11d60 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69  ot and replace i
11d70 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  t */.  for(i=0, 
11d80 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
11d90 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
11da0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
11db0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
11dc0 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iReg==0 ){.     
11dd0 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
11de0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
11df0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c  ;.      p->iTabl
11e00 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  e = iTab;.      
11e10 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
11e20 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  l;.      p->iReg
11e30 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70   = iReg;.      p
11e40 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
11e50 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
11e60 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
11e70 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  +;.      return;
11e80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11e90 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73   Replace the las
11ea0 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20  t recently used 
11eb0 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78  */.  minLru = 0x
11ec0 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c  7fffffff;.  idxL
11ed0 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69  ru = -1;.  for(i
11ee0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
11ef0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
11f00 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
11f10 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
11f20 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29   p->lru<minLru )
11f30 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d  {.      idxLru =
11f40 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75   i;.      minLru
11f50 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d   = p->lru;.    }
11f60 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59  .  }.  if( ALWAY
11f70 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a  S(idxLru>=0) ){.
11f80 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
11f90 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72  >aColCache[idxLr
11fa0 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65  u];.    p->iLeve
11fb0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
11fc0 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e  heLevel;.    p->
11fd0 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
11fe0 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
11ff0 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65  iCol;.    p->iRe
12000 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d  g = iReg;.    p-
12010 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
12020 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
12030 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
12040 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
12050 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
12060 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73  e that registers
12070 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69   between iReg..i
12080 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62  Reg+nReg-1 are b
12090 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
120a0 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72  ..** Purge the r
120b0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
120c0 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  s from the colum
120d0 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64  n cache..*/.void
120e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
120f0 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70  eRemove(Parse *p
12100 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
12110 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
12120 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74  t i;.  int iLast
12130 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d   = iReg + nReg -
12140 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   1;.  struct yCo
12150 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
12160 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
12170 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
12180 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
12190 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
121a0 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
121b0 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20      if( r>=iReg 
121c0 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20  && r<=iLast ){. 
121d0 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
121e0 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
121f0 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
12200 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
12210 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
12220 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
12230 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74  mn cache context
12240 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69  .  Any new entri
12250 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65  es added.** adde
12260 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d to the column 
12270 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
12280 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65   call are remove
12290 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  d when the.** co
122a0 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20  rresponding pop 
122b0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
122c0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
122d0 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
122e0 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69  se){.  pParse->i
122f0 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a  CacheLevel++;.}.
12300 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72  ./*.** Remove fr
12310 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
12320 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  che any entries 
12330 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20  that were added 
12340 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65  since the.** the
12350 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75 73 68   previous N Push
12360 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 6e   operations.  In
12370 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
12380 73 74 6f 72 65 20 74 68 65 20 63 61 63 68 65 0a  store the cache.
12390 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  ** to the state 
123a0 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75 73 68  it was in N Push
123b0 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20  es ago..*/.void 
123c0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
123d0 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
123e0 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  e, int N){.  int
123f0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
12400 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73  lCache *p;.  ass
12410 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61 73  ert( N>0 );.  as
12420 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43  sert( pParse->iC
12430 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a  acheLevel>=N );.
12440 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
12450 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f  Level -= N;.  fo
12460 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
12470 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
12480 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
12490 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
124a0 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70  if( p->iReg && p
124b0 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d  ->iLevel>pParse-
124c0 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a  >iCacheLevel ){.
124d0 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
124e0 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
124f0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
12500 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
12510 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63  ../*.** When a c
12520 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  ached column is 
12530 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72  reused, make sur
12540 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73  e that its regis
12550 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e  ter is.** no lon
12560 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73  ger available as
12570 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72   a temp register
12580 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a  .  ticket #3879:
12590 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72    that same.** r
125a0 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65  egister might be
125b0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e   in the cache in
125c0 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
125d0 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a  , so be sure to.
125e0 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e  ** get them all.
125f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12600 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12610 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73  PinRegister(Pars
12620 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
12630 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
12640 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
12650 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
12660 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
12670 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
12680 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
12690 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
126a0 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
126b0 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
126c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
126d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
126e0 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74   code to extract
126f0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
12700 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
12710 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a   of a table..*/.
12720 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
12730 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
12740 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c  able(.  Vdbe *v,
12750 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
12760 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  DBE under constr
12770 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c  uction */.  Tabl
12780 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54  e *pTab,    /* T
12790 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
127a0 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f  ing the value */
127b0 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
127c0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
127d0 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
127e0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
127f0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
12800 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65   the column to e
12810 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20  xtract */.  int 
12820 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45  regOut      /* E
12830 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 64  xtract the valud
12840 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
12850 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ter */.){.  if( 
12860 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d  iCol<0 || iCol==
12870 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
12880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12890 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
128a0 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75  , iTabCur, regOu
128b0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
128c0 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74   int op = IsVirt
128d0 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56  ual(pTab) ? OP_V
128e0 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75  Column : OP_Colu
128f0 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  mn;.    sqlite3V
12900 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
12910 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20   iTabCur, iCol, 
12920 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69  regOut);.  }.  i
12930 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
12940 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44    sqlite3ColumnD
12950 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20  efault(v, pTab, 
12960 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  iCol, regOut);. 
12970 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
12980 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
12990 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20  ill extract the 
129a0 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
129b0 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20  n from.** table 
129c0 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74  pTab and store t
129d0 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
129e0 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  in a register.  
129f0 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20  An effort.** is 
12a00 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  made to store th
12a10 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
12a20 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2c  n register iReg,
12a30 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a 20   but this is.** 
12a40 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e 20  not guaranteed. 
12a50 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
12a60 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
12a70 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
12a80 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
12a90 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  be an open curso
12aa0 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61  r to pTab in iTa
12ab0 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ble when this ro
12ac0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
12ad0 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c  ed.  If iColumn<
12ae0 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67  0 then code is g
12af0 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78  enerated that ex
12b00 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64  tracts the rowid
12b10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12b20 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
12b30 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
12b40 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
12b50 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
12b60 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
12b70 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
12b80 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
12b90 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
12ba0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
12bb0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
12bc0 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
12bd0 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
12be0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
12bf0 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
12c00 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
12c10 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
12c20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
12c30 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
12c40 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
12c50 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20   u8 p5          
12c60 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f    /* P5 value fo
12c70 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29  r OP_Column */.)
12c80 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
12c90 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
12ca0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
12cb0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
12cc0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
12cd0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
12ce0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
12cf0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
12d00 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20    if( p->iReg>0 
12d10 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  && p->iTable==iT
12d20 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  able && p->iColu
12d30 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  mn==iColumn ){. 
12d40 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
12d50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
12d60 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
12d70 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69  ExprCachePinRegi
12d80 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e  ster(pParse, p->
12d90 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74  iReg);.      ret
12da0 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  urn p->iReg;.   
12db0 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72   }.  }  .  asser
12dc0 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c  t( v!=0 );.  sql
12dd0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
12de0 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
12df0 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43  pTab, iTable, iC
12e00 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
12e10 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71  if( p5 ){.    sq
12e20 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
12e30 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73  5(v, p5);.  }els
12e40 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65  e{   .    sqlite
12e50 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
12e60 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20  pParse, iTable, 
12e70 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
12e80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
12e90 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  g;.}../*.** Clea
12ea0 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63  r all column cac
12eb0 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76  he entries..*/.v
12ec0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
12ed0 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20  acheClear(Parse 
12ee0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
12ef0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
12f00 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72  Cache *p;..  for
12f10 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
12f20 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
12f30 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
12f40 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
12f50 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20  f( p->iReg ){.  
12f60 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
12f70 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
12f80 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
12f90 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
12fa0 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
12fb0 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66   fact that an af
12fc0 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61  finity change ha
12fd0 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43  s occurred on iC
12fe0 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  ount.** register
12ff0 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
13000 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20  iStart..*/.void 
13010 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
13020 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50  AffinityChange(P
13030 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
13040 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43  t iStart, int iC
13050 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  ount){.  sqlite3
13060 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
13070 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20  pParse, iStart, 
13080 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCount);.}../*.*
13090 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
130a0 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
130b0 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
130c0 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
130d0 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
130e0 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20  To..iTo+nReg-1. 
130f0 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Keep the column 
13100 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65  cache up-to-date
13110 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13120 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
13130 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
13140 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
13150 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
13160 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
13170 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73  olCache *p;.  as
13180 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f  sert( iFrom>=iTo
13190 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e  +nReg || iFrom+n
131a0 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71  Reg<=iTo );.  sq
131b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
131c0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
131d0 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
131e0 54 6f 2c 20 6e 52 65 67 2d 31 29 3b 0a 20 20 66  To, nReg-1);.  f
131f0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
13200 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
13210 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
13220 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
13230 20 69 6e 74 20 78 20 3d 20 70 2d 3e 69 52 65 67   int x = p->iReg
13240 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 69 46 72  ;.    if( x>=iFr
13250 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52  om && x<iFrom+nR
13260 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  eg ){.      p->i
13270 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d  Reg += iTo-iFrom
13280 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
13290 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
132a0 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
132b0 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
132c0 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  AGE_TEST)./*.** 
132d0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
132e0 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  ny register in t
132f0 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e  he range iFrom..
13300 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a  iTo (inclusive).
13310 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ** is used as pa
13320 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  rt of the column
13330 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
13340 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
13350 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ed within assert
13360 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28  () and testcase(
13370 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a  ) macros only.**
13380 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70   and does not ap
13390 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c  pear in a normal
133a0 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
133b0 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75  c int usedAsColu
133c0 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  mnCache(Parse *p
133d0 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
133e0 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e  , int iTo){.  in
133f0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
13400 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
13410 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
13420 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
13430 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
13440 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
13450 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
13460 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f  .    if( r>=iFro
13470 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65  m && r<=iTo ) re
13480 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f  turn 1;    /*NO_
13490 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  TEST*/.  }.  ret
134a0 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
134b0 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
134c0 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  || SQLITE_COVERA
134d0 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a  GE_TEST */../*.*
134e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
134f0 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
13500 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
13510 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
13520 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65  xpression.  Atte
13530 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  mpt to store the
13540 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
13550 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a  ster "target"..*
13560 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
13570 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75  ister where resu
13580 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  lts are stored..
13590 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20  **.** With this 
135a0 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69  routine, there i
135b0 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74  s no guarantee t
135c0 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c  hat results will
135d0 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e  .** be stored in
135e0 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
135f0 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74  sult might be st
13600 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68  ored in some oth
13610 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  er.** register i
13620 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65  f it is convenie
13630 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68  nt to do so.  Th
13640 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
13650 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b  on.** must check
13660 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
13670 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65   and move the re
13680 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73  sults to the des
13690 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72  ired.** register
136a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
136b0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50  ExprCodeTarget(P
136c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
136d0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
136e0 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
136f0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
13700 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e  e;  /* The VM un
13710 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
13720 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
13730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13740 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65  /* The opcode be
13750 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
13760 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65  nt inReg = targe
13770 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  t;       /* Resu
13780 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lts stored in re
13790 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a  gister inReg */.
137a0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
137b0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
137c0 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
137d0 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
137e0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
137f0 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20   regFree2 = 0;  
13800 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
13810 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
13820 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
13830 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  er */.  int r1, 
13840 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20  r2, r3, r4;     
13850 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67    /* Various reg
13860 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f  ister numbers */
13870 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
13880 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20   pParse->db; /* 
13890 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
138a0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73  nection */..  as
138b0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
138c0 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
138d0 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
138e0 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  v==0 ){.    asse
138f0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
13900 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
13910 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
13920 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  }..  if( pExpr==
13930 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
13940 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
13950 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
13960 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
13970 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
13980 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
13990 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
139a0 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
139b0 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
139c0 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
139d0 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
139e0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
139f0 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
13a00 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
13a10 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
13a20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13a30 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
13a40 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
13a50 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20  Col->iMem;.     
13a60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13a70 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
13a80 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
13a90 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
13aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13ab0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
13ac0 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
13ad0 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  xPTab,.         
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13af0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
13b00 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
13b10 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
13b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13b30 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  /* Otherwise, fa
13b40 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
13b50 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20   TK_COLUMN case 
13b60 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
13b70 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
13b80 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20       int iTab = 
13b90 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
13ba0 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20       if( iTab<0 
13bb0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
13bc0 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20  Parse->ckBase>0 
13bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
13be0 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43 4b  Generating CHECK
13bf0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20   constraints or 
13c00 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 70  inserting into p
13c10 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a  artial index */.
13c20 20 20 20 20 20 20 20 20 20 20 69 6e 52 65 67 20            inReg 
13c30 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
13c40 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73   + pParse->ckBas
13c50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  e;.          bre
13c60 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
13c70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
13c80 44 65 6c 65 74 69 6e 67 20 66 72 6f 6d 20 61 20  Deleting from a 
13c90 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f  partial index */
13ca0 0a 20 20 20 20 20 20 20 20 20 20 69 54 61 62 20  .          iTab 
13cb0 3d 20 70 50 61 72 73 65 2d 3e 69 50 61 72 74 49  = pParse->iPartI
13cc0 64 78 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d  dxTab;.        }
13cd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13ce0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
13cf0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
13d00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
13d10 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d30 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
13d40 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74  mn, iTab, target
13d50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20   pExpr->op2);.  
13d80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13d90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
13da0 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
13db0 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
13dc0 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
13dd0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
13de0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
13df0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
13e00 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63  TING_POINT.    c
13e10 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
13e20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
13e30 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
13e40 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
13e50 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  e) );.      code
13e60 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75  Real(v, pExpr->u
13e70 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67  .zToken, 0, targ
13e80 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
13e90 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
13ea0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
13eb0 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
13ec0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
13ed0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
13ee0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
13ef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13f00 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
13f10 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  , 0, target, 0, 
13f20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
13f30 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
13f40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13f50 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
13f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13f70 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
13f80 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
13f90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
13fa0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13fb0 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
13fc0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
13fd0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
13fe0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
13ff0 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72  r *z;.      char
14000 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61   *zBlob;.      a
14010 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
14020 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
14030 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
14040 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
14050 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
14060 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75  ='x' || pExpr->u
14070 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20  .zToken[0]=='X' 
14080 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14090 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
140a0 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [1]=='\'' );.   
140b0 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75     z = &pExpr->u
140c0 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20  .zToken[2];.    
140d0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
140e0 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20  len30(z) - 1;.  
140f0 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d      assert( z[n]
14100 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
14110 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48  zBlob = sqlite3H
14120 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33  exToBlob(sqlite3
14130 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29  VdbeDb(v), z, n)
14140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14150 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14160 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65  Blob, n/2, targe
14170 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f  t, 0, zBlob, P4_
14180 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
14190 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
141a0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
141b0 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
141c0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
141d0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
141e0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
141f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14200 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21  pExpr->u.zToken!
14210 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
14220 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
14230 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ken[0]!=0 );.   
14240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14250 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61  dOp2(v, OP_Varia
14260 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
14270 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
14280 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75      if( pExpr->u
14290 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b  .zToken[1]!=0 ){
142a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
142b0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
142c0 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20 20 20  [0]=='?' .      
142d0 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70         || strcmp
142e0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
142f0 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  , pParse->azVar[
14300 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31  pExpr->iColumn-1
14310 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ])==0 );.       
14320 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
14330 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50 61 72  geP4(v, -1, pPar
14340 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d  se->azVar[pExpr-
14350 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f  >iColumn-1], P4_
14360 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
14370 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14380 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14390 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
143a0 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
143b0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62  >iTable;.      b
143c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
143d0 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20  case TK_AS: {.  
143e0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
143f0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
14400 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
14410 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
14420 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14430 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
14440 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20  TE_OMIT_CAST.   
14450 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b   case TK_CAST: {
14460 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
14470 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
14480 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20  m:   CAST(pLeft 
14490 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20  AS token) */.   
144a0 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f     int aff, to_o
144b0 70 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  p;.      inReg =
144c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
144d0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
144e0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
144f0 67 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  get);.      asse
14500 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
14510 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
14520 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
14530 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41    aff = sqlite3A
14540 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
14550 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
14560 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20      to_op = aff 
14570 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  - SQLITE_AFF_TEX
14580 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20  T + OP_ToText;. 
14590 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
145a0 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20  op==OP_ToText   
145b0 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
145c0 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20  AFF_TEXT    );. 
145d0 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
145e0 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20  op==OP_ToBlob   
145f0 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
14600 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20  AFF_NONE    );. 
14610 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
14620 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63  op==OP_ToNumeric
14630 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
14640 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
14650 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
14660 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20  op==OP_ToInt    
14670 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
14680 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  AFF_INTEGER );. 
14690 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
146a0 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20  op==OP_ToReal   
146b0 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
146c0 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20  AFF_REAL    );. 
146d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
146e0 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20  o_op==OP_ToText 
146f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14700 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42  e( to_op==OP_ToB
14710 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73  lob );.      tes
14720 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
14730 5f 54 6f 4e 75 6d 65 72 69 63 20 29 3b 0a 20 20  _ToNumeric );.  
14740 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
14750 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b  _op==OP_ToInt );
14760 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14770 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61   to_op==OP_ToRea
14780 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  l );.      if( i
14790 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a  nReg!=target ){.
147a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
147b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
147c0 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
147d0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  rget);.        i
147e0 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
147f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
14800 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14810 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b  , to_op, inReg);
14820 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14830 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
14840 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  he(pParse, inReg
14850 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20  , inReg) );.    
14860 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
14870 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
14880 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
14890 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
148a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
148b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
148c0 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
148d0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
148e0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
148f0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
14900 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
14910 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
14920 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  _EQ: {.      ass
14930 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  ert( TK_LT==OP_L
14940 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
14950 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20  t( TK_LE==OP_Le 
14960 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14970 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b   TK_GT==OP_Gt );
14980 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14990 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  K_GE==OP_Ge );. 
149a0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
149b0 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  EQ==OP_Eq );.   
149c0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45     assert( TK_NE
149d0 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
149e0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
149f0 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
14a00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
14a10 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
14a20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29  ase( op==TK_GT )
14a30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14a40 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ( op==TK_GE );. 
14a50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14a60 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
14a70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14a80 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 72  TK_NE );.      r
14a90 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
14aa0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
14ab0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
14ac0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
14ad0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
14ae0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14af0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
14b00 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
14b10 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
14b20 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14b30 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
14b40 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
14b50 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
14b60 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
14b70 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 74  TOREP2);.      t
14b80 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
14b90 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
14ba0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
14bb0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
14bc0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14bd0 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
14be0 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
14bf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14c00 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
14c10 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14c20 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
14c30 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
14c40 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
14c50 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
14c60 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
14c70 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
14c80 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
14c90 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
14ca0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
14cb0 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
14cc0 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
14cd0 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64  TK_NE;.      cod
14ce0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
14cf0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
14d00 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
14d10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14d20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
14d30 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
14d40 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  2 | SQLITE_NULLE
14d50 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  Q);.      testca
14d60 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
14d70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14d80 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
14d90 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14da0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14db0 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
14dc0 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
14dd0 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
14de0 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
14df0 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
14e00 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
14e10 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
14e20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
14e30 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
14e40 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
14e50 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
14e60 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
14e70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
14e80 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
14e90 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
14ea0 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
14eb0 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f  ert( TK_OR==OP_O
14ec0 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
14ed0 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
14ee0 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  dd );.      asse
14ef0 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
14f00 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20  _Subtract );.   
14f10 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45     assert( TK_RE
14f20 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20  M==OP_Remainder 
14f30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14f40 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42   TK_BITAND==OP_B
14f50 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61  itAnd );.      a
14f60 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d  ssert( TK_BITOR=
14f70 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20  =OP_BitOr );.   
14f80 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c     assert( TK_SL
14f90 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29  ASH==OP_Divide )
14fa0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14fb0 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_LSHIFT==OP_Sh
14fc0 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  iftLeft );.     
14fd0 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49   assert( TK_RSHI
14fe0 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  FT==OP_ShiftRigh
14ff0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
15000 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50  t( TK_CONCAT==OP
15010 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20  _Concat );.     
15020 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15030 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74  K_AND );.      t
15040 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15050 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OR );.      test
15060 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55  case( op==TK_PLU
15070 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
15080 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55  ase( op==TK_MINU
15090 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
150a0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20  ase( op==TK_REM 
150b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
150c0 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44  e( op==TK_BITAND
150d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
150e0 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52  se( op==TK_BITOR
150f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15100 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48  se( op==TK_SLASH
15110 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15120 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46  se( op==TK_LSHIF
15130 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
15140 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49  ase( op==TK_RSHI
15150 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  FT );.      test
15160 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e  case( op==TK_CON
15170 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  CAT );.      r1 
15180 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15190 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
151a0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
151b0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
151c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
151d0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
151e0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
151f0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
15200 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15210 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c  3(v, op, r2, r1,
15220 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15230 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
15240 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
15250 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
15260 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
15270 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15280 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
15290 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
152a0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
152b0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
152c0 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20   pLeft );.      
152d0 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
152e0 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
152f0 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
15300 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
15310 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e  1, target);.#ifn
15320 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15330 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
15340 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
15350 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
15360 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  AT ){.        as
15370 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
15380 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
15390 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
153a0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
153b0 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  , pLeft->u.zToke
153c0 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23  n, 1, target);.#
153d0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
153e0 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  e{.        regFr
153f0 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c 69 74  ee1 = r1 = sqlit
15400 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
15410 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
15420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15430 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
15440 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 72  , r1);.        r
15450 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
15460 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
15470 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
15480 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
15490 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
154a0 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
154b0 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
154c0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  et);.        tes
154d0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
154e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
154f0 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
15500 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
15510 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15520 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
15530 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
15540 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
15550 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
15560 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15570 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
15580 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15590 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f  se( op==TK_BITNO
155a0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
155b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  ase( op==TK_NOT 
155c0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
155d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
155e0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
155f0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
15600 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
15610 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
15620 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
15630 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73   target;.      s
15640 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15650 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65  (v, op, r1, inRe
15660 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
15670 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15680 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
15690 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
156a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
156b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
156c0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
156d0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Null );.      as
156e0 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
156f0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
15700 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15710 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
15720 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15730 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
15740 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15750 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15760 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
15770 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  get);.      r1 =
15780 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15790 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
157a0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
157b0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
157c0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
157d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
157e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
157f0 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b  dOp1(v, op, r1);
15800 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15810 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
15820 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d  ddImm, target, -
15830 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
15840 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
15850 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72   addr);.      br
15860 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15870 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
15880 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  ION: {.      Agg
15890 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45  Info *pInfo = pE
158a0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
158b0 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d       if( pInfo==
158c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
158d0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
158e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
158f0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
15900 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15910 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
15920 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
15930 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d  e: %s()", pExpr-
15940 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
15950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15960 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e   inReg = pInfo->
15970 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67  aFunc[pExpr->iAg
15980 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  g].iMem;.      }
15990 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
159a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
159b0 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20  CONST_FUNC:.    
159c0 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
159d0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
159e0 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20  st *pFarg;      
159f0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63   /* List of func
15a00 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
15a10 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72  /.      int nFar
15a20 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
15a30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63  * Number of func
15a40 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
15a50 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  /.      FuncDef 
15a60 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f  *pDef;         /
15a70 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  * The function d
15a80 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74  efinition object
15a90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49   */.      int nI
15aa0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
15ab0 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
15ac0 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
15ad0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
15ae0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
15af0 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
15b00 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
15b10 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  .      int const
15b20 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Mask = 0;     /*
15b30 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f   Mask of functio
15b40 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74  n arguments that
15b50 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f   are constant */
15b60 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15b80 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
15b90 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
15ba0 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a  ENC(db);      /*
15bb0 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   The text encodi
15bc0 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ng used by this 
15bd0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
15be0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
15bf0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f   = 0;    /* A co
15c00 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
15c10 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
15c20 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
15c30 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
15c40 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
15c50 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15c60 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29 3b  TK_CONST_FUNC );
15c70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15c80 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e   op==TK_FUNCTION
15c90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
15ca0 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
15cb0 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
15cc0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
15cd0 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20   pFarg = 0;.    
15ce0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15cf0 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e   pFarg = pExpr->
15d00 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d  x.pList;.      }
15d10 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70  .      nFarg = p
15d20 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45  Farg ? pFarg->nE
15d30 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61  xpr : 0;.      a
15d40 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
15d50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
15d60 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
15d70 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72       zId = pExpr
15d80 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
15d90 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53    nId = sqlite3S
15da0 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20  trlen30(zId);.  
15db0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
15dc0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
15dd0 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 46 61  b, zId, nId, nFa
15de0 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20  rg, enc, 0);.   
15df0 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
15e00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15e10 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15e20 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74  , "unknown funct
15e30 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e 49  ion: %.*s()", nI
15e40 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
15e50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15e60 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70  .      /* Attemp
15e70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65  t a direct imple
15e80 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
15e90 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53   built-in COALES
15ea0 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  CE() and.      *
15eb0 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74  * IFNULL() funct
15ec0 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69  ions.  This avoi
15ed0 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65  ds unnecessary e
15ee0 76 61 6c 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20  valation of.    
15ef0 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70    ** arguments p
15f00 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f  ast the first no
15f10 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  n-NULL argument.
15f20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15f30 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
15f40 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
15f50 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
15f60 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
15f70 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
15f80 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15f90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15fa0 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20   nFarg>=2 );.   
15fb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15fc0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
15fd0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
15fe0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
15ff0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72   for(i=1; i<nFar
16000 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
16010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16020 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
16030 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43  ll, target, endC
16040 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
16050 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16060 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
16070 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20  e, target, 1);. 
16080 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16090 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
160a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
160b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
160c0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
160d0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[i].pExpr, targ
160e0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  et);.          s
160f0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
16100 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
16110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16120 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
16130 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
16140 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
16150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
16160 0a 0a 0a 20 20 20 20 20 20 69 66 28 20 70 46 61  ...      if( pFa
16170 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 31  rg ){.        r1
16180 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16190 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
161a0 46 61 72 67 29 3b 0a 0a 20 20 20 20 20 20 20 20  Farg);..        
161b0 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20  /* For length() 
161c0 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e  and typeof() fun
161d0 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f  ctions with a co
161e0 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20  lumn argument,. 
161f0 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68         ** set th
16200 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74  e P5 parameter t
16210 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  o the OP_Column 
16220 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47  opcode to OPFLAG
16230 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20  _LENGTHARG.     
16240 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f     ** or OPFLAG_
16250 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63  TYPEOFARG respec
16260 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64  tively, to avoid
16270 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74   unnecessary dat
16280 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61  a.        ** loa
16290 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ding..        */
162a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
162b0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
162c0 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e  (SQLITE_FUNC_LEN
162d0 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  GTH|SQLITE_FUNC_
162e0 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20  TYPEOF))!=0 ){. 
162f0 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72           u8 expr
16300 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  Op;.          as
16310 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
16320 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
16330 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rt( pFarg->a[0].
16340 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
16350 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70        exprOp = p
16360 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
16370 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  ->op;.          
16380 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43  if( exprOp==TK_C
16390 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d  OLUMN || exprOp=
163a0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
163b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
163c0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
163d0 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47  C_LENGTH==OPFLAG
163e0 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
163f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
16400 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  ( SQLITE_FUNC_TY
16410 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50  PEOF==OPFLAG_TYP
16420 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20  EOFARG );.      
16430 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16440 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
16450 26 7e 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e  &~SQLITE_FUNC_EN
16460 43 4d 41 53 4b 29 0a 20 20 20 20 20 20 20 20 20  CMASK).         
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d                ==
16480 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
16490 54 48 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TH );.          
164a0 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45    pFarg->a[0].pE
164b0 78 70 72 2d 3e 6f 70 32 20 3d 20 70 44 65 66 2d  xpr->op2 = pDef-
164c0 3e 66 75 6e 63 46 6c 61 67 73 26 7e 53 51 4c 49  >funcFlags&~SQLI
164d0 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 3b  TE_FUNC_ENCMASK;
164e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
164f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
16500 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16510 50 75 73 68 28 70 50 61 72 73 65 29 3b 20 20 20  Push(pParse);   
16520 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32    /* Ticket 2ea2
16530 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20  425d34be */.    
16540 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16550 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
16560 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 31  se, pFarg, r1, 1
16570 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16580 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
16590 50 61 72 73 65 2c 20 31 29 3b 20 20 20 2f 2a 20  Parse, 1);   /* 
165a0 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33  Ticket 2ea2425d3
165b0 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  4be */.      }el
165c0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
165d0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
165e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
165f0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
16600 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f     /* Possibly o
16610 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63  verload the func
16620 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73  tion if the firs
16630 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20  t argument is.  
16640 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c      ** a virtual
16650 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20   table column.. 
16660 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16670 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74   For infix funct
16680 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42  ions (LIKE, GLOB
16690 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41  , REGEXP, and MA
166a0 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20  TCH) use the.   
166b0 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67     ** second arg
166c0 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66  ument, not the f
166d0 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67  irst, as the arg
166e0 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f  ument to test to
166f0 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66  .      ** see if
16700 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20   it is a column 
16710 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
16720 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e  le.  This is don
16730 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20  e because.      
16740 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  ** the left oper
16750 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e  and of infix fun
16760 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72  ctions (the oper
16770 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20  and we want to. 
16780 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20       ** control 
16790 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64  overloading) end
167a0 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f  s up as the seco
167b0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
167c0 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  he.      ** func
167d0 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65  tion.  The expre
167e0 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22  ssion "A glob B"
167f0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
16800 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f  o .      ** "glo
16810 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74  b(B,A).  We want
16820 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e   to use the A in
16830 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74   "A glob B" to t
16840 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  est.      ** for
16850 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f   function overlo
16860 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75  ading.  But we u
16870 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e  se the B term in
16880 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20   "glob(B,A)"..  
16890 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
168a0 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45   nFarg>=2 && (pE
168b0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
168c0 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20  InfixFunc) ){.  
168d0 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
168e0 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
168f0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
16900 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
16910 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
16920 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
16930 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  arg>0 ){.       
16940 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
16950 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
16960 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46  ion(db, pDef, nF
16970 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  arg, pFarg->a[0]
16980 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
16990 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
169a0 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20  r(i=0; i<nFarg; 
169b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
169c0 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65  ( i<32 && sqlite
169d0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
169e0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
169f0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
16a00 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c  constMask |= (1<
16a10 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <i);.        }. 
16a20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
16a30 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
16a40 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
16a50 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c  LL)!=0 && !pColl
16a60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
16a70 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
16a80 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
16a90 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
16aa0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
16ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16ac0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
16ad0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
16ae0 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
16af0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
16b00 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
16b10 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20  tColl; .        
16b20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16b30 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
16b40 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20   0, 0, 0, (char 
16b50 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
16b60 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SEQ);.      }.  
16b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16b80 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63  ddOp4(v, OP_Func
16b90 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c  tion, constMask,
16ba0 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20   r1, target,.   
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bc0 20 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66       (char*)pDef
16bd0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
16be0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16bf0 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
16c00 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66  nFarg);.      if
16c10 28 20 6e 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( nFarg ){.     
16c20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16c30 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
16c40 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20  e, r1, nFarg);. 
16c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
16c60 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
16c70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
16c80 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
16c90 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
16ca0 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
16cb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16cc0 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29   op==TK_EXISTS )
16cd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16ce0 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
16cf0 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
16d00 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
16d10 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
16d20 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  xpr, 0, 0);.    
16d30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16d40 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
16d50 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
16d60 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
16d70 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
16d80 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
16d90 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
16da0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
16db0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16dc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16dd0 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
16de0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16df0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
16e00 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46  , pExpr, destIfF
16e10 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c  alse, destIfNull
16e20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16e30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16e40 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
16e50 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
16e60 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
16e70 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c  bel(v, destIfFal
16e80 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
16e90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16ea0 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
16eb0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
16ec0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
16ed0 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
16ee0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
16ef0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
16f00 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
16f10 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20  BQUERY */...    
16f20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42  /*.    **    x B
16f30 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
16f40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
16f50 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
16f60 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  to.    **.    **
16f70 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
16f80 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
16f90 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  X is stored in p
16fa0 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
16fb0 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20   ** Y is stored 
16fc0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
16fd0 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[0].pExpr..   
16fe0 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20   ** Z is stored 
16ff0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
17000 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[1].pExpr..   
17010 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
17020 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
17030 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
17040 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
17050 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
17060 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20  st_item *pLItem 
17070 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
17080 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ->a;.      Expr 
17090 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d  *pRight = pLItem
170a0 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20  ->pExpr;..      
170b0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
170c0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
170d0 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65   pLeft, &regFree
170e0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
170f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17100 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  mp(pParse, pRigh
17110 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
17120 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17130 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
17140 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
17150 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
17160 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47     r3 = sqlite3G
17170 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
17180 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71  );.      r4 = sq
17190 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
171a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63  pParse);.      c
171b0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
171c0 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
171d0 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20  , OP_Ge,.       
171e0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
171f0 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54  2, r3, SQLITE_ST
17200 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c  OREP2);.      pL
17210 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52  Item++;.      pR
17220 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
17230 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
17240 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17250 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
17260 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e2);.      r2 = 
17270 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
17280 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67  emp(pParse, pRig
17290 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
172a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
172b0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
172c0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
172d0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
172e0 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72  pRight, OP_Le, r
172f0 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54  1, r2, r4, SQLIT
17300 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
17310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17320 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72  Op3(v, OP_And, r
17330 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a  3, r4, target);.
17340 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
17350 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
17360 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73  se, r3);.      s
17370 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17380 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 34 29  pReg(pParse, r4)
17390 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
173a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
173b0 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63  _COLLATE: .    c
173c0 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
173d0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
173e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
173f0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
17400 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
17410 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17420 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
17430 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20  TK_TRIGGER: {.  
17440 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
17450 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47  code is TK_TRIGG
17460 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ER, then the exp
17470 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66  ression is a ref
17480 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20  erence.      ** 
17490 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  to a column in t
174a0 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e  he new.* or old.
174b0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20  * pseudo-tables 
174c0 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20  available to.   
174d0 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72     ** trigger pr
174e0 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20  ograms. In this 
174f0 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65  case Expr.iTable
17500 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
17510 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
17520 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
17530 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f  , or 0 for the o
17540 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
17550 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a  e. Expr.iColumn.
17560 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
17570 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  to the column of
17580 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
17590 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f  e to read, or to
175a0 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   -1 to.      ** 
175b0 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66  read the rowid f
175c0 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ield..      **. 
175d0 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72       ** The expr
175e0 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  ession is implem
175f0 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f  ented using an O
17600 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20  P_Param opcode. 
17610 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  The p1.      ** 
17620 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
17630 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64   to 0 for an old
17640 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
17650 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20  , or to (i+1).  
17660 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65      ** to refere
17670 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75  nce another colu
17680 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20  mn of the old.* 
17690 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68  pseudo-table, wh
176a0 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20  ere .      ** i 
176b0 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
176c0 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20  the column. For 
176d0 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65  a new.rowid refe
176e0 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20  rence, p1 is.   
176f0 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b     ** set to (n+
17700 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74  1), where n is t
17710 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
17720 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65  umns in each pse
17730 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20  udo-table..     
17740 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65   ** For a refere
17750 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72  nce to any other
17760 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
17770 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
17780 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69  e, p1.      ** i
17790 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29  s set to (n+2+i)
177a0 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20  , where n and i 
177b0 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70  are as defined p
177c0 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20  reviously. For. 
177d0 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c       ** example,
177e0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e   if the table on
177f0 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20   which triggers 
17800 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20  are being fired 
17810 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c  is.      ** decl
17820 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a  ared as:.      *
17830 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45  *.      **   CRE
17840 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
17850 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  b);.      **.   
17860 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73     ** Then p1 is
17870 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
17880 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a  follows:.      *
17890 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  *.      **   p1=
178a0 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72  =0   ->    old.r
178b0 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20  owid     p1==3  
178c0 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64   ->    new.rowid
178d0 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
178e0 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20  1   ->    old.a 
178f0 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20          p1==4   
17900 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20  ->    new.a.    
17910 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d    **   p1==2   -
17920 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20  >    old.b      
17930 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20     p1==5   ->   
17940 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20   new.b       .  
17950 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
17960 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
17970 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e  ->pTab;.      in
17980 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54  t p1 = pExpr->iT
17990 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43  able * (pTab->nC
179a0 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70  ol+1) + 1 + pExp
179b0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20  r->iColumn;..   
179c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
179d0 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70  ->iTable==0 || p
179e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20  Expr->iTable==1 
179f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17a00 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
17a10 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43  =-1 && pExpr->iC
17a20 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c  olumn<pTab->nCol
17a30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17a40 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
17a50 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  || pExpr->iColum
17a60 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  n!=pTab->iPKey )
17a70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17a80 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61  p1>=0 && p1<(pTa
17a90 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a  b->nCol*2+2) );.
17aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17ab0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50  beAddOp2(v, OP_P
17ac0 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74  aram, p1, target
17ad0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
17ae0 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20  ment((v, "%s.%s 
17af0 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20  -> $%d",.       
17b00 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20   (pExpr->iTable 
17b10 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29  ? "new" : "old")
17b20 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
17b30 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72  ->iColumn<0 ? "r
17b40 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70  owid" : pExpr->p
17b50 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
17b60 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29  >iColumn].zName)
17b70 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74  ,.        target
17b80 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e  .      ));..#ifn
17b90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17ba0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
17bb0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
17bc0 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61  olumn has REAL a
17bd0 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20  ffinity, it may 
17be0 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f  currently be sto
17bf0 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20  red as an.      
17c00 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20  ** integer. Use 
17c10 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20  OP_RealAffinity 
17c20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  to make sure it 
17c30 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 20  is really real. 
17c40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45   */.      if( pE
17c50 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
17c60 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d  .       && pTab-
17c70 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
17c80 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  lumn].affinity==
17c90 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
17ca0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
17cb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17cc0 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  p1(v, OP_RealAff
17cd0 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a  inity, target);.
17ce0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
17cf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17d00 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
17d10 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
17d20 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
17d30 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
17d40 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
17d50 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
17d60 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
17d70 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
17d80 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
17d90 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
17da0 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
17db0 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
17dc0 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
17dd0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
17de0 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
17df0 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
17e00 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
17e10 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
17e20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
17e30 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
17e40 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
17e50 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
17e60 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
17e70 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
17e80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
17e90 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
17ea0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
17eb0 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
17ec0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20   pExpr->pRight. 
17ed0 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f   The Y is also o
17ee0 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65  ptional.  If the
17ef0 72 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20  re is no.    ** 
17f00 45 4c 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20  ELSE clause and 
17f10 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61  no other term ma
17f20 74 63 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20  tches, then the 
17f30 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
17f40 20 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69    ** exprssion i
17f50 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
17f60 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
17f70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
17f80 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
17f90 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
17fa0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
17fb0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
17fc0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
17fd0 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
17fe0 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
17ff0 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
18000 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
18010 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
18020 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
18030 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
18040 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
18050 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
18060 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
18070 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
18080 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
180b0 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
180c0 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
180d0 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180f0 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
18100 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
18110 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
18120 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18140 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
18150 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
18160 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18180 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
18190 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
181a0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
181b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
181c0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
181d0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
181e0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
181f0 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
18200 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
18210 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
18220 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
18230 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
18240 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
18250 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
18260 20 20 20 20 20 20 45 78 70 72 20 63 61 63 68 65        Expr cache
18270 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
18280 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
18290 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a  d expression X *
182a0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
182b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
182c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
182d0 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
182e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
182f0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
18300 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
18310 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
18320 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
18330 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
18340 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
18350 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
18360 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
18370 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
18380 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18390 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
183a0 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
183b0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
183c0 74 28 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  t((pExpr->x.pLis
183d0 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d  t->nExpr % 2) ==
183e0 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
183f0 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
18400 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
18410 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
18420 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
18430 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
18440 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
18450 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
18460 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
18470 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
18480 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18490 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
184a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
184b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63  0 ){.        cac
184c0 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20  heX = *pX;.     
184d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
184e0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
184f0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
18500 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52  se( pX->op==TK_R
18510 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
18520 20 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65     cacheX.iTable
18530 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
18540 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
18550 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
18560 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
18570 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
18580 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f          cacheX.o
18590 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
185a0 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
185b0 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20  re.op = TK_EQ;. 
185c0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
185d0 2e 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58  .pLeft = &cacheX
185e0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20  ;.        pTest 
185f0 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20  = &opCompare;.  
18600 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
18610 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31 37  b351d95f9cd5ef17
18620 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38 36  e9d9dbae18f5ca86
18630 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20  11190001:.      
18640 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69    ** The value i
18650 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68 74  n regFree1 might
18660 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e   get SCopy-ed in
18670 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73 75  to the file resu
18680 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  lt..        ** S
18690 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
186a0 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72 65   the regFree1 re
186b0 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65  gister is not re
186c0 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20  used for other. 
186d0 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73         ** purpos
186e0 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  es and possibly 
186f0 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
18700 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65  .        regFree
18710 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  1 = 0;.      }. 
18720 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
18730 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20  nExpr; i=i+2){. 
18740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18750 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
18760 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
18770 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
18780 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d   assert( pTest!=
18790 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 );.          o
187a0 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20  pCompare.pRight 
187b0 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
187c0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
187d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
187e0 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  Test = aListelem
187f0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
18800 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78     }.        nex
18810 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56  tCase = sqlite3V
18820 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18830 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
18840 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b  e( pTest->op==TK
18850 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
18860 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
18870 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
18880 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53  est, nextCase, S
18890 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
188a0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
188b0 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ase( aListelem[i
188c0 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  +1].pExpr->op==T
188d0 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
188e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
188f0 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
18900 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
18910 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73  TER );.        s
18920 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
18930 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
18940 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
18950 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
18960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18970 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
18980 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
18990 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
189a0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
189b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
189c0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
189d0 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
189e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
189f0 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
18a00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18a10 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
18a20 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
18a30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18a40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
18a50 70 52 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b  pRight, target);
18a60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18a70 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
18a80 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  rse, 1);.      }
18a90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
18aa0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18ab0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
18ac0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
18ad0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
18ae0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
18af0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
18b00 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
18b10 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
18b20 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c  vel==iCacheLevel
18b30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
18b40 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18b50 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  l(v, endLabel);.
18b60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18b70 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
18b80 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
18b90 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
18ba0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
18bb0 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
18bc0 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a  y==OE_Rollback .
18bd0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
18be0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
18bf0 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20  E_Abort.        
18c00 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
18c10 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20  inity==OE_Fail. 
18c20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
18c30 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
18c40 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b  _Ignore.      );
18c50 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
18c60 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
18c70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18c80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18c90 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
18ca0 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
18cb0 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
18cc0 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
18cd0 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
18ce0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
18cf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18d00 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
18d10 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ity==OE_Abort ){
18d20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18d30 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
18d40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18d50 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
18d60 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
18d70 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
18d80 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
18d90 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
18da0 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
18db0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18dc0 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  4(.            v
18dd0 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
18de0 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  E_OK, OE_Ignore,
18df0 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
18e00 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  ken,0);.      }e
18e10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
18e20 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
18e30 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  nt(pParse, SQLIT
18e40 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49  E_CONSTRAINT_TRI
18e50 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  GGER,.          
18e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e70 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
18e80 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ity, pExpr->u.zT
18e90 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  oken, 0);.      
18ea0 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
18eb0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
18ec0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
18ed0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
18ee0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
18ef0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18f00 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
18f10 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
18f20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
18f30 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
18f40 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   evaluate an exp
18f50 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ression and stor
18f60 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
18f70 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
18f80 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
18f90 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
18fa0 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ere the results.
18fb0 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ** are stored..*
18fc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69  *.** If the regi
18fd0 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
18fe0 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61  ary register tha
18ff0 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63  t can be dealloc
19000 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72  ated,.** then wr
19010 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69  ite its number i
19020 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74  nto *pReg.  If t
19030 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  he result regist
19040 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74  er is not.** a t
19050 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73  emporary, then s
19060 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f  et *pReg to zero
19070 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19080 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72  ExprCodeTemp(Par
19090 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
190a0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52   *pExpr, int *pR
190b0 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  eg){.  int r1 = 
190c0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
190d0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  g(pParse);.  int
190e0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
190f0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
19100 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a  se, pExpr, r1);.
19110 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
19120 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
19130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
19140 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19150 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
19160 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20      *pReg = 0;. 
19170 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a   }.  return r2;.
19180 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
19190 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
191a0 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
191b0 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
191c0 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
191d0 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
191e0 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
191f0 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
19200 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
19210 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
19220 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  get..*/.int sqli
19230 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73  te3ExprCode(Pars
19240 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
19250 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
19260 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67  et){.  int inReg
19270 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
19280 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
19290 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
192a0 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20  .  if( pExpr && 
192b0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
192c0 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71  GISTER ){.    sq
192d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
192e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
192f0 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69  P_Copy, pExpr->i
19300 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a  Table, target);.
19310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52    }else{.    inR
19320 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
19330 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
19340 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
19350 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
19360 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20  Parse->pVdbe || 
19370 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
19380 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
19390 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
193a0 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64  t && pParse->pVd
193b0 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  be ){.      sqli
193c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
193d0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
193e0 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
193f0 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rget);.    }.  }
19400 0a 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74  .  return target
19410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
19420 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
19430 61 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e  alutes the given
19440 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
19450 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a  puts the result.
19460 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
19470 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  arget..**.** Als
19480 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
19490 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
194a0 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f  results into ano
194b0 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67  ther "cache" reg
194c0 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64  ister.** and mod
194d0 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
194e0 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  on so that the n
194f0 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  ext time it is e
19500 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65  valuated,.** the
19510 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70   result is a cop
19520 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72  y of the cache r
19530 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
19540 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
19550 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69  sed for expressi
19560 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65  ons that are use
19570 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
19580 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20  imes.  They are 
19590 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61  evaluated once a
195a0 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  nd the results o
195b0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
195c0 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a  .** are reused..
195d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
195e0 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
195f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
19600 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
19610 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
19620 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
19630 65 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  e;.  int inReg;.
19640 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
19650 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
19660 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
19670 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ;.  assert( targ
19680 65 74 3e 30 20 29 3b 0a 20 20 2f 2a 20 54 68 69  et>0 );.  /* Thi
19690 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
196a0 6c 65 64 20 66 6f 72 20 74 65 72 6d 73 20 74 6f  led for terms to
196b0 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54   INSERT or UPDAT
196c0 45 2e 20 20 41 6e 64 20 74 68 65 20 6f 6e 6c 79  E.  And the only
196d0 0a 20 20 2a 2a 20 6f 74 68 65 72 20 70 6c 61 63  .  ** other plac
196e0 65 20 77 68 65 72 65 20 65 78 70 72 65 73 73 69  e where expressi
196f0 6f 6e 73 20 63 61 6e 20 62 65 20 63 6f 6e 76 65  ons can be conve
19700 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 52 45 47  rted into TK_REG
19710 49 53 54 45 52 20 69 73 0a 20 20 2a 2a 20 69 6e  ISTER is.  ** in
19720 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
19730 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f 20 61 73  ocessing.  So as
19740 20 63 75 72 72 65 6e 74 6c 79 20 69 6d 70 6c 65   currently imple
19750 6d 65 6e 74 65 64 2c 20 74 68 65 72 65 20 69 73  mented, there is
19760 0a 20 20 2a 2a 20 6e 6f 20 77 61 79 20 66 6f 72  .  ** no way for
19770 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 20 74   a TK_REGISTER t
19780 6f 20 65 78 69 73 74 20 68 65 72 65 2e 20 20 42  o exist here.  B
19790 75 74 20 69 74 20 73 65 65 6d 73 20 70 72 75 64  ut it seems prud
197a0 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  ent to.  ** keep
197b0 20 74 68 65 20 41 4c 57 41 59 53 28 29 20 69 6e   the ALWAYS() in
197c0 20 63 61 73 65 20 74 68 65 20 63 6f 6e 64 69 74   case the condit
197d0 69 6f 6e 73 20 61 62 6f 76 65 20 63 68 61 6e 67  ions above chang
197e0 65 20 77 69 74 68 20 66 75 74 75 72 65 0a 20 20  e with future.  
197f0 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  ** modifications
19800 20 6f 72 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73   or enhancements
19810 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59  . */.  if( ALWAY
19820 53 28 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  S(pExpr->op!=TK_
19830 52 45 47 49 53 54 45 52 29 20 29 7b 20 20 0a 20  REGISTER) ){  . 
19840 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20     int iMem;.   
19850 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
19860 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
19870 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19880 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c   OP_Copy, inReg,
19890 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78 70   iMem);.    pExp
198a0 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d  r->iTable = iMem
198b0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32  ;.    pExpr->op2
198c0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
198d0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
198e0 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20  _REGISTER;.  }. 
198f0 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
19900 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
19910 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
19920 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20  _EXPLAIN)./*.** 
19930 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e  Generate a human
19940 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e  -readable explan
19950 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72  ation of an expr
19960 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
19970 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c  void sqlite3Expl
19980 61 69 6e 45 78 70 72 28 56 64 62 65 20 2a 70 4f  ainExpr(Vdbe *pO
19990 75 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  ut, Expr *pExpr)
199a0 7b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  {.  int op;     
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
199c0 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
199d0 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e  g coded */.  con
199e0 73 74 20 63 68 61 72 20 2a 7a 42 69 6e 4f 70 20  st char *zBinOp 
199f0 3d 20 30 3b 20 20 20 2f 2a 20 42 69 6e 61 72 79  = 0;   /* Binary
19a00 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63   operator */.  c
19a10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 6e 69 4f  onst char *zUniO
19a20 70 20 3d 20 30 3b 20 20 20 2f 2a 20 55 6e 61 72  p = 0;   /* Unar
19a30 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  y operator */.  
19a40 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
19a50 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
19a60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
19a70 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
19a80 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
19a90 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
19aa0 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
19ab0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
19ac0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 41  nPrintf(pOut, "A
19ad0 47 47 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20  GG{%d:%d}",.    
19ae0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
19af0 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  Table, pExpr->iC
19b00 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
19b10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
19b20 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
19b30 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
19b40 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20  ->iTable<0 ){.  
19b50 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e        /* This on
19b60 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
19b70 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e  coding check con
19b80 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
19b90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19ba0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
19bb0 43 4f 4c 55 4d 4e 28 25 64 29 22 2c 20 70 45 78  COLUMN(%d)", pEx
19bc0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
19bd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19be0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
19bf0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 7b  nPrintf(pOut, "{
19c00 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  %d:%d}",.       
19c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
19c30 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
19c40 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  umn);.      }.  
19c50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19c60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
19c70 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66  EGER: {.      if
19c80 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
19c90 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
19ca0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19cb0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
19cc0 74 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e  t, "%d", pExpr->
19cd0 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  u.iValue);.     
19ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19cf0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
19d00 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 22 2c  intf(pOut, "%s",
19d10 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
19d20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19d30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
19d40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19d50 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
19d60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
19d70 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AT: {.      sqli
19d80 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19d90 28 70 4f 75 74 2c 22 25 73 22 2c 20 70 45 78 70  (pOut,"%s", pExp
19da0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
19db0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19dc0 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
19dd0 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
19de0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19df0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
19e00 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
19e10 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
19e20 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
19e30 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
19e40 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
19e50 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 4e 55  nPrintf(pOut,"NU
19e60 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  LL");.      brea
19e70 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
19e80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
19e90 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
19ea0 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
19eb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19ec0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
19ed0 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  s", pExpr->u.zTo
19ee0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
19ef0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
19f00 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
19f10 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ABLE: {.      sq
19f20 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
19f30 74 66 28 70 4f 75 74 2c 22 56 41 52 49 41 42 4c  tf(pOut,"VARIABL
19f40 45 28 25 73 2c 25 64 29 22 2c 0a 20 20 20 20 20  E(%s,%d)",.     
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f60 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
19f70 54 6f 6b 65 6e 2c 20 70 45 78 70 72 2d 3e 69 43  Token, pExpr->iC
19f80 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
19f90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
19fa0 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
19fb0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
19fc0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
19fd0 75 74 2c 22 52 45 47 49 53 54 45 52 28 25 64 29  ut,"REGISTER(%d)
19fe0 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ", pExpr->iTable
19ff0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a000 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1a010 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_AS: {.      sq
1a020 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1a030 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c  (pOut, pExpr->pL
1a040 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eft);.      brea
1a050 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1a060 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
1a070 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
1a080 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
1a090 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
1a0a0 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
1a0b0 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
1a0c0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
1a0d0 61 72 20 2a 7a 41 66 66 20 3d 20 22 75 6e 6b 22  ar *zAff = "unk"
1a0e0 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
1a0f0 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
1a100 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
1a110 6b 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ken) ){.        
1a120 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
1a130 54 45 58 54 3a 20 20 20 20 7a 41 66 66 20 3d 20  TEXT:    zAff = 
1a140 22 54 45 58 54 22 3b 20 20 20 20 20 62 72 65 61  "TEXT";     brea
1a150 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1a160 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a  SQLITE_AFF_NONE:
1a170 20 20 20 20 7a 41 66 66 20 3d 20 22 4e 4f 4e 45      zAff = "NONE
1a180 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1a190 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1a1a0 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 7a  E_AFF_NUMERIC: z
1a1b0 41 66 66 20 3d 20 22 4e 55 4d 45 52 49 43 22 3b  Aff = "NUMERIC";
1a1c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1a1d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1a1e0 5f 49 4e 54 45 47 45 52 3a 20 7a 41 66 66 20 3d  _INTEGER: zAff =
1a1f0 20 22 49 4e 54 45 47 45 52 22 3b 20 20 62 72 65   "INTEGER";  bre
1a200 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1a210 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
1a220 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 52 45 41  :    zAff = "REA
1a230 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  L";     break;. 
1a240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1a250 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1a260 66 28 70 4f 75 74 2c 20 22 43 41 53 54 2d 25 73  f(pOut, "CAST-%s
1a270 28 22 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20 20  (", zAff);.     
1a280 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1a290 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  xpr(pOut, pExpr-
1a2a0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
1a2b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1a2c0 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a  ntf(pOut, ")");.
1a2d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a2e0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1a2f0 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
1a300 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1a310 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1a320 4c 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  LT";     break;.
1a330 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
1a340 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c       zBinOp = "L
1a350 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
1a360 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
1a370 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 54      zBinOp = "GT
1a380 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1a390 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
1a3a0 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 45 22     zBinOp = "GE"
1a3b0 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1a3c0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
1a3d0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4e 45 22 3b    zBinOp = "NE";
1a3e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a3f0 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
1a400 20 7a 42 69 6e 4f 70 20 3d 20 22 45 51 22 3b 20   zBinOp = "EQ"; 
1a410 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1a420 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20  ase TK_IS:      
1a430 7a 42 69 6e 4f 70 20 3d 20 22 49 53 22 3b 20 20  zBinOp = "IS";  
1a440 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1a450 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a  se TK_ISNOT:   z
1a460 42 69 6e 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b  BinOp = "ISNOT";
1a470 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a480 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 42  e TK_AND:     zB
1a490 69 6e 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20  inOp = "AND";   
1a4a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a4b0 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42 69   TK_OR:      zBi
1a4c0 6e 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20  nOp = "OR";     
1a4d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a4e0 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69 6e  TK_PLUS:    zBin
1a4f0 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20 62  Op = "ADD";    b
1a500 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a510 4b 5f 53 54 41 52 3a 20 20 20 20 7a 42 69 6e 4f  K_STAR:    zBinO
1a520 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 62 72  p = "MUL";    br
1a530 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a540 5f 4d 49 4e 55 53 3a 20 20 20 7a 42 69 6e 4f 70  _MINUS:   zBinOp
1a550 20 3d 20 22 53 55 42 22 3b 20 20 20 20 62 72 65   = "SUB";    bre
1a560 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a570 52 45 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20  REM:     zBinOp 
1a580 3d 20 22 52 45 4d 22 3b 20 20 20 20 62 72 65 61  = "REM";    brea
1a590 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
1a5a0 49 54 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20 3d  ITAND:  zBinOp =
1a5b0 20 22 42 49 54 41 4e 44 22 3b 20 62 72 65 61 6b   "BITAND"; break
1a5c0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
1a5d0 54 4f 52 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20  TOR:   zBinOp = 
1a5e0 22 42 49 54 4f 52 22 3b 20 20 62 72 65 61 6b 3b  "BITOR";  break;
1a5f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
1a600 53 48 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  SH:   zBinOp = "
1a610 44 49 56 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  DIV";    break;.
1a620 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
1a630 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c  FT:  zBinOp = "L
1a640 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20  SHIFT"; break;. 
1a650 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
1a660 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 53  T:  zBinOp = "RS
1a670 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  HIFT"; break;.  
1a680 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
1a690 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 43 4f 4e  :  zBinOp = "CON
1a6a0 43 41 54 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  CAT"; break;..  
1a6b0 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
1a6c0 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 4d 49  :  zUniOp = "UMI
1a6d0 4e 55 53 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  NUS"; break;.   
1a6e0 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
1a6f0 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 50 4c 55    zUniOp = "UPLU
1a700 53 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  S";  break;.    
1a710 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20  case TK_BITNOT: 
1a720 20 7a 55 6e 69 4f 70 20 3d 20 22 42 49 54 4e 4f   zUniOp = "BITNO
1a730 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
1a740 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20  ase TK_NOT:     
1a750 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 22 3b 20  zUniOp = "NOT"; 
1a760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1a770 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a  se TK_ISNULL:  z
1a780 55 6e 69 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22  UniOp = "ISNULL"
1a790 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
1a7a0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 55  e TK_NOTNULL: zU
1a7b0 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22  niOp = "NOTNULL"
1a7c0 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61  ; break;..    ca
1a7d0 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b  se TK_COLLATE: {
1a7e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a7f0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1a800 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1a810 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a820 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1a830 2e 43 4f 4c 4c 41 54 45 28 25 73 29 22 2c 70 45  .COLLATE(%s)",pE
1a840 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1a850 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a860 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
1a870 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
1a880 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
1a890 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54  FUNC:.    case T
1a8a0 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
1a8b0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46      ExprList *pF
1a8c0 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  arg;       /* Li
1a8d0 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
1a8e0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
1a8f0 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79    if( ExprHasAny
1a900 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1a910 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
1a920 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1a930 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1a940 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1a950 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1a960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a970 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  f( op==TK_AGG_FU
1a980 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  NCTION ){.      
1a990 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a9a0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 41 47  Printf(pOut, "AG
1a9b0 47 5f 46 55 4e 43 54 49 4f 4e 25 64 3a 25 73 28  G_FUNCTION%d:%s(
1a9c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9e0 70 45 78 70 72 2d 3e 6f 70 32 2c 20 70 45 78 70  pExpr->op2, pExp
1a9f0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1aa00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1aa10 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1aa20 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 46  nPrintf(pOut, "F
1aa30 55 4e 43 54 49 4f 4e 3a 25 73 28 22 2c 20 70 45  UNCTION:%s(", pE
1aa40 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1aa50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1aa60 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
1aa70 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1aa80 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20  nExprList(pOut, 
1aa90 70 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  pFarg);.      }.
1aaa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1aab0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1aac0 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65   ")");.      bre
1aad0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1aae0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1aaf0 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
1ab00 54 4b 5f 45 58 49 53 54 53 3a 20 7b 0a 20 20 20  TK_EXISTS: {.   
1ab10 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1ab20 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 45  nPrintf(pOut, "E
1ab30 58 49 53 54 53 28 22 29 3b 0a 20 20 20 20 20 20  XISTS(");.      
1ab40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
1ab50 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72  lect(pOut, pExpr
1ab60 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
1ab70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ab80 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29  inPrintf(pOut,")
1ab90 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1aba0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1abb0 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
1abc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1abd0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 28  nPrintf(pOut, "(
1abe0 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1abf0 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70  3ExplainSelect(p
1ac00 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Out, pExpr->x.pS
1ac10 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71  elect);.      sq
1ac20 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1ac30 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
1ac40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ac50 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
1ac60 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1ac70 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1ac80 4f 75 74 2c 20 22 49 4e 28 22 29 3b 0a 20 20 20  Out, "IN(");.   
1ac90 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1aca0 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1acb0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
1acc0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1acd0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29  rintf(pOut, ",")
1ace0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
1acf0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ad00 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1ad10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ad20 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
1ad30 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e  (pOut, pExpr->x.
1ad40 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
1ad50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1ad60 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1ad70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45 78 70  rList(pOut, pExp
1ad80 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
1ad90 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1ada0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1adb0 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20  pOut, ")");.    
1adc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1add0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1ade0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
1adf0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1ae00 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
1ae10 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
1ae20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
1ae30 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
1ae40 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
1ae50 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
1ae60 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
1ae70 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
1ae80 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
1ae90 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
1aea0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
1aeb0 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
1aec0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
1aed0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
1aee0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
1aef0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
1af00 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20  .      Expr *pX 
1af10 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1af20 20 20 20 20 20 20 45 78 70 72 20 2a 70 59 20 3d        Expr *pY =
1af30 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1af40 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
1af50 20 20 20 45 78 70 72 20 2a 70 5a 20 3d 20 70 45     Expr *pZ = pE
1af60 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
1af70 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  1].pExpr;.      
1af80 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1af90 69 6e 74 66 28 70 4f 75 74 2c 20 22 42 45 54 57  intf(pOut, "BETW
1afa0 45 45 4e 28 22 29 3b 0a 20 20 20 20 20 20 73 71  EEN(");.      sq
1afb0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1afc0 28 70 4f 75 74 2c 20 70 58 29 3b 0a 20 20 20 20  (pOut, pX);.    
1afd0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1afe0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22  Printf(pOut, ","
1aff0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b000 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1b010 2c 20 70 59 29 3b 0a 20 20 20 20 20 20 73 71 6c  , pY);.      sql
1b020 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1b030 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  f(pOut, ",");.  
1b040 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b050 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 5a 29  inExpr(pOut, pZ)
1b060 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b070 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b080 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62  t, ")");.      b
1b090 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1b0a0 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a  case TK_TRIGGER:
1b0b0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
1b0c0 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f  he opcode is TK_
1b0d0 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68  TRIGGER, then th
1b0e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1b0f0 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  a reference.    
1b100 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e    ** to a column
1b110 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72   in the new.* or
1b120 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
1b130 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74  bles available t
1b140 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67  o.      ** trigg
1b150 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20  er programs. In 
1b160 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69  this case Expr.i
1b170 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
1b180 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20  1 for the.      
1b190 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  ** new.* pseudo-
1b1a0 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20  table, or 0 for 
1b1b0 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
1b1c0 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f  -table. Expr.iCo
1b1d0 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  lumn.      ** is
1b1e0 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   set to the colu
1b1f0 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f  mn of the pseudo
1b200 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20  -table to read, 
1b210 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20  or to -1 to.    
1b220 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f    ** read the ro
1b230 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20  wid field..     
1b240 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1b250 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b260 4f 75 74 2c 20 22 25 73 28 25 64 29 22 2c 20 0a  Out, "%s(%d)", .
1b270 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1b280 3e 69 54 61 62 6c 65 20 3f 20 22 4e 45 57 22 20  >iTable ? "NEW" 
1b290 3a 20 22 4f 4c 44 22 2c 20 70 45 78 70 72 2d 3e  : "OLD", pExpr->
1b2a0 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1b2b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1b2c0 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b   case TK_CASE: {
1b2d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b2e0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1b2f0 2c 20 22 43 41 53 45 28 22 29 3b 0a 20 20 20 20  , "CASE(");.    
1b300 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b310 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1b320 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
1b330 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b340 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b  intf(pOut, ",");
1b350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b360 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f  plainExprList(pO
1b370 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ut, pExpr->x.pLi
1b380 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
1b390 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1b3a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
1b3b0 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GER.    case TK_
1b3c0 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 63  RAISE: {.      c
1b3d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
1b3e0 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20   = "unk";.      
1b3f0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 61  switch( pExpr->a
1b400 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
1b410 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62     case OE_Rollb
1b420 61 63 6b 3a 20 20 20 7a 54 79 70 65 20 3d 20 22  ack:   zType = "
1b430 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62 72 65 61  rollback";  brea
1b440 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1b450 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20 20 20 7a  OE_Abort:      z
1b460 54 79 70 65 20 3d 20 22 61 62 6f 72 74 22 3b 20  Type = "abort"; 
1b470 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b480 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a     case OE_Fail:
1b490 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
1b4a0 66 61 69 6c 22 3b 20 20 20 20 20 20 62 72 65 61  fail";      brea
1b4b0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1b4c0 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 20 20 7a  OE_Ignore:     z
1b4d0 54 79 70 65 20 3d 20 22 69 67 6e 6f 72 65 22 3b  Type = "ignore";
1b4e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b4f0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1b500 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b510 75 74 2c 20 22 52 41 49 53 45 2d 25 73 28 25 73  ut, "RAISE-%s(%s
1b520 29 22 2c 20 7a 54 79 70 65 2c 20 70 45 78 70 72  )", zType, pExpr
1b530 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1b540 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b550 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
1b560 20 7a 42 69 6e 4f 70 20 29 7b 0a 20 20 20 20 73   zBinOp ){.    s
1b570 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b580 6e 74 66 28 70 4f 75 74 2c 22 25 73 28 22 2c 20  ntf(pOut,"%s(", 
1b590 7a 42 69 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  zBinOp);.    sql
1b5a0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1b5b0 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pOut, pExpr->pLe
1b5c0 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
1b5d0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b5e0 75 74 2c 22 2c 22 29 3b 0a 20 20 20 20 73 71 6c  ut,",");.    sql
1b5f0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1b600 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  pOut, pExpr->pRi
1b610 67 68 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ght);.    sqlite
1b620 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b630 4f 75 74 2c 22 29 22 29 3b 0a 20 20 7d 65 6c 73  Out,")");.  }els
1b640 65 20 69 66 28 20 7a 55 6e 69 4f 70 20 29 7b 0a  e if( zUniOp ){.
1b650 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b660 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
1b670 73 28 22 2c 20 7a 55 6e 69 4f 70 29 3b 0a 20 20  s(", zUniOp);.  
1b680 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b690 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1b6a0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
1b6b0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1b6c0 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20  tf(pOut,")");.  
1b6d0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  }.}.#endif /* de
1b6e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1b6f0 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
1b700 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ) */..#if define
1b710 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1b720 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a  TREE_EXPLAIN)./*
1b730 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
1b740 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78  uman-readable ex
1b750 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20  planation of an 
1b760 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
1b770 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b780 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
1b790 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78 70 72  Vdbe *pOut, Expr
1b7a0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1b7b0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1b7c0 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  st==0 || pList->
1b7d0 6e 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  nExpr==0 ){.    
1b7e0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b7f0 69 6e 74 66 28 70 4f 75 74 2c 20 22 28 65 6d 70  intf(pOut, "(emp
1b800 74 79 2d 6c 69 73 74 29 22 29 3b 0a 20 20 20 20  ty-list)");.    
1b810 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
1b820 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
1b830 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
1b840 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1b850 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ut, pList->a[0].
1b860 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  pExpr);.  }else{
1b870 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1b880 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a 20  ainPush(pOut);. 
1b890 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
1b8a0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1b8b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1b8c0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b8d0 74 2c 20 22 69 74 65 6d 5b 25 64 5d 20 3d 20 22  t, "item[%d] = "
1b8e0 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , i);.      sqli
1b8f0 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70  te3ExplainPush(p
1b900 4f 75 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Out);.      sqli
1b910 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1b920 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Out, pList->a[i]
1b930 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  .pExpr);.      s
1b940 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70  qlite3ExplainPop
1b950 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66  (pOut);.      if
1b960 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
1b970 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
1b980 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b990 6e 74 66 28 70 4f 75 74 2c 20 22 20 41 53 20 25  ntf(pOut, " AS %
1b9a0 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  s", pList->a[i].
1b9b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
1b9c0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
1b9d0 3e 61 5b 69 5d 2e 62 53 70 61 6e 49 73 54 61 62  >a[i].bSpanIsTab
1b9e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b9f0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1ba00 28 70 4f 75 74 2c 20 22 20 28 25 73 29 22 2c 20  (pOut, " (%s)", 
1ba10 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  pList->a[i].zSpa
1ba20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
1ba30 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e    if( i<pList->n
1ba40 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20  Expr-1 ){.      
1ba50 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1ba60 4e 4c 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20  NL(pOut);.      
1ba70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1ba80 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 4f  te3ExplainPop(pO
1ba90 75 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ut);.  }.}.#endi
1baa0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1bab0 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  G */../*.** Retu
1bac0 72 6e 20 54 52 55 45 20 69 66 20 70 45 78 70 72  rn TRUE if pExpr
1bad0 20 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20   is an constant 
1bae0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1baf0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  is appropriate.*
1bb00 2a 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20  * for factoring 
1bb10 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20  out of a loop.  
1bb20 41 70 70 72 6f 70 72 69 61 74 65 20 65 78 70 72  Appropriate expr
1bb30 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a  essions are:.**.
1bb40 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 65 78 70  **    *  Any exp
1bb50 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61  ression that eva
1bb60 6c 75 61 74 65 73 20 74 6f 20 74 77 6f 20 6f 72  luates to two or
1bb70 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a   more opcodes..*
1bb80 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f  *.**    *  Any O
1bb90 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65  P_Integer, OP_Re
1bba0 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f  al, OP_String, O
1bbb0 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c  P_Blob, OP_Null,
1bbc0 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f 50   .**       or OP
1bbd0 5f 56 61 72 69 61 62 6c 65 20 74 68 61 74 20 64  _Variable that d
1bbe0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1bbf0 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 0a  be placed in a .
1bc00 2a 2a 20 20 20 20 20 20 20 73 70 65 63 69 66 69  **       specifi
1bc10 63 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  c register..**.*
1bc20 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  * There is no po
1bc30 69 6e 74 20 69 6e 20 66 61 63 74 6f 72 69 6e 67  int in factoring
1bc40 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74   out single-inst
1bc50 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74  ruction constant
1bc60 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
1bc70 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
1bc80 70 6c 61 63 65 64 20 69 6e 20 61 20 70 61 72 74  placed in a part
1bc90 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e  icular register.
1bca0 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66    .** We could f
1bcb0 61 63 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20  actor them out, 
1bcc0 62 75 74 20 74 68 65 6e 20 77 65 20 77 6f 75 6c  but then we woul
1bcd0 64 20 65 6e 64 20 75 70 20 61 64 64 69 6e 67 20  d end up adding 
1bce0 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69  an.** OP_SCopy i
1bcf0 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f  nstruction to mo
1bd00 76 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74  ve the value int
1bd10 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  o the correct re
1bd20 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e  gister.** later.
1bd30 20 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65    We might as we
1bd40 6c 6c 20 6a 75 73 74 20 75 73 65 20 74 68 65 20  ll just use the 
1bd50 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74 72 75 63  original instruc
1bd60 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69  tion and.** avoi
1bd70 64 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a  d the OP_SCopy..
1bd80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
1bd90 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61  AppropriateForFa
1bda0 63 74 6f 72 69 6e 67 28 45 78 70 72 20 2a 70 29  ctoring(Expr *p)
1bdb0 7b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  {.  if( !sqlite3
1bdc0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
1bdd0 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20 20  tJoin(p) ){.    
1bde0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e  return 0;  /* On
1bdf0 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72  ly constant expr
1be00 65 73 73 69 6f 6e 73 20 61 72 65 20 61 70 70 72  essions are appr
1be10 6f 70 72 69 61 74 65 20 66 6f 72 20 66 61 63 74  opriate for fact
1be20 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  oring */.  }.  i
1be30 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45  f( (p->flags & E
1be40 50 5f 46 69 78 65 64 44 65 73 74 29 3d 3d 30 20  P_FixedDest)==0 
1be50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1be60 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e    /* Any constan
1be70 74 20 77 69 74 68 6f 75 74 20 61 20 66 69 78 65  t without a fixe
1be80 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  d destination is
1be90 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
1bea0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e    }.  while( p->
1beb0 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70  op==TK_UPLUS ) p
1bec0 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73   = p->pLeft;.  s
1bed0 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
1bee0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bef0 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
1bf00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
1bf10 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  B:.#endif.    ca
1bf20 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a  se TK_VARIABLE:.
1bf30 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
1bf40 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
1bf50 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
1bf60 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61   TK_NULL:.    ca
1bf70 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
1bf80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bf90 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29  p->op==TK_BLOB )
1bfa0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bfb0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  ( p->op==TK_VARI
1bfc0 41 42 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  ABLE );.      te
1bfd0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
1bfe0 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  K_INTEGER );.   
1bff0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
1c000 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a  op==TK_FLOAT );.
1c010 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c020 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29  p->op==TK_NULL )
1c030 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c040 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  ( p->op==TK_STRI
1c050 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53  NG );.      /* S
1c060 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f  ingle-instructio
1c070 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  n constants with
1c080 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61   a fixed destina
1c090 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 2a  tion are.      *
1c0a0 2a 20 62 65 74 74 65 72 20 64 6f 6e 65 20 69 6e  * better done in
1c0b0 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65 20 66 61  -line.  If we fa
1c0c0 63 74 6f 72 20 74 68 65 6d 2c 20 74 68 65 79 20  ctor them, they 
1c0d0 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20  will just end.  
1c0e0 20 20 20 20 2a 2a 20 75 70 20 67 65 6e 65 72 61      ** up genera
1c0f0 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79  ting an OP_SCopy
1c100 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c   to move the val
1c110 75 65 20 74 6f 20 74 68 65 20 64 65 73 74 69 6e  ue to the destin
1c120 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ation.      ** r
1c130 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20  egister. */.    
1c140 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1c150 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
1c160 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 66  INUS: {.      if
1c170 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  ( p->pLeft->op==
1c180 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70  TK_FLOAT || p->p
1c190 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
1c1a0 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
1c1b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1c1c0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1c1d0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
1c1e0 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  : {.      break;
1c1f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1c200 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
1c210 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
1c220 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
1c230 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70  n that is approp
1c240 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61 63  riate for.** fac
1c250 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20  toring out of a 
1c260 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c 75  loop, then evalu
1c270 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
1c280 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  on.** into a reg
1c290 69 73 74 65 72 20 61 6e 64 20 63 6f 6e 76 65 72  ister and conver
1c2a0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
1c2b0 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49 53   into a TK_REGIS
1c2c0 54 45 52 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  TER.** expressio
1c2d0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1c2e0 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28 57   evalConstExpr(W
1c2f0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
1c300 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1c310 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1c320 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
1c330 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
1c340 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
1c350 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65   TK_IN:.    case
1c360 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
1c370 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
1c380 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
1c390 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54    case TK_COLLAT
1c3a0 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E: {.      retur
1c3b0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1c3c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1c3d0 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
1c3e0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1c3f0 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
1c400 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a  K_CONST_FUNC: {.
1c410 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67        /* The arg
1c420 75 6d 65 6e 74 73 20 74 6f 20 61 20 66 75 6e 63  uments to a func
1c430 74 69 6f 6e 20 68 61 76 65 20 61 20 66 69 78 65  tion have a fixe
1c440 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20  d destination.. 
1c450 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65       ** Mark the
1c460 6d 20 74 68 69 73 20 77 61 79 20 74 6f 20 61 76  m this way to av
1c470 6f 69 64 20 67 65 6e 65 72 61 74 65 64 20 75 6e  oid generated un
1c480 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f 70 79 0a  needed OP_SCopy.
1c490 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63        ** instruc
1c4a0 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a 2f  tions. .      */
1c4b0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
1c4c0 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
1c4d0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
1c4e0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1c4f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1c500 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1c510 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20        if( pList 
1c520 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
1c530 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
1c540 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
1c550 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1c560 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b  Item = pList->a;
1c570 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 69  .        for(; i
1c580 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1c590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1c5a0 20 41 4c 57 41 59 53 28 70 49 74 65 6d 2d 3e 70   ALWAYS(pItem->p
1c5b0 45 78 70 72 29 20 29 20 70 49 74 65 6d 2d 3e 70  Expr) ) pItem->p
1c5c0 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Expr->flags |= E
1c5d0 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20  P_FixedDest;.   
1c5e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c5f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c600 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70  }.  }.  if( isAp
1c610 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74  propriateForFact
1c620 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a  oring(pExpr) ){.
1c630 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70      int r1 = ++p
1c640 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1c650 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
1c660 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1c670 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
1c680 31 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 72 32  1);.    /* If r2
1c690 21 3d 72 31 2c 20 69 74 20 6d 65 61 6e 73 20 74  !=r1, it means t
1c6a0 68 61 74 20 72 65 67 69 73 74 65 72 20 72 31 20  hat register r1 
1c6b0 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 20  is never used.  
1c6c0 54 68 61 74 20 69 73 20 68 61 72 6d 6c 65 73 73  That is harmless
1c6d0 0a 20 20 20 20 2a 2a 20 62 75 74 20 73 75 62 6f  .    ** but subo
1c6e0 70 74 69 6d 61 6c 2c 20 73 6f 20 77 65 20 77 61  ptimal, so we wa
1c6f0 6e 74 20 74 6f 20 6b 6e 6f 77 20 61 62 6f 75 74  nt to know about
1c700 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 74   the situation t
1c710 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20 2a 2a  o fix it..    **
1c720 20 48 65 6e 63 65 20 74 68 65 20 66 6f 6c 6c 6f   Hence the follo
1c730 77 69 6e 67 20 61 73 73 65 72 74 3a 20 2a 2f 0a  wing assert: */.
1c740 20 20 20 20 61 73 73 65 72 74 28 20 72 32 3d 3d      assert( r2==
1c750 72 31 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  r1 );.    pExpr-
1c760 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70  >op2 = pExpr->op
1c770 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
1c780 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
1c790 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1c7a0 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72   = r2;.    retur
1c7b0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
1c7c0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
1c7d0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
1c7e0 20 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e   Preevaluate con
1c7f0 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 73  stant subexpress
1c800 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70  ions within pExp
1c810 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
1c820 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
1c830 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79  gisters.  Modify
1c840 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74   pExpr so that t
1c850 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  he constant sube
1c860 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  xpresions.** are
1c870 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63   TK_REGISTER opc
1c880 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20  odes that refer 
1c890 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74  to the precomput
1c8a0 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  ed values..**.**
1c8b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1c8c0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
1c8d0 6a 75 6d 70 20 74 6f 20 74 68 65 20 63 6f 6f 6b  jump to the cook
1c8e0 69 65 2d 63 68 65 63 6b 20 63 6f 64 65 20 68 61  ie-check code ha
1c8f0 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63  s.** already occ
1c900 75 72 2e 20 20 53 69 6e 63 65 20 74 68 65 20 63  ur.  Since the c
1c910 6f 6f 6b 69 65 2d 63 68 65 63 6b 20 6a 75 6d 70  ookie-check jump
1c920 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 70 72   is generated pr
1c930 69 6f 72 20 74 6f 0a 2a 2a 20 61 6e 79 20 6f 74  ior to.** any ot
1c940 68 65 72 20 73 65 72 69 6f 75 73 20 70 72 6f 63  her serious proc
1c950 65 73 73 69 6e 67 2c 20 74 68 69 73 20 63 68 65  essing, this che
1c960 63 6b 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ck ensures that 
1c970 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 77  there is no.** w
1c980 61 79 20 74 6f 20 61 63 63 69 64 65 6e 74 6c 79  ay to accidently
1c990 20 62 79 70 61 73 73 20 74 68 65 20 63 6f 6e 73   bypass the cons
1c9a0 74 61 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  tant initializat
1c9b0 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
1c9c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 73 6f   routine is also
1c9d0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
1c9e0 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74  SQLITE_FactorOut
1c9f0 43 6f 6e 73 74 20 6f 70 74 69 6d 69 7a 61 74 69  Const optimizati
1ca00 6f 6e 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  on.** is disable
1ca10 64 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  d via the sqlite
1ca20 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1ca30 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1ca40 50 54 49 4d 49 5a 41 54 49 4f 4e 53 29 0a 2a 2a  PTIMIZATIONS).**
1ca50 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68 69   interface.  Thi
1ca60 73 20 61 6c 6c 6f 77 73 20 74 65 73 74 20 6c 6f  s allows test lo
1ca70 67 69 63 20 74 6f 20 76 65 72 69 66 79 20 74 68  gic to verify th
1ca80 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  at the same answ
1ca90 65 72 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  er is.** obtaine
1caa0 64 20 66 6f 72 20 71 75 65 72 69 65 73 20 72 65  d for queries re
1cab0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
1cac0 68 65 72 20 6f 72 20 6e 6f 74 20 63 6f 6e 73 74  her or not const
1cad0 61 6e 74 73 20 61 72 65 0a 2a 2a 20 70 72 65 63  ants are.** prec
1cae0 6f 6d 70 75 74 65 64 20 69 6e 74 6f 20 72 65 67  omputed into reg
1caf0 69 73 74 65 72 73 20 6f 72 20 69 66 20 74 68 65  isters or if the
1cb00 79 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  y are inserted i
1cb10 6e 2d 6c 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n-line..*/.void 
1cb20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
1cb30 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20 2a  onstants(Parse *
1cb40 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1cb50 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  xpr){.  Walker w
1cb60 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1cb70 63 6f 6f 6b 69 65 47 6f 74 6f 20 29 20 72 65 74  cookieGoto ) ret
1cb80 75 72 6e 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d  urn;.  if( Optim
1cb90 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
1cba0 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
1cbb0 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73  TE_FactorOutCons
1cbc0 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  t) ) return;.  m
1cbd0 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
1cbe0 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
1cbf0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 76 61  prCallback = eva
1cc00 6c 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 77 2e  lConstExpr;.  w.
1cc10 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
1cc20 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
1cc30 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
1cc40 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1cc50 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
1cc60 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
1cc70 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
1cc80 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
1cc90 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e  pression list in
1cca0 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  to a sequence of
1ccb0 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
1ccc0 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a  ning at target..
1ccd0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1cce0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
1ccf0 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a  nts evaluated..*
1cd00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1cd10 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20  rCodeExprList(. 
1cd20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1cd30 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1cd40 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
1cd50 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
1cd60 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
1cd70 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65   list to be code
1cd80 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65  d */.  int targe
1cd90 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  t,        /* Whe
1cda0 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75  re to write resu
1cdb0 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48  lts */.  int doH
1cdc0 61 72 64 43 6f 70 79 20 20 20 20 20 2f 2a 20 4d  ardCopy     /* M
1cdd0 61 6b 65 20 61 20 68 61 72 64 20 63 6f 70 79 20  ake a hard copy 
1cde0 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
1cdf0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
1ce00 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1ce10 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  Item;.  int i, n
1ce20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
1ce30 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
1ce40 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
1ce50 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1ce60 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
1ce70 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
1ce80 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
1ce90 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
1cea0 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  xpr;.  for(pItem
1ceb0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
1cec0 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
1ced0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1cee0 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
1cef0 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 6e 52 65  pr;.    int inRe
1cf00 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1cf10 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1cf20 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
1cf30 69 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65  i);.    if( inRe
1cf40 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20  g!=target+i ){. 
1cf50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cf60 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
1cf70 56 64 62 65 2c 20 64 6f 48 61 72 64 43 6f 70 79  Vdbe, doHardCopy
1cf80 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f   ? OP_Copy : OP_
1cf90 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1cfb0 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b  nReg, target+i);
1cfc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1cfd0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
1cfe0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1cff0 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72  r a BETWEEN oper
1d000 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78  ator..**.**    x
1d010 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
1d020 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
1d030 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1d040 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79  o .**.**    x>=y
1d050 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20   AND x<=z.**.** 
1d060 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c  Code it as such,
1d070 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
1d080 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75  do the common su
1d090 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65  bexpression.** e
1d0a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78  lementation of x
1d0b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d0c0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
1d0d0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1d0e0 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
1d0f0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1d100 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
1d110 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
1d120 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45      /* The BETWE
1d130 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  EN expression */
1d140 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
1d150 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1d160 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73  e if the jump is
1d170 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20   taken */.  int 
1d180 6a 75 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a  jumpIfTrue,   /*
1d190 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
1d1a0 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
1d1b0 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   true */.  int j
1d1c0 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
1d1d0 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
1d1e0 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
1d1f0 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  NULL */.){.  Exp
1d200 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f  r exprAnd;     /
1d210 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74  * The AND operat
1d220 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20  or in  x>=y AND 
1d230 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20  x<=z  */.  Expr 
1d240 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20  compLeft;    /* 
1d250 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20  The  x>=y  term 
1d260 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69  */.  Expr compRi
1d270 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78  ght;   /* The  x
1d280 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  <=z  term */.  E
1d290 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20  xpr exprX;      
1d2a0 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65   /* The  x  sube
1d2b0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
1d2c0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1d2d0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
1d2e0 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20  e register */.. 
1d2f0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1d300 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1d310 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1d320 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78  ;.  exprX = *pEx
1d330 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70  pr->pLeft;.  exp
1d340 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
1d350 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66  ;.  exprAnd.pLef
1d360 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
1d370 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
1d380 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
1d390 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
1d3a0 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  _GE;.  compLeft.
1d3b0 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
1d3c0 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
1d3d0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
1d3e0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
1d3f0 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
1d400 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69   TK_LE;.  compRi
1d410 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
1d420 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  rX;.  compRight.
1d430 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
1d440 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
1d450 78 70 72 3b 0a 20 20 65 78 70 72 58 2e 69 54 61  xpr;.  exprX.iTa
1d460 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ble = sqlite3Exp
1d470 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1d480 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
1d490 65 65 31 29 3b 0a 20 20 65 78 70 72 58 2e 6f 70  ee1);.  exprX.op
1d4a0 32 20 3d 20 65 78 70 72 58 2e 6f 70 3b 0a 20 20  2 = exprX.op;.  
1d4b0 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45  exprX.op = TK_RE
1d4c0 47 49 53 54 45 52 3b 0a 20 20 69 66 28 20 6a 75  GISTER;.  if( ju
1d4d0 6d 70 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20  mpIfTrue ){.    
1d4e0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1d4f0 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
1d500 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
1d510 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
1d520 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1d530 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26  fFalse(pParse, &
1d540 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
1d550 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  umpIfNull);.  }.
1d560 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1d570 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1d580 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a  regFree1);..  /*
1d590 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65   Ensure adequate
1d5a0 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a   test coverage *
1d5b0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  /.  testcase( ju
1d5c0 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1d5d0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1d5e0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1d5f0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1d600 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1d610 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1d620 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1d630 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1d640 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1d650 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1d660 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1d670 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1d680 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1d690 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
1d6a0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1d6b0 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1d6c0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1d6d0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1d6e0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1d6f0 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1d700 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1d710 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1d720 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1d730 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1d740 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1d750 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1d760 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1d770 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1d780 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1d790 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ee1!=0 );.}../*.
1d7a0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1d7b0 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
1d7c0 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
1d7d0 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
1d7e0 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
1d7f0 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
1d800 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
1d810 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
1d820 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
1d830 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
1d840 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1d850 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
1d860 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1d870 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
1d880 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
1d890 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
1d8a0 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
1d8b0 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
1d8c0 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
1d8d0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
1d8e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
1d8f0 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
1d900 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
1d910 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
1d920 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
1d930 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
1d940 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
1d950 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
1d960 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
1d970 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
1d980 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
1d990 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
1d9a0 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
1d9b0 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
1d9c0 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
1d9d0 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
1d9e0 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
1d9f0 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
1da00 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
1da10 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
1da20 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
1da30 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
1da40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1da50 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
1da60 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1da70 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
1da80 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1da90 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1daa0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1dab0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
1dac0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
1dad0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1dae0 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
1daf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
1db00 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
1db10 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
1db20 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1db30 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
1db40 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20   )     return;  
1db50 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
1db60 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
1db70 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
1db80 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
1db90 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f  ) return;  /* No
1dba0 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
1dbb0 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  ppen */.  op = p
1dbc0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
1dbd0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1dbe0 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
1dbf0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
1dc00 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1dc10 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
1dc20 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1dc30 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1dc40 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1dc50 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1dc60 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1dc70 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1dc80 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70  ->pLeft, d2,jump
1dc90 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
1dca0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1dcb0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1dcc0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1dcd0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
1dce0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1dcf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1dd00 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
1dd10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1dd20 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1dd30 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  rse, 1);.      b
1dd40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1dd50 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
1dd60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1dd70 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1dd80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1dd90 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1dda0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1ddb0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1ddc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ddd0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1dde0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1ddf0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1de00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1de10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1de20 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
1de30 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1de40 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1de50 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1de60 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1de70 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
1de80 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1de90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1dea0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
1deb0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
1dec0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
1ded0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
1dee0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
1def0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
1df00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1df10 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
1df20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1df30 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
1df40 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
1df50 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
1df60 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
1df70 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
1df80 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
1df90 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
1dfa0 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
1dfb0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1dfc0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b  se( op==TK_LT );
1dfd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1dfe0 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20   op==TK_LE );.  
1dff0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e000 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
1e010 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e020 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GE );.      te
1e030 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
1e040 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
1e050 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29  ase( op==TK_NE )
1e060 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e070 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1e080 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1e090 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e0a0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e0b0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1e0c0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1e0d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e0e0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e0f0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1e100 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
1e110 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1e120 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
1e130 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1e140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e150 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
1e160 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1e170 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1e180 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1e190 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1e1a0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1e1b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e1c0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
1e1d0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
1e1e0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1e1f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  se( op==TK_IS );
1e200 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e210 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b   op==TK_ISNOT );
1e220 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1e230 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e240 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e250 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1e260 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1e270 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e280 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e290 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1e2a0 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  2);.      op = (
1e2b0 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
1e2c0 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
1e2d0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1e2e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e2f0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1e300 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1e310 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1e320 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55   dest, SQLITE_NU
1e330 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
1e340 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1e350 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1e360 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1e370 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1e380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e390 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1e3a0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1e3b0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1e3c0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1e3d0 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
1e3e0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
1e3f0 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
1e400 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e410 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
1e420 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e430 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
1e440 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1e450 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e460 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e470 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1e480 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
1e490 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e4a0 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
1e4b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e4c0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1e4d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e4e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
1e4f0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
1e500 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1e510 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
1e520 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
1e530 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1e540 73 74 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c  st, 1, jumpIfNul
1e550 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1e560 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1e570 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1e580 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
1e590 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
1e5a0 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
1e5b0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1e5c0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
1e5d0 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
1e5e0 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
1e5f0 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
1e600 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e610 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
1e620 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
1e630 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
1e640 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e650 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1e660 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  to, 0, dest);.  
1e670 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1e680 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1e690 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
1e6a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e6b0 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
1e6c0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  lt: {.      r1 =
1e6d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e6e0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1e6f0 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
1e700 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e710 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
1e720 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
1e730 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
1e740 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1e750 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1e760 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e770 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1e780 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e790 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1e7a0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1e7b0 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
1e7c0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1e7d0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1e7e0 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a  gFree2);  .}../*
1e7f0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1e800 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
1e810 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
1e820 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
1e830 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
1e840 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
1e850 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1e860 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
1e870 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
1e880 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
1e890 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1e8a0 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
1e8b0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
1e8c0 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
1e8d0 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
1e8e0 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
1e8f0 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
1e900 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54  pIfNull is SQLIT
1e910 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20  E_JUMPIFNULL or 
1e920 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
1e930 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73  jumpIfNull.** is
1e940 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
1e950 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
1e960 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1e970 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
1e980 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
1e990 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
1e9a0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1e9b0 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
1e9c0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1e9d0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1e9e0 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
1e9f0 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
1ea00 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
1ea10 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
1ea20 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1ea30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
1ea40 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  =0) ) return; /*
1ea50 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44   Existence of VD
1ea60 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
1ea70 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45  ller */.  if( pE
1ea80 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75  xpr==0 )    retu
1ea90 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61  rn;..  /* The va
1eaa0 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  lue of pExpr->op
1eab0 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61   and op are rela
1eac0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
1ead0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1eae0 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20  pExpr->op       
1eaf0 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20       op.  **    
1eb00 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20     ---------    
1eb10 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
1eb20 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49  .  **       TK_I
1eb30 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f  SNULL          O
1eb40 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20  P_NotNull.  **  
1eb50 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20       TK_NOTNULL 
1eb60 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c          OP_IsNul
1eb70 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
1eb80 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NE              
1eb90 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Eq.  **      
1eba0 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20   TK_EQ          
1ebb0 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20      OP_Ne.  **  
1ebc0 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20       TK_GT      
1ebd0 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20          OP_Le.  
1ebe0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20  **       TK_LE  
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
1ec00 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
1ec10 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GE              
1ec20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Lt.  **      
1ec30 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20   TK_LT          
1ec40 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20      OP_Ge.  **. 
1ec50 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61   ** For other va
1ec60 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f  lues of pExpr->o
1ec70 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e  p, op is undefin
1ec80 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20  ed and unused.. 
1ec90 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   ** The value of
1eca0 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
1ecb0 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e  stants are arran
1ecc0 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65  ged such that we
1ecd0 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74  .  ** can comput
1ece0 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62  e the mapping ab
1ecf0 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f  ove using the fo
1ed00 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
1ed10 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28  on..  ** Assert(
1ed20 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74  )s verify that t
1ed30 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
1ed40 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a  s correct..  */.
1ed50 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e    op = ((pExpr->
1ed60 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  op+(TK_ISNULL&1)
1ed70 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26  )^1)-(TK_ISNULL&
1ed80 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  1);..  /* Verify
1ed90 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65   correct alignme
1eda0 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  nt of TK_ and OP
1edb0 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f  _ constants.  */
1edc0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1edd0 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
1ede0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  || op==OP_NotNul
1edf0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1ee00 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54  Expr->op!=TK_NOT
1ee10 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49  NULL || op==OP_I
1ee20 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  sNull );.  asser
1ee30 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1ee40 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71  _NE || op==OP_Eq
1ee50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1ee60 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c  xpr->op!=TK_EQ |
1ee70 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  | op==OP_Ne );. 
1ee80 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ee90 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d  op!=TK_LT || op=
1eea0 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ge );.  asse
1eeb0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1eec0 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LE || op==OP_G
1eed0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1eee0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20  Expr->op!=TK_GT 
1eef0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  || op==OP_Le );.
1ef00 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1ef10 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70  >op!=TK_GE || op
1ef20 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77  ==OP_Lt );..  sw
1ef30 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
1ef40 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1ef50 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ND: {.      test
1ef60 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1ef70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1ef80 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1ef90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1efa0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1efb0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1efc0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1efd0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1efe0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1eff0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1f000 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f010 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
1f020 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
1f030 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1f040 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
1f050 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1f060 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1f070 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f080 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1f090 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1f0a0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1f0b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
1f0c0 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
1f0d0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1f0e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f0f0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1f100 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1f110 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1f120 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f130 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1f140 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
1f150 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1f160 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
1f170 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f180 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1f190 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1f1a0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1f1b0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1f1c0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1f1d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f1e0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1f1f0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1f200 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f210 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
1f220 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
1f230 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
1f240 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
1f250 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
1f260 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
1f270 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f280 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
1f290 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1f2a0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
1f2b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29  ase( op==TK_GT )
1f2c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f2d0 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ( op==TK_GE );. 
1f2e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f2f0 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
1f300 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f310 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_NE );.      t
1f320 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1f330 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1f340 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f350 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f360 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f370 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f380 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1f390 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f3a0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f3b0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1f3c0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1f3d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f3e0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1f3f0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1f400 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1f410 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1f420 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ll);.      testc
1f430 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f440 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1f450 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1f460 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f470 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f480 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1f490 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20  K_ISNOT: {.     
1f4a0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
1f4b0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
1f4c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f4d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
1f4e0 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1f4f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f500 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1f510 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1f520 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1f530 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f540 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f550 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1f560 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f  gFree2);.      o
1f570 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  p = (pExpr->op==
1f580 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a  TK_IS) ? TK_NE :
1f590 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f   TK_EQ;.      co
1f5a0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1f5b0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f5c0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1f5d0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1f5e0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1f5f0 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  t, SQLITE_NULLEQ
1f600 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f610 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1f620 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f630 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1f640 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f650 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f660 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1f670 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1f680 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f690 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
1f6a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f6b0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
1f6c0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1f6d0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f6e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f6f0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1f700 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f710 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1f720 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
1f730 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f740 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f750 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f760 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1f770 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
1f780 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f790 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
1f7a0 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
1f7b0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1f7c0 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  , 0, jumpIfNull)
1f7d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f7e0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1f7f0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1f800 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
1f810 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75  : {.      if( ju
1f820 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  mpIfNull ){.    
1f830 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f840 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
1f850 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29  xpr, dest, dest)
1f860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f870 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49         int destI
1f880 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
1f890 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1f8a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f8b0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1f8c0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1f8d0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
1f8e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f8f0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1f900 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
1f910 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1f920 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1f930 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1f940 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f950 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f960 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
1f970 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1f980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1f990 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c  v, OP_IfNot, r1,
1f9a0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f9b0 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73  l!=0);.      tes
1f9c0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f9d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1f9e0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f9f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1fa00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1fa10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1fa20 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1fa30 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
1fa40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1fa50 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1fa60 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  2);.}../*.** Do 
1fa70 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
1fa80 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
1fa90 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
1faa0 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a  rn 0 if the two.
1fab0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
1fac0 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64  re completely id
1fad0 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e  entical.  Return
1fae0 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65   1 if they diffe
1faf0 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43  r only.** by a C
1fb00 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
1fb10 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c  at the top level
1fb20 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74  .  Return 2 if t
1fb30 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
1fb40 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68  nces.** other th
1fb50 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  an the top-level
1fb60 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
1fb70 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  r..**.** If any 
1fb80 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
1fb90 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
1fba0 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
1fbb0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
1fbc0 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
1fbd0 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
1fbe0 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
1fbf0 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
1fc00 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Tab..**.** The p
1fc10 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20  A side might be 
1fc20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
1fc30 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  R.  If that is t
1fc40 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69  he case and pB i
1fc50 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54  s.** not using T
1fc60 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69  K_REGISTER but i
1fc70 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69  s otherwise equi
1fc80 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69  valent, then sti
1fc90 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  ll return 0..**.
1fca0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  ** Sometimes thi
1fcb0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
1fcc0 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20  eturn 2 even if 
1fcd0 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69  the two expressi
1fce0 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72  ons.** really ar
1fcf0 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49  e equivalent.  I
1fd00 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76  f we cannot prov
1fd10 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
1fd20 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64  ssions are.** id
1fd30 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75  entical, we retu
1fd40 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20  rn 2 just to be 
1fd50 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69  safe.  So if thi
1fd60 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
1fd70 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75  urns 2, then you
1fd80 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b   do not really k
1fd90 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20  now for certain 
1fda0 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
1fdb0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
1fdc0 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20  e same.  But if 
1fdd0 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31  you get a 0 or 1
1fde0 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f   return, then yo
1fdf0 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65  u.** can be sure
1fe00 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
1fe10 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
1fe20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68  In the places wh
1fe30 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ere.** this rout
1fe40 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20  ine is used, it 
1fe50 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f  does not hurt to
1fe60 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20   get an extra 2 
1fe70 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d  - that.** just m
1fe80 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73  ight result in s
1fe90 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ome slightly slo
1fea0 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72  wer code.  But r
1feb0 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69  eturning.** an i
1fec0 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20  ncorrect 0 or 1 
1fed0 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
1fee0 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  malfunction..*/.
1fef0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1ff00 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c  ompare(Expr *pA,
1ff10 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69   Expr *pB, int i
1ff20 54 61 62 29 7b 0a 20 20 69 66 28 20 70 41 3d 3d  Tab){.  if( pA==
1ff30 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  0||pB==0 ){.    
1ff40 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20  return pB==pA ? 
1ff50 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 61 73 73  0 : 2;.  }.  ass
1ff60 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
1ff70 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f  Property(pA, EP_
1ff80 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1ff90 75 63 65 64 29 20 29 3b 0a 20 20 61 73 73 65 72  uced) );.  asser
1ffa0 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
1ffb0 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 54 6f  operty(pB, EP_To
1ffc0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1ffd0 65 64 29 20 29 3b 0a 20 20 69 66 28 20 45 78 70  ed) );.  if( Exp
1ffe0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c  rHasProperty(pA,
1fff0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 7c   EP_xIsSelect) |
20000 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
20010 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pB, EP_xIsSele
20020 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
20030 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 2;.  }.  if( (
20040 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pA->flags & EP_D
20050 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66  istinct)!=(pB->f
20060 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
20070 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ct) ) return 2;.
20080 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
20090 2d 3e 6f 70 20 26 26 20 28 70 41 2d 3e 6f 70 21  ->op && (pA->op!
200a0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20  =TK_REGISTER || 
200b0 70 41 2d 3e 6f 70 32 21 3d 70 42 2d 3e 6f 70 29  pA->op2!=pB->op)
200c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
200d0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
200e0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
200f0 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
20100 70 42 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20  pB, iTab)<2 ){. 
20110 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
20120 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d     }.    if( pB-
20130 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
20140 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
20150 6d 70 61 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c  mpare(pA, pB->pL
20160 65 66 74 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a  eft, iTab)<2 ){.
20170 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
20180 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
20190 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   2;.  }.  if( sq
201a0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
201b0 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e  (pA->pLeft, pB->
201c0 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72  pLeft, iTab) ) r
201d0 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 73  eturn 2;.  if( s
201e0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
201f0 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  e(pA->pRight, pB
20200 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
20210 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
20220 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
20230 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70  tCompare(pA->x.p
20240 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73  List, pB->x.pLis
20250 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
20260 6e 20 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69  n 2;.  if( pA->i
20270 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
20280 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  umn ) return 2;.
20290 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
202a0 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20  !=pB->iTable .  
202b0 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 52   && pA->op!=TK_R
202c0 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 28 70  EGISTER.   && (p
202d0 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  A->iTable!=iTab 
202e0 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61  || NEVER(pB->iTa
202f0 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72  ble>=0)) ) retur
20300 6e 20 32 3b 0a 20 20 69 66 28 20 45 78 70 72 48  n 2;.  if( ExprH
20310 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45  asProperty(pA, E
20320 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 7b 0a 20  P_IntValue) ){. 
20330 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
20340 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49  roperty(pB, EP_I
20350 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 41 2d 3e  ntValue) || pA->
20360 75 2e 69 56 61 6c 75 65 21 3d 70 42 2d 3e 75 2e  u.iValue!=pB->u.
20370 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  iValue ){.      
20380 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
20390 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e    }else if( pA->
203a0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op!=TK_COLUMN &&
203b0 20 41 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21 3d   ALWAYS(pA->op!=
203c0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26  TK_AGG_COLUMN) &
203d0 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 7b  & pA->u.zToken){
203e0 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
203f0 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f  Property(pB, EP_
20400 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 4e 45 56  IntValue) || NEV
20410 45 52 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d  ER(pB->u.zToken=
20420 3d 30 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  =0) ) return 2;.
20430 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
20440 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
20450 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a  u.zToken)!=0 ){.
20460 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d        return pA-
20470 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
20480 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20  ? 1 : 2;.    }. 
20490 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
204a0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
204b0 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
204c0 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20  ects.  Return 0 
204d0 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
204e0 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f  tical and .** no
204f0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64  n-zero if they d
20500 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
20510 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
20520 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
20530 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
20540 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
20550 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
20560 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
20570 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
20580 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
20590 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
205a0 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ab..**.** This r
205b0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74  outine might ret
205c0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72  urn non-zero for
205d0 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72   equivalent Expr
205e0 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f  Lists.  The.** o
205f0 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  nly consequence 
20600 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64  will be disabled
20610 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20   optimizations. 
20620 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
20630 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20  e.** must never 
20640 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
20650 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
20660 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65  ects are differe
20670 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66  nt, or.** a malf
20680 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  unction will res
20690 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  ult..**.** Two N
206a0 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65  ULL pointers are
206b0 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
206c0 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
206d0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a   a NULL pointer.
206e0 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72  ** always differ
206f0 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c  s from a non-NUL
20700 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  L pointer..*/.in
20710 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  t sqlite3ExprLis
20720 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73  tCompare(ExprLis
20730 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20  t *pA, ExprList 
20740 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
20750 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
20760 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20  A==0 && pB==0 ) 
20770 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
20780 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
20790 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
207a0 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e   pA->nExpr!=pB->
207b0 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31  nExpr ) return 1
207c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
207d0 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  A->nExpr; i++){.
207e0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41      Expr *pExprA
207f0 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pA->a[i].pExp
20800 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  r;.    Expr *pEx
20810 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70  prB = pB->a[i].p
20820 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41  Expr;.    if( pA
20830 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
20840 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  !=pB->a[i].sortO
20850 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b  rder ) return 1;
20860 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
20870 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
20880 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62  rA, pExprB, iTab
20890 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
208a0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
208b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
208c0 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f  ue if we can pro
208d0 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20  ve the pE2 will 
208e0 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69  always be true i
208f0 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65  f pE1 is.** true
20900 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
20910 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d  if we cannot com
20920 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20  plete the proof 
20930 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a  or if pE2 might.
20940 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78  ** be false.  Ex
20950 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
20960 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20    pE1: x==5     
20970 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20    pE2: x==5     
20980 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20          Result: 
20990 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
209a0 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a   x>0        pE2:
209b0 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
209c0 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
209d0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31  **     pE1: x=21
209e0 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31         pE2: x=21
209f0 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73   OR y=43     Res
20a00 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
20a10 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20   pE1: x!=123    
20a20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
20a30 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74  ULL    Result: t
20a40 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
20a50 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20  x!=?1      pE2: 
20a60 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
20a70 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
20a80 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e       pE1: x IS N
20a90 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e  ULL  pE2: x IS N
20aa0 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
20ab0 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
20ac0 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20  pE1: x IS ?2    
20ad0 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
20ae0 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61  LL    Reuslt: fa
20af0 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63  lse.**.** When c
20b00 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55  omparing TK_COLU
20b10 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e  MN nodes between
20b20 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66   pE1 and pE2, if
20b30 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72   pE2 has.** Expr
20b40 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61  .iTable<0 then a
20b50 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75  ssume a table nu
20b60 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54  mber given by iT
20b70 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69  ab..**.** When i
20b80 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20  n doubt, return 
20b90 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e  false.  Returnin
20ba0 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76  g true might giv
20bb0 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  e a performance.
20bc0 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20  ** improvement. 
20bd0 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65   Returning false
20be0 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70   might cause a p
20bf0 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
20c00 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20  tion, but.** it 
20c10 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65  will always give
20c20 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
20c30 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65  wer and is hence
20c40 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f   always safe..*/
20c50 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
20c60 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70 72  ImpliesExpr(Expr
20c70 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32   *pE1, Expr *pE2
20c80 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
20c90 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
20ca0 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20  mpare(pE1, pE2, 
20cb0 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iTab)==0 ){.    
20cc0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
20cd0 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
20ce0 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65  OR.   && (sqlite
20cf0 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
20d00 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74  (pE1, pE2->pLeft
20d10 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20  , iTab).        
20d20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45       || sqlite3E
20d30 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
20d40 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c  E1, pE2->pRight,
20d50 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20   iTab) ).  ){.  
20d60 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
20d70 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
20d80 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20  K_NOTNULL.   && 
20d90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
20da0 72 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70  re(pE1->pLeft, p
20db0 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
20dc0 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e  ==0.   && (pE1->
20dd0 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26  op!=TK_ISNULL &&
20de0 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29   pE1->op!=TK_IS)
20df0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
20e00 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
20e10 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20   0;.}../*.** An 
20e20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
20e30 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
20e40 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
20e50 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
20e60 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72  * to count refer
20e70 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63  ences to table c
20e80 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72  olumns in the ar
20e90 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a  guments of an .*
20ea0 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
20eb0 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74  tion, in order t
20ec0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a  o implement the.
20ed0 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
20ee0 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74  onThisSrc() rout
20ef0 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ine..*/.struct S
20f00 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c  rcCount {.  SrcL
20f10 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  ist *pSrc;   /* 
20f20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46  One particular F
20f30 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ROM clause in a 
20f40 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a  nested query */.
20f50 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20    int nThis;    
20f60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20f70 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
20f80 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73  lumns in pSrcLis
20f90 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65  t */.  int nOthe
20fa0 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  r;      /* Numbe
20fb0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
20fc0 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74  to columns in ot
20fd0 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73  her FROM clauses
20fe0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
20ff0 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
21000 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
21010 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74  columns..*/.stat
21020 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f  ic int exprSrcCo
21030 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  unt(Walker *pWal
21040 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
21050 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45  ){.  /* The NEVE
21060 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  R() on the secon
21070 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73  d term is becaus
21080 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  e sqlite3Functio
21090 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20  nUsesThisSrc(). 
210a0 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61   ** is always ca
210b0 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69  lled before sqli
210c0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
210d0 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73  gregates() and s
210e0 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f  o the.  ** TK_CO
210f0 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79  LUMNs have not y
21100 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  et been converte
21110 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  d into TK_AGG_CO
21120 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73  LUMN.  If.  ** s
21130 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
21140 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75  esThisSrc() is u
21150 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  sed differently 
21160 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  in the future, t
21170 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20  he.  ** NEVER() 
21180 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
21190 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66  removed. */.  if
211a0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
211b0 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28  COLUMN || NEVER(
211c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
211d0 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20  G_COLUMN) ){.   
211e0 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
211f0 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d  ct SrcCount *p =
21200 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63   pWalker->u.pSrc
21210 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69  Count;.    SrcLi
21220 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
21230 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  rc;.    for(i=0;
21240 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
21250 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
21260 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
21270 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
21280 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
21290 20 20 20 20 69 66 28 20 69 3c 70 53 72 63 2d 3e      if( i<pSrc->
212a0 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  nSrc ){.      p-
212b0 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65  >nThis++;.    }e
212c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  lse{.      p->nO
212d0 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ther++;.    }.  
212e0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
212f0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
21300 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
21310 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ny of the argume
21320 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72  nts to the pExpr
21330 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65   Function refere
21340 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e  nce.** pSrcList.
21350 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
21360 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20   they do.  Also 
21370 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  return true if t
21380 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  he function.** h
21390 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  as no arguments 
213a0 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73  or has only cons
213b0 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
213c0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
213d0 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65   pExpr.** refere
213e0 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74  nces columns but
213f0 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   not columns of 
21400 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20  tables found in 
21410 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74  pSrcList..*/.int
21420 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
21430 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72  UsesThisSrc(Expr
21440 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74   *pExpr, SrcList
21450 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57   *pSrcList){.  W
21460 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
21470 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a  t SrcCount cnt;.
21480 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
21490 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
214a0 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74  TION );.  memset
214b0 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
214c0 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ));.  w.xExprCal
214d0 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43  lback = exprSrcC
214e0 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63  ount;.  w.u.pSrc
214f0 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20  Count = &cnt;.  
21500 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c  cnt.pSrc = pSrcL
21510 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73  ist;.  cnt.nThis
21520 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68   = 0;.  cnt.nOth
21530 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
21540 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77  3WalkExprList(&w
21550 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
21560 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e  );.  return cnt.
21570 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e  nThis>0 || cnt.n
21580 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Other==0;.}../*.
21590 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
215a0 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
215b0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72  Info->aCol[] arr
215c0 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
215d0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
215e0 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
215f0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
21600 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
21610 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
21620 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
21630 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a  Column(sqlite3 *
21640 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
21650 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
21660 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
21670 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
21680 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20  te(.       db,. 
21690 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
216a0 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  l,.       sizeof
216b0 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29  (pInfo->aCol[0])
216c0 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
216d0 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
216e0 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
216f0 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
21700 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
21710 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
21720 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72  nfo->aFunc[] arr
21730 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
21740 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
21750 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
21760 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
21770 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
21780 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
21790 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
217a0 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62  Func(sqlite3 *db
217b0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
217c0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
217d0 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c  nfo->aFunc = sql
217e0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
217f0 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20  e(.       db, . 
21800 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75        pInfo->aFu
21810 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  nc,.       sizeo
21820 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
21830 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  ]),.       &pInf
21840 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->nFunc,.      
21850 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
21860 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
21870 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
21880 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  xprCallback for 
21890 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20  a tree walker.  
218a0 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  It is used to.**
218b0 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
218c0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
218d0 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
218e0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
218f0 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
21900 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
21910 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
21920 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
21930 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65  eAggregate(Walke
21940 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
21950 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
21960 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
21970 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
21980 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20  >u.pNC;.  Parse 
21990 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
219a0 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
219b0 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
219c0 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
219d0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
219e0 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b  = pNC->pAggInfo;
219f0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
21a00 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
21a10 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
21a20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
21a30 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  UMN: {.      tes
21a40 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
21a50 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
21a60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21a70 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
21a80 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
21a90 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
21aa0 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   if the column i
21ab0 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
21ac0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
21ad0 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  OM.      ** clau
21ae0 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
21af0 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  ate query */.   
21b00 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53     if( ALWAYS(pS
21b10 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  rcList!=0) ){.  
21b20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
21b30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
21b40 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a   = pSrcList->a;.
21b50 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
21b60 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
21b70 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
21b80 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
21b90 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
21ba0 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pCol;.          
21bb0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
21bc0 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
21bd0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
21be0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
21bf0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
21c00 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
21c10 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
21c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
21c30 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
21c40 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
21c50 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
21c60 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
21c70 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
21c80 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
21c90 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
21ca0 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
21cb0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
21cc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
21cd0 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
21ce0 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
21cf0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
21d00 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
21d10 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
21d20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
21d30 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
21d40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
21d50 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
21d60 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e     pCol = pAggIn
21d70 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  fo->aCol;.      
21d80 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
21d90 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
21da0 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  mn; k++, pCol++)
21db0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21dc0 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  if( pCol->iTable
21dd0 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
21de0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
21df0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
21e00 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
21e10 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
21e20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21e30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21e40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21e50 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70         if( (k>=p
21e60 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
21e70 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
21e80 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66  & (k = addAggInf
21e90 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e  oColumn(pParse->
21ea0 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d  db, pAggInfo))>=
21eb0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  0 .            )
21ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21ed0 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
21ee0 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20  ->aCol[k];.     
21ef0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
21f00 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
21f10 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
21f20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
21f30 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
21f50 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
21f60 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
21f70 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
21f80 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
21f90 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
21fa0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
21fb0 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
21fd0 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
21fe0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
21ff0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
22000 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
22010 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
22020 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
22030 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
22040 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
22050 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
22060 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
22070 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
22080 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
22090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
220a0 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
220c0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
220d0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
220f0 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
22100 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
22110 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
22120 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
22130 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
22140 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22160 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
22170 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
22180 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22190 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
221a0 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
221b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
221c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
221d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
221e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
22200 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
22210 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
22220 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
22230 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22240 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
22250 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
22260 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
22280 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22290 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
222a0 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
222b0 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
222c0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
222d0 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
222e0 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
222f0 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
22300 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
22310 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
22320 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
22330 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
22340 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
22350 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
22360 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
22370 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
22380 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
22390 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
223a0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
223b0 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65  prSetIrreducible
223c0 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
223d0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
223e0 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
223f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
22400 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
22410 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
22420 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
22430 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20  = (i16)k;.      
22440 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22450 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69         } /* endi
22460 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  f pExpr->iTable=
22470 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
22480 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  */.        } /* 
22490 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53  end loop over pS
224a0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  rcList */.      
224b0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
224c0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
224d0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
224e0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
224f0 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
22500 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75  ags & NC_InAggFu
22510 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  nc)==0.       &&
22520 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
22530 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70  Depth==pExpr->op
22540 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  2.      ){.     
22550 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
22560 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
22570 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
22580 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
22590 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
225a0 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
225b0 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
225c0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
225d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
225e0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
225f0 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
22600 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
22610 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
22620 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
22630 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
22640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
22650 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
22660 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
22670 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20  , pExpr, -1)==0 
22680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
22690 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
226a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
226b0 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
226c0 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
226d0 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
226e0 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
226f0 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
22700 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
22710 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
22720 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
22730 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
22740 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
22750 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
22760 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
22770 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
22780 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
22790 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
227a0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
227b0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
227c0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
227d0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
227e0 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
227f0 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
22800 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
22810 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
22820 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
22830 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
22840 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
22850 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
22860 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
22870 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
22880 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
22890 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
228a0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
228b0 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
228c0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
228d0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c  r->u.zToken, sql
228e0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78  ite3Strlen30(pEx
228f0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20  pr->u.zToken),. 
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22910 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74    pExpr->x.pList
22920 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   ? pExpr->x.pLis
22930 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
22940 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
22950 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
22960 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
22970 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
22980 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
22990 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
229a0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
229b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
229c0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
229d0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
229e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
229f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22a00 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
22a10 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
22a20 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
22a30 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
22a40 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
22a50 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
22a60 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  rt( !ExprHasAnyP
22a70 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
22a80 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
22a90 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
22aa0 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75     ExprSetIrredu
22ab0 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20 20  cible(pExpr);.  
22ac0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
22ad0 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20  g = (i16)i;.    
22ae0 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
22af0 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
22b00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
22b10 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
22b20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
22b30 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
22b40 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
22b50 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
22b60 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
22b70 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
22b80 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
22b90 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ect(Walker *pWal
22ba0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
22bb0 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  lect){.  UNUSED_
22bc0 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65  PARAMETER(pWalke
22bd0 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  r);.  UNUSED_PAR
22be0 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
22bf0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
22c00 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
22c10 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78   Analyze the pEx
22c20 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  pr expression lo
22c30 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
22c40 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
22c50 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
22c60 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
22c70 62 65 20 61 64 64 65 64 20 74 6f 20 41 67 67 49  be added to AggI
22c80 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20  nfo object that 
22c90 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a  pNC->pAggInfo.**
22ca0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64   points to.  Add
22cb0 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20  itional entries 
22cc0 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20  are made on the 
22cd0 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61  AggInfo object a
22ce0 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a  s.** necessary..
22cf0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
22d00 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
22d10 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  e called after t
22d20 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
22d30 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a  s been.** analyz
22d40 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73  ed by sqlite3Res
22d50 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e  olveExprNames().
22d60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22d70 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
22d80 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78  gates(NameContex
22d90 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45  t *pNC, Expr *pE
22da0 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  xpr){.  Walker w
22db0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
22dc0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
22dd0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
22de0 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
22df0 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  te;.  w.xSelectC
22e00 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
22e10 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
22e20 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  ect;.  w.u.pNC =
22e30 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20   pNC;.  assert( 
22e40 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30  pNC->pSrcList!=0
22e50 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   );.  sqlite3Wal
22e60 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
22e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
22e80 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
22e90 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66  zeAggregates() f
22ea0 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
22eb0 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70  ion in an.** exp
22ec0 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52  ression list.  R
22ed0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
22ee0 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
22ef0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
22f00 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c   found, the anal
22f10 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72  ysis is cut shor
22f20 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
22f30 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
22f40 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74  List(NameContext
22f50 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20   *pNC, ExprList 
22f60 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63  *pList){.  struc
22f70 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
22f80 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
22f90 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
22fa0 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c      for(pItem=pL
22fb0 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
22fc0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
22fd0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
22fe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
22ff0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
23000 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  NC, pItem->pExpr
23010 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
23020 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
23030 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69   single new regi
23040 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20  ster for use to 
23050 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d  hold some interm
23060 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a  ediate result..*
23070 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
23080 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
23090 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50  Parse){.  if( pP
230a0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d  arse->nTempReg==
230b0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
230c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
230d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
230e0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d  rse->aTempReg[--
230f0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
23100 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  ];.}../*.** Deal
23110 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65  locate a registe
23120 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61  r, making availa
23130 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f  ble for reuse fo
23140 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
23150 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  purpose..**.** I
23160 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
23170 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
23180 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75  used by the colu
23190 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a  mn cache, then.*
231a0 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74 69 6f  * the dallocatio
231b0 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  n is deferred un
231c0 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  til the column c
231d0 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75  ache line that u
231e0 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ses.** the regis
231f0 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c  ter becomes stal
23200 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
23210 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
23220 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23230 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28  int iReg){.  if(
23240 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d   iReg && pParse-
23250 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
23260 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
23270 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74  pReg) ){.    int
23280 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79   i;.    struct y
23290 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20  ColCache *p;.   
232a0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
232b0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
232c0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
232d0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
232e0 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67       if( p->iReg
232f0 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
23300 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31    p->tempReg = 1
23310 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
23320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23330 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
23340 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
23350 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
23360 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
23370 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
23380 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
23390 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
233a0 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e   registers.*/.in
233b0 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
233c0 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
233d0 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  rse, int nReg){.
233e0 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20    int i, n;.  i 
233f0 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  = pParse->iRange
23400 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73  Reg;.  n = pPars
23410 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->nRangeReg;.  
23420 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20  if( nReg<=n ){. 
23430 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65 64     assert( !used
23440 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
23450 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20  arse, i, i+n-1) 
23460 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  );.    pParse->i
23470 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67  RangeReg += nReg
23480 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  ;.    pParse->nR
23490 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b  angeReg -= nReg;
234a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20  .  }else{.    i 
234b0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
234c0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
234d0 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a  em += nReg;.  }.
234e0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f    return i;.}.vo
234f0 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
23500 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  eTempRange(Parse
23510 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
23520 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
23530 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
23540 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
23550 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69  iReg, nReg);.  i
23560 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e  f( nReg>pParse->
23570 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20  nRangeReg ){.   
23580 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
23590 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  eg = nReg;.    p
235a0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
235b0 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
235c0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74  /*.** Mark all t
235d0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
235e0 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76  rs as being unav
235f0 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73  ailable for reus
23600 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
23610 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
23620 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
23630 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54  e){.  pParse->nT
23640 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50  empReg = 0;.  pP
23650 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
23660 3d 20 30 3b 0a 7d 0a                             = 0;.}.