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

Artifact 299f1de324676599b818e587b77e683978514461:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0470: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0480: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0490: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
04a0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
04b0: 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
04c0: 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  t( pExpr->flags&
04d0: 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a  EP_xIsSelect );.
04e0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
04f0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0500: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
0510: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
0520: 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  xpr);.  }.#ifnde
0530: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
0540: 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  ST.  if( op==TK_
0550: 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73 65  CAST ){.    asse
0560: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0570: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
0580: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
0590: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 66  return sqlite3Af
05a0: 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
05b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7d  ->u.zToken);.  }
05c0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f  .#endif.  if( (o
05d0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
05e0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   || op==TK_COLUM
05f0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49  N || op==TK_REGI
0600: 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45 78  STER) .   && pEx
0610: 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b  pr->pTab!=0.  ){
0620: 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52  .    /* op==TK_R
0630: 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72  EGISTER && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
0650: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
0660: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
0670: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0680: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0690: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
06a0: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
06b0: 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ster */.    int 
06c0: 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  j = pExpr->iColu
06d0: 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20  mn;.    if( j<0 
06e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
06f0: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
0700: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0710: 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d  pTab && j<pExpr-
0720: 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  >pTab->nCol );. 
0730: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
0740: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61  >pTab->aCol[j].a
0750: 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72  ffinity;.  }.  r
0760: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66  eturn pExpr->aff
0770: 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inity;.}../*.** 
0780: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  Set the collatin
0790: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
07a0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
07b0: 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74  to be the collat
07c0: 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
07d0: 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e  named by pToken.
07e0: 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e     Return a poin
07f0: 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70  ter to a new Exp
0800: 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69  r node that.** i
0810: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f  mplements the CO
0820: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a  LLATE operator..
0830: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
0840: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
0850: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20  or occurs, that 
0860: 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65 64  fact is recorded
0870: 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a   in pParse->db.*
0880: 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72 20  * and the pExpr 
0890: 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65 74  parameter is ret
08a0: 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e  urned unchanged.
08b0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
08c0: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
08d0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
08e0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
08f0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
0900: 65 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e  e){.  if( pCollN
0910: 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  ame->n>0 ){.    
0920: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
0930: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
0940: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c  arse->db, TK_COL
0950: 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c  LATE, pCollName,
0960: 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65   1);.    if( pNe
0970: 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  w ){.      pNew-
0980: 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a  >pLeft = pExpr;.
0990: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
09a0: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b  s |= EP_Collate;
09b0: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
09c0: 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  New;.    }.  }. 
09d0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
09e0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
09f0: 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
0a00: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
0a10: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  , Expr *pExpr, c
0a20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a  onst char *zC){.
0a30: 20 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73    Token s;.  ass
0a40: 65 72 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20  ert( zC!=0 );.  
0a50: 73 2e 7a 20 3d 20 7a 43 3b 0a 20 20 73 2e 6e 20  s.z = zC;.  s.n 
0a60: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
0a70: 30 28 73 2e 7a 29 3b 0a 20 20 72 65 74 75 72 6e  0(s.z);.  return
0a80: 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
0a90: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72  ollateToken(pPar
0aa0: 73 65 2c 20 70 45 78 70 72 2c 20 26 73 29 3b 0a  se, pExpr, &s);.
0ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20 6f 76  }../*.** Skip ov
0ac0: 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c 41 54  er any TK_COLLAT
0ad0: 45 20 61 6e 64 2f 6f 72 20 54 4b 5f 41 53 20 6f  E and/or TK_AS o
0ae0: 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20  perators at the 
0af0: 72 6f 6f 74 20 6f 66 0a 2a 2a 20 61 6e 20 65 78  root of.** an ex
0b00: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70  pression..*/.Exp
0b10: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53 6b  r *sqlite3ExprSk
0b20: 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20 2a  ipCollate(Expr *
0b30: 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65 28  pExpr){.  while(
0b40: 20 70 45 78 70 72 20 26 26 20 28 70 45 78 70 72   pExpr && (pExpr
0b50: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0b60: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0b70: 4b 5f 41 53 29 20 29 7b 0a 20 20 20 20 70 45 78  K_AS) ){.    pEx
0b80: 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pr = pExpr->pLef
0b90: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
0ba0: 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pExpr;.}../*.** 
0bb0: 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 6c 61  Return the colla
0bc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
0bd0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
0be0: 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a 20 74 68   pExpr. If.** th
0bf0: 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65  ere is no define
0c00: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
0c10: 65 6e 63 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ence, return NUL
0c20: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  L..**.** The col
0c30: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
0c40: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
0c50: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
0c60: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
0c70: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
0c80: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
0c90: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
0ca0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
0cb0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
0cc0: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
0cd0: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
0ce0: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
0cf0: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
0d00: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
0d10: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
0d20: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
0d30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0d40: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
0d50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0d60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
0d70: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
0d80: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
0d90: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
0da0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
0db0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  >op;.    if( op=
0dc0: 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d  =TK_CAST || op==
0dd0: 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20  TK_UPLUS ){.    
0de0: 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a    p = p->pLeft;.
0df0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
0e00: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
0e10: 28 20 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ( op!=TK_REGISTE
0e20: 52 20 7c 7c 20 70 2d 3e 6f 70 32 21 3d 54 4b 5f  R || p->op2!=TK_
0e30: 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 69  COLLATE );.    i
0e40: 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  f( op==TK_COLLAT
0e50: 45 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  E ){.      pColl
0e60: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
0e70: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
0e80: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
0e90: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
0ea0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
0eb0: 28 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  ( p->pTab!=0.   
0ec0: 20 20 26 26 20 28 6f 70 3d 3d 54 4b 5f 41 47 47    && (op==TK_AGG
0ed0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
0ee0: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
0ef0: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
0f00: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
0f10: 54 52 49 47 47 45 52 29 0a 20 20 20 20 29 7b 0a  TRIGGER).    ){.
0f20: 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f        /* op==TK_
0f30: 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70  REGISTER && p->p
0f40: 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77  Tab!=0 happens w
0f50: 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72  hen pExpr was or
0f60: 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a  iginally.      *
0f70: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
0f80: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
0f90: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
0fa0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
0fb0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
0fc0: 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b   j = p->iColumn;
0fd0: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20  .      if( j>=0 
0fe0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
0ff0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1000: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
1010: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1020: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1030: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1040: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
1050: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1060: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1070: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
1080: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
1090: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
10a0: 2d 3e 70 4c 65 66 74 29 20 26 26 20 28 70 2d 3e  ->pLeft) && (p->
10b0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
10c0: 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b  P_Collate)!=0 ){
10d0: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  .        p = p->
10e0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pLeft;.      }el
10f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  se{.        p = 
1100: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1110: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1120: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1130: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1140: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
1150: 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b  Parse, pColl) ){
1160: 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b   .    pColl = 0;
1170: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
1180: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  oll;.}../*.** pE
1190: 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e  xpr is an operan
11a0: 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  d of a compariso
11b0: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66  n operator.  aff
11c0: 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  2 is the.** type
11d0: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
11e0: 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20   other operand. 
11f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1200: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70  turns the.** typ
1210: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
1220: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
1230: 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
1240: 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63  n operator..*/.c
1250: 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  har sqlite3Compa
1260: 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  reAffinity(Expr 
1270: 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66  *pExpr, char aff
1280: 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20  2){.  char aff1 
1290: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
12a0: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
12b0: 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32  if( aff1 && aff2
12c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20   ){.    /* Both 
12d0: 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d  sides of the com
12e0: 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75  parison are colu
12f0: 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20  mns. If one has 
1300: 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61  numeric.    ** a
1310: 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61  ffinity, use tha
1320: 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  t. Otherwise use
1330: 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20   no affinity..  
1340: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
1350: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1360: 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73  inity(aff1) || s
1370: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
1380: 66 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b  ffinity(aff2) ){
1390: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
13a0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
13b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13d0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  _AFF_NONE;.    }
13e0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66  .  }else if( !af
13f0: 66 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20  f1 && !aff2 ){. 
1400: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69     /* Neither si
1410: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
1420: 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  ison is a column
1430: 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20  .  Compare the. 
1440: 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69     ** results di
1450: 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  rectly..    */. 
1460: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1470: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c  _AFF_NONE;.  }el
1480: 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73  se{.    /* One s
1490: 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  ide is a column,
14a0: 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f   the other is no
14b0: 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d  t. Use the colum
14c0: 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  ns affinity. */.
14d0: 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31      assert( aff1
14e0: 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29  ==0 || aff2==0 )
14f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66  ;.    return (af
1500: 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a  f1 + aff2);.  }.
1510: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1520: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  s a comparison o
1530: 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e  perator.  Return
1540: 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69   the type affini
1550: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  ty that should.*
1560: 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20  * be applied to 
1570: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72  both operands pr
1580: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65  ior to doing the
1590: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a   comparison..*/.
15a0: 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70  static char comp
15b0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45  arisonAffinity(E
15c0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63  xpr *pExpr){.  c
15d0: 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72  har aff;.  asser
15e0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
15f0: 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _EQ || pExpr->op
1600: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72  ==TK_IN || pExpr
1610: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20  ->op==TK_LT ||. 
1620: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1630: 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78  op==TK_GT || pEx
1640: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c  pr->op==TK_GE ||
1650: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1660: 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  E ||.          p
1670: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20  Expr->op==TK_NE 
1680: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1690: 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IS || pExpr->op
16a0: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
16b0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
16c0: 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20  Left );.  aff = 
16d0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
16e0: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
16f0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
1700: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66  pRight ){.    af
1710: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1720: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1730: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a  ->pRight, aff);.
1740: 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
1750: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1760: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1770: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   ){.    aff = sq
1780: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
1790: 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53  nity(pExpr->x.pS
17a0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
17b0: 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b  [0].pExpr, aff);
17c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66  .  }else if( !af
17d0: 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  f ){.    aff = S
17e0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
17f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
1800: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
1810: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
1820: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e   expression, eg.
1830: 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e   '=', '<', IN(..
1840: 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61  .) etc..** idx_a
1850: 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61  ffinity is the a
1860: 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e  ffinity of an in
1870: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65  dexed column. Re
1880: 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20  turn true.** if 
1890: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61  the index with a
18a0: 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69  ffinity idx_affi
18b0: 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64  nity may be used
18c0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
18d0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
18e0: 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74  in pExpr..*/.int
18f0: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
1900: 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45  inityOk(Expr *pE
1910: 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66  xpr, char idx_af
1920: 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20  finity){.  char 
1930: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
1940: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
1950: 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29  .  switch( aff )
1960: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1970: 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20  E_AFF_NONE:.    
1980: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1990: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
19a0: 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75  TEXT:.      retu
19b0: 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  rn idx_affinity=
19c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
19d0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
19e0: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
19f0: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1a00: 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74  nity(idx_affinit
1a10: 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  y);.  }.}../*.**
1a20: 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76   Return the P5 v
1a30: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
1a40: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62   be used for a b
1a50: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
1a60: 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45  .** opcode (OP_E
1a70: 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75  q, OP_Ge etc.) u
1a80: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  sed to compare p
1a90: 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32  Expr1 and pExpr2
1aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62  ..*/.static u8 b
1ab0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45  inaryCompareP5(E
1ac0: 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70  xpr *pExpr1, Exp
1ad0: 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a  r *pExpr2, int j
1ae0: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38  umpIfNull){.  u8
1af0: 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c   aff = (char)sql
1b00: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1b10: 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20  (pExpr2);.  aff 
1b20: 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d  = (u8)sqlite3Com
1b30: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
1b40: 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29  pr1, aff) | (u8)
1b50: 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65  jumpIfNull;.  re
1b60: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1b70: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1b80: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61  ter to the colla
1b90: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68  tion sequence th
1ba0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
1bb0: 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79  d by.** a binary
1bc0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
1bd0: 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70  ator comparing p
1be0: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
1bf0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65  .**.** If the le
1c00: 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ft hand expressi
1c10: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
1c20: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65  ng sequence type
1c30: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
1c40: 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  used. Otherwise 
1c50: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1c60: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
1c70: 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73  ight hand expres
1c80: 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c  sion.** is used,
1c90: 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20   or the default 
1ca0: 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74  (BINARY) if neit
1cb0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68  her expression h
1cc0: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  as a collating.*
1cd0: 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72  * type..**.** Ar
1ce0: 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62  gument pRight (b
1cf0: 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61  ut not pLeft) ma
1d00: 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  y be a null poin
1d10: 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ter. In this cas
1d20: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  e,.** it is not 
1d30: 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43  considered..*/.C
1d40: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42  ollSeq *sqlite3B
1d50: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
1d60: 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Seq(.  Parse *pP
1d70: 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70  arse, .  Expr *p
1d80: 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70  Left, .  Expr *p
1d90: 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53  Right.){.  CollS
1da0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73  eq *pColl;.  ass
1db0: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
1dc0: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
1dd0: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
1de0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1df0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1e00: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
1e10: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
1e20: 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66  ht && (pRight->f
1e30: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1e40: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  e)!=0 ){.    pCo
1e50: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1e60: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1e70: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
1e80: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
1e90: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1ea0: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
1eb0: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
1ec0: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  ){.      pColl =
1ed0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1ee0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
1ef0: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ht);.    }.  }. 
1f00: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
1f10: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1f20: 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
1f30: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1f40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1f50: 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61  odeCompare(.  Pa
1f60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1f70: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28  /* The parsing (
1f80: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1f90: 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ing) context */.
1fa0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
1fb0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
1fc0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
1fd0: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f  r *pRight,     /
1fe0: 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72  * The right oper
1ff0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63  and */.  int opc
2000: 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ode,       /* Th
2010: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63  e comparison opc
2020: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31  ode */.  int in1
2030: 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65  , int in2, /* Re
2040: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f  gister holding o
2050: 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74  perands */.  int
2060: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
2070: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
2080: 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a  rue.  */.  int j
2090: 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
20a0: 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66  If true, jump if
20b0: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
20c0: 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  is NULL */.){.  
20d0: 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64  int p5;.  int ad
20e0: 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dr;.  CollSeq *p
20f0: 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74  4;..  p4 = sqlit
2100: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
2110: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2120: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
2130: 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p5 = binaryComp
2140: 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69  areP5(pLeft, pRi
2150: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
2160: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
2170: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61  e3VdbeAddOp4(pPa
2180: 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f  rse->pVdbe, opco
2190: 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69  de, in2, dest, i
21a0: 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n1,.            
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
21c0: 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c  void*)p4, P4_COL
21d0: 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33  LSEQ);.  sqlite3
21e0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61  VdbeChangeP5(pPa
21f0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29  rse->pVdbe, (u8)
2200: 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  p5);.  return ad
2210: 64 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dr;.}..#if SQLIT
2220: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
2230: 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  >0./*.** Check t
2240: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65  hat argument nHe
2250: 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61  ight is less tha
2260: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
2270: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70  e maximum.** exp
2280: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c  ression depth al
2290: 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20  lowed. If it is 
22a0: 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  not, leave an er
22b0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a  ror message in.*
22c0: 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74  * pParse..*/.int
22d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
22e0: 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  kHeight(Parse *p
22f0: 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67  Parse, int nHeig
2300: 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ht){.  int rc = 
2310: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
2320: 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72   mxHeight = pPar
2330: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
2340: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
2350: 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e  _DEPTH];.  if( n
2360: 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20  Height>mxHeight 
2370: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
2380: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
2390: 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69         "Expressi
23a0: 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c  on tree is too l
23b0: 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65  arge (maximum de
23c0: 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67  pth %d)", mxHeig
23d0: 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  ht.    );.    rc
23e0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
23f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2400: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;.}../* The foll
2410: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
2420: 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45  tions, heightOfE
2430: 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45  xpr(), heightOfE
2440: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64  xprList().** and
2450: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2460: 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  ), are used to d
2470: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
2480: 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f  imum height.** o
2490: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
24a0: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
24b0: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
24c0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
24d0: 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
24e0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
24f0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
2500: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2510: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
2520: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
2530: 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65  by pnHeight, the
2540: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
2550: 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48  r, then set *pnH
2560: 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a  eight to that.**
2570: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
2580: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
2590: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
25a0: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
25b0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
25c0: 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65  p->nHeight>*pnHe
25d0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  ight ){.      *p
25e0: 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65  nHeight = p->nHe
25f0: 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
2600: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
2610: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45  ightOfExprList(E
2620: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
2630: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2640: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
2650: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2660: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  <p->nExpr; i++){
2670: 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45  .      heightOfE
2680: 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70  xpr(p->a[i].pExp
2690: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
26a0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
26b0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65   void heightOfSe
26c0: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
26d0: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
26e0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68    if( p ){.    h
26f0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2700: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
2710: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2720: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
2730: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2740: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
2750: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
2760: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2770: 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e  r(p->pOffset, pn
2780: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2790: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
27a0: 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68  >pEList, pnHeigh
27b0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
27c0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
27d0: 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  upBy, pnHeight);
27e0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
27f0: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
2800: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
2810: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
2820: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65  (p->pPrior, pnHe
2830: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
2840: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
2850: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
2860: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
2870: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
2880: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
2890: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
28a0: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
28b0: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
28c0: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
28d0: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
28e0: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
28f0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
2900: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
2910: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
2920: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
2930: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
2940: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
2950: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2960: 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  d exprSetHeight(
2970: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
2980: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
2990: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
29a0: 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  Left, &nHeight);
29b0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
29c0: 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69  p->pRight, &nHei
29d0: 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72  ght);.  if( Expr
29e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
29f0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
2a00: 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65      heightOfSele
2a10: 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  ct(p->x.pSelect,
2a20: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65   &nHeight);.  }e
2a30: 6c 73 65 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  lse{.    heightO
2a40: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70  fExprList(p->x.p
2a50: 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  List, &nHeight);
2a60: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
2a70: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
2a80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2a90: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
2aa0: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
2ab0: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
2ac0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
2ad0: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
2ae0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
2af0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
2b00: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
2b10: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
2b20: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
2b30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2b40: 78 70 72 53 65 74 48 65 69 67 68 74 28 50 61 72  xprSetHeight(Par
2b50: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2b60: 20 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48   *p){.  exprSetH
2b70: 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69  eight(p);.  sqli
2b80: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
2b90: 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48  ht(pParse, p->nH
2ba0: 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eight);.}../*.**
2bb0: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   Return the maxi
2bc0: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
2bd0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
2be0: 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20  e referenced.** 
2bf0: 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  by the select st
2c00: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
2c10: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  s an argument..*
2c20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2c30: 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65  ectExprHeight(Se
2c40: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
2c50: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
2c60: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c  eightOfSelect(p,
2c70: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65   &nHeight);.  re
2c80: 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a  turn nHeight;.}.
2c90: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
2ca0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
2cb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2cc0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
2cd0: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
2ce0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
2cf0: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
2d00: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
2d10: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
2d20: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
2d30: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
2d40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
2d50: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
2d60: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
2d70: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
2d80: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
2d90: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
2da0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
2db0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
2dc0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
2dd0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
2de0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
2df0: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
2e00: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
2e10: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
2e20: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
2e30: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
2e40: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
2e50: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
2e60: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
2e70: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
2e80: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 61 6e  ing is performan
2e90: 63 65 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65  ce.  The deQuote
2ea0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
2eb0: 20 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b   ignored if pTok
2ec0: 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66  en is NULL or if
2ed0: 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20   the token does 
2ee0: 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f  not.** appear to
2ef0: 20 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20   be quoted.  If 
2f00: 74 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20  the quotes were 
2f10: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e  of the form "...
2f20: 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  " (double-quotes
2f30: 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50  ).** then the EP
2f40: 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20  _DblQuoted flag 
2f50: 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78  is set on the ex
2f60: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a  pression node..*
2f70: 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73  *.** Special cas
2f80: 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e  e:  If op==TK_IN
2f90: 54 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e  TEGER and pToken
2fa0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
2fb0: 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20  ing that.** can 
2fc0: 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  be translated in
2fd0: 74 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  to a 32-bit inte
2fe0: 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  ger, then the to
2ff0: 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74  ken is not.** st
3000: 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e  ored in u.zToken
3010: 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  .  Instead, the 
3020: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69  integer values i
3030: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
3040: 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74  o u.iValue and t
3050: 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
3060: 6c 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20  lag is set.  No 
3070: 65 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a  extra storage.**
3080: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f   is allocated to
3090: 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65   hold the intege
30a0: 72 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64  r text and the d
30b0: 65 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69  equote flag is i
30c0: 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  gnored..*/.Expr 
30d0: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f  *sqlite3ExprAllo
30e0: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
30f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3100: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
3110: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
3120: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
3130: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
3140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3150: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
3160: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65   */.  const Toke
3170: 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a  n *pToken,    /*
3180: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
3190: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
31a0: 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65  */.  int dequote
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31c0: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
31d0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
31e0: 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  ew;.  int nExtra
31f0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c   = 0;.  int iVal
3200: 75 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ue = 0;..  if( p
3210: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  Token ){.    if(
3220: 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20   op!=TK_INTEGER 
3230: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a  || pToken->z==0.
3240: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
3250: 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f  ite3GetInt32(pTo
3260: 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29  ken->z, &iValue)
3270: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78  ==0 ){.      nEx
3280: 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b  tra = pToken->n+
3290: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
32a0: 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20   iValue>=0 );.  
32b0: 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d    }.  }.  pNew =
32c0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
32d0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
32e0: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
32f0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
3300: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
3310: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
3320: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
3330: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
3340: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
3350: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
3360: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
3370: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
3380: 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
3390: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Value;.      }el
33a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
33b0: 63 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  c;.        pNew-
33c0: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
33d0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
33e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
33f0: 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f  ken->z!=0 || pTo
3400: 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  ken->n==0 );.   
3410: 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d       if( pToken-
3420: 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77  >n ) memcpy(pNew
3430: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b  ->u.zToken, pTok
3440: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
3450: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
3460: 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e  >u.zToken[pToken
3470: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->n] = 0;.      
3480: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
3490: 20 6e 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20   nExtra>=3 .    
34a0: 20 20 20 20 20 20 20 20 20 26 26 20 28 28 63 20           && ((c 
34b0: 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d  = pToken->z[0])=
34c0: 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20  ='\'' || c=='"' 
34d0: 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d  || c=='[' || c==
34e0: 27 60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '`') ){.        
34f0: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
3500: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  (pNew->u.zToken)
3510: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
3520: 63 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66  c=='"' ) pNew->f
3530: 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75  lags |= EP_DblQu
3540: 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oted;.        }.
3550: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
3560: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
3570: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
3580: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
3590: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
35a0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
35b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
35c0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
35d0: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
35e0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
35f0: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
3600: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
3610: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
3620: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
3630: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3640: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
3650: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
3660: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
3670: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
3680: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
3690: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
36a0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
36b0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
36c0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
36d0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
36e0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
36f0: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
3700: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
3710: 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65   zToken ? sqlite
3720: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
3730: 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
3740: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3750: 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b  (db, op, &x, 0);
3760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
3770: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
3780: 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68  and pRight to th
3790: 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f  e Expr node pRoo
37a0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f  t..**.** If pRoo
37b0: 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  t==NULL that mea
37c0: 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  ns that a memory
37d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
37e0: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
37f0: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
3800: 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74   delete the subt
3810: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
3820: 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Right..*/.void s
3830: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
3840: 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69  Subtrees(.  sqli
3850: 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20  te3 *db,.  Expr 
3860: 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a  *pRoot,.  Expr *
3870: 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70  pLeft,.  Expr *p
3880: 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70  Right.){.  if( p
3890: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Root==0 ){.    a
38a0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
38b0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
38c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
38d0: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
38e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
38f0: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
3900: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
3910: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
3920: 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d   pRoot->pRight =
3930: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70   pRight;.      p
3940: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
3950: 50 5f 43 6f 6c 6c 61 74 65 20 26 20 70 52 69 67  P_Collate & pRig
3960: 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ht->flags;.    }
3970: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29  .    if( pLeft )
3980: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
3990: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
39a0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
39b0: 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26   |= EP_Collate &
39c0: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20   pLeft->flags;. 
39d0: 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74     }.    exprSet
39e0: 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20  Height(pRoot);. 
39f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
3a00: 63 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64 65  cate a Expr node
3a10: 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20   which joins as 
3a20: 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74  many as two subt
3a30: 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20  rees..**.** One 
3a40: 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73  or both of the s
3a50: 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e  ubtrees can be N
3a60: 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ULL.  Return a p
3a70: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
3a80: 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20  w.** Expr node. 
3a90: 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65   Or, if an OOM e
3aa0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
3ab0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
3ac0: 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72  locFailed,.** fr
3ad0: 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20  ee the subtrees 
3ae0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
3af0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
3b00: 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20  3PExpr(.  Parse 
3b10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
3b20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
3b30: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  text */.  int op
3b40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3b50: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
3b60: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72  opcode */.  Expr
3b70: 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20   *pLeft,        
3b80: 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72      /* Left oper
3b90: 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  and */.  Expr *p
3ba0: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
3bb0: 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e   /* Right operan
3bc0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  d */.  const Tok
3bd0: 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f  en *pToken     /
3be0: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e  * Argument token
3bf0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
3c00: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
3c10: 4e 44 20 26 26 20 70 4c 65 66 74 20 26 26 20 70  ND && pLeft && p
3c20: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a 20  Right ){.    /* 
3c30: 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  Take advantage o
3c40: 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20  f short-circuit 
3c50: 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  false optimizati
3c60: 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20  on for AND */.  
3c70: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
3c80: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
3c90: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
3ca0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
3cb0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
3cc0: 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f  oc(pParse->db, o
3cd0: 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20  p, pToken, 1);. 
3ce0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
3cf0: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
3d00: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
3d10: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  t, pRight);.  }.
3d20: 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20    if( p ) {.    
3d30: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
3d40: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
3d50: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a  ->nHeight);.  }.
3d60: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
3d70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
3d80: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
3d90: 75 73 74 20 62 65 20 46 41 4c 53 45 20 69 6e 20  ust be FALSE in 
3da0: 61 6c 6c 20 63 61 73 65 73 20 61 6e 64 20 30 20  all cases and 0 
3db0: 69 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  if the.** expres
3dc0: 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 74 72  sion might be tr
3dd0: 75 65 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  ue.  This is an 
3de0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
3df0: 66 20 69 73 20 4f 4b 20 74 6f 0a 2a 2a 20 72 65  f is OK to.** re
3e00: 74 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e  turn 0 here even
3e10: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
3e20: 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77  on really is alw
3e30: 61 79 73 20 66 61 6c 73 65 20 28 61 20 0a 2a 2a  ays false (a .**
3e40: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29   false negative)
3e50: 2e 20 20 42 75 74 20 69 74 20 69 73 20 61 20 62  .  But it is a b
3e60: 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69  ug to return 1 i
3e70: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
3e80: 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 74 72 75  .** might be tru
3e90: 65 20 69 6e 20 73 6f 6d 65 20 72 61 72 65 20 63  e in some rare c
3ea0: 69 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20  ircumstances (a 
3eb0: 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29  false positive.)
3ec0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
3ed0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
3ee0: 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f  on is part of co
3ef0: 6e 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a  nditional for a.
3f00: 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68  ** LEFT JOIN, th
3f10: 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74  en we cannot det
3f20: 65 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c  ermine at compil
3f30: 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f  e-time whether o
3f40: 72 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74  r not.** is it t
3f50: 72 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f  rue or false, so
3f60: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30   always return 0
3f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3f80: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
3f90: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
3fa0: 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70  v = 0;.  if( Exp
3fb0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
3fc0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72  EP_FromJoin) ) r
3fd0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
3fe0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
3ff0: 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65  eger(p, &v) ) re
4000: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
4010: 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   v==0;.}../*.** 
4020: 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73  Join two express
4030: 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e  ions using an AN
4040: 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  D operator.  If 
4050: 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f  either expressio
4060: 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68  n is.** NULL, th
4070: 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  en just return t
4080: 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
4090: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e  ion..**.** If on
40a0: 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74  e side or the ot
40b0: 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69  her of the AND i
40c0: 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61  s known to be fa
40d0: 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  lse, then instea
40e0: 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e  d.** of returnin
40f0: 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73  g an AND express
4100: 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  ion, just return
4110: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
4120: 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61  ession with.** a
4130: 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e   value of false.
4140: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
4150: 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33  3ExprAnd(sqlite3
4160: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66   *db, Expr *pLef
4170: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
4180: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
4190: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
41a0: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
41b0: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
41c0: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
41d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78  ;.  }else if( ex
41e0: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c  prAlwaysFalse(pL
41f0: 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61  eft) || exprAlwa
4200: 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20  ysFalse(pRight) 
4210: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
4220: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
4230: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
4240: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4250: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
4260: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
4270: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
4280: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
4290: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20  okens[0], 0);.  
42a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20  }else{.    Expr 
42b0: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
42c0: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
42d0: 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  AND, 0, 0);.    
42e0: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
42f0: 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e  hSubtrees(db, pN
4300: 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  ew, pLeft, pRigh
4310: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  t);.    return p
4320: 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  New;.  }.}../*.*
4330: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
4340: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
4350: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
4360: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
4370: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
4380: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
4390: 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  rFunction(Parse 
43a0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
43b0: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
43c0: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
43d0: 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65   *pNew;.  sqlite
43e0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
43f0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  db;.  assert( pT
4400: 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d  oken );.  pNew =
4410: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4420: 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f  c(db, TK_FUNCTIO
4430: 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20  N, pToken, 1);. 
4440: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
4450: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
4460: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
4470: 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d  ist); /* Avoid m
4480: 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20  emory leak when 
4490: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
44a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
44b0: 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73  }.  pNew->x.pLis
44c0: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73  t = pList;.  ass
44d0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
44e0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
44f0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73  IsSelect) );.  s
4500: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
4510: 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ght(pParse, pNew
4520: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
4530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
4540: 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  n a variable num
4550: 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73  ber to an expres
4560: 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65  sion that encode
4570: 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20  s a wildcard.** 
4580: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
4590: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
45a0: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
45b0: 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
45c0: 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20   single "?" are 
45d0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78  assigned the nex
45e0: 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20  t sequential.** 
45f0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e  variable number.
4600: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
4610: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
4620: 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  nn" are assigned
4630: 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e   the number "nnn
4640: 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73  ".  We make.** s
4650: 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74  ure "nnn" is not
4660: 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64   too be to avoid
4670: 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72   a denial of ser
4680: 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e  vice attack when
4690: 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74  .** the SQL stat
46a0: 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d  ement comes from
46b0: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75   an external sou
46c0: 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  rce..**.** Wildc
46d0: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
46e0: 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c   ":aaa", "@aaa",
46f0: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
4700: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
4710: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
4720: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
4730: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
4740: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
4750: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
4760: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
4770: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
4780: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
4790: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
47a0: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
47b0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
47c0: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
47d0: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
47e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
47f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
4800: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
4810: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
4820: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
4830: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
4840: 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  rt( !ExprHasAnyP
4850: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
4860: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
4870: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
4880: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
4890: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
48a0: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
48b0: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
48c0: 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  0 );.  if( z[1]=
48d0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
48e0: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
48f0: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
4900: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
4910: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
4920: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
4930: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   );.    pExpr->i
4940: 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29  Column = (ynVar)
4950: 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29  (++pParse->nVar)
4960: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79  ;.  }else{.    y
4970: 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20  nVar x = 0;.    
4980: 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  u32 n = sqlite3S
4990: 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
49a0: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
49b0: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
49c0: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
49d0: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
49e0: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
49f0: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
4a00: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
4a10: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
4a20: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
4a30: 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30       int bOk = 0
4a40: 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  ==sqlite3Atoi64(
4a50: 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20  &z[1], &i, n-1, 
4a60: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
4a70: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
4a80: 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29  mn = x = (ynVar)
4a90: 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  i;.      testcas
4aa0: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( i==0 );.     
4ab0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20   testcase( i==1 
4ac0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
4ad0: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
4ae0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4af0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
4b00: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
4b10: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
4b20: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4b30: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
4b40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
4b50: 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e  ==0 || i<1 || i>
4b60: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4b70: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4b80: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
4b90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4ba0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
4bb0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
4bc0: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
4bd0: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
4be0: 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74        db->aLimit
4bf0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4c00: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b  RIABLE_NUMBER]);
4c10: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a  .        x = 0;.
4c20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4c30: 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( i>pParse->nVar
4c40: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
4c50: 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29  se->nVar = (int)
4c60: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
4c70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
4c80: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
4c90: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
4ca0: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
4cb0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
4cc0: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
4cd0: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
4ce0: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
4cf0: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
4d00: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
4d10: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
4d20: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
4d30: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
4d40: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
4d50: 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61     */.      ynVa
4d60: 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  r i;.      for(i
4d70: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a  =0; i<pParse->nz
4d80: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Var; i++){.     
4d90: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
4da0: 7a 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d  zVar[i] && strcm
4db0: 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  p(pParse->azVar[
4dc0: 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i],z)==0 ){.    
4dd0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
4de0: 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61  lumn = x = (ynVa
4df0: 72 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  r)i+1;.         
4e00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4e10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
4e20: 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70  if( x==0 ) x = p
4e30: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
4e40: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
4e50: 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20  ->nVar);.    }. 
4e60: 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20     if( x>0 ){.  
4e70: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
4e80: 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20  ->nzVar ){.     
4e90: 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20     char **a;.   
4ea0: 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33       a = sqlite3
4eb0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50  DbRealloc(db, pP
4ec0: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73  arse->azVar, x*s
4ed0: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
4ee0: 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29        if( a==0 )
4ef0: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72   return;  /* Err
4f00: 6f 72 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f  or reported thro
4f10: 75 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ugh db->mallocFa
4f20: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
4f30: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20  pParse->azVar = 
4f40: 61 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  a;.        memse
4f50: 74 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56  t(&a[pParse->nzV
4f60: 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61 72 73  ar], 0, (x-pPars
4f70: 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66  e->nzVar)*sizeof
4f80: 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 20  (a[0]));.       
4f90: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d   pParse->nzVar =
4fa0: 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   x;.      }.    
4fb0: 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20    if( z[0]!='?' 
4fc0: 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  || pParse->azVar
4fd0: 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  [x-1]==0 ){.    
4fe0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4ff0: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a  e(db, pParse->az
5000: 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20  Var[x-1]);.     
5010: 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72     pParse->azVar
5020: 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 44  [x-1] = sqlite3D
5030: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20  bStrNDup(db, z, 
5040: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
5050: 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50  }.  } .  if( !pP
5060: 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50  arse->nErr && pP
5070: 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61  arse->nVar>db->a
5080: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5090: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
50a0: 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ER] ){.    sqlit
50b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
50c0: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c  e, "too many SQL
50d0: 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20   variables");.  
50e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72  }.}../*.** Recur
50f0: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e  sively delete an
5100: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5110: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5120: 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69  3ExprDelete(sqli
5130: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
5140: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
5150: 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e  return;.  /* San
5160: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
5170: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
5180: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
5190: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
51a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
51b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
51c0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
51d0: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
51e0: 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   );.  if( !ExprH
51f0: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c  asAnyProperty(p,
5200: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
5210: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
5220: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
5230: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
5240: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5250: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20   p->pRight);.   
5260: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
5270: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
5280: 63 65 64 29 20 26 26 20 28 70 2d 3e 66 6c 61 67  ced) && (p->flag
5290: 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c 6f 63 65  s2 & EP2_Malloce
52a0: 64 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  dToken)!=0 ){.  
52b0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
52c0: 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e(db, p->u.zToke
52d0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
52e0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
52f0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
5300: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
5310: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
5320: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
5330: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
5340: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
5350: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
5360: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
5370: 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70 72  .  }.  if( !Expr
5380: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5390: 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20  P_Static) ){.   
53a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
53b0: 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, p);.  }.}../*
53c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
53d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
53e0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
53f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75   expression stru
5400: 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64  cture .** passed
5410: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
5420: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
5430: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58  always one of EX
5440: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20  PR_FULLSIZE,.** 
5450: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5460: 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   or EXPR_TOKENON
5470: 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  LYSIZE..*/.stati
5480: 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74  c int exprStruct
5490: 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  Size(Expr *p){. 
54a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
54b0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
54c0: 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45  Only) ) return E
54d0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
54e0: 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  E;.  if( ExprHas
54f0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
5500: 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e  educed) ) return
5510: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
5520: 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52  E;.  return EXPR
5530: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  _FULLSIZE;.}../*
5540: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
5550: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
5560: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
5570: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
5580: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
5590: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
55a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
55b0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
55c0: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
55d0: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
55e0: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
55f0: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
5600: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
5610: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
5620: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
5630: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
5640: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
5650: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
5660: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
5670: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
5680: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
5690: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
56a0: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
56b0: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
56c0: 2a 2a 0a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
5710: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
5720: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
5730: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5740: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
5750: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
5760: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
5770: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
5780: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
5790: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
57a0: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
57b0: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
57c0: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
57d0: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
57e0: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
57f0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
5800: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
5810: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
5820: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
5830: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
5840: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
5850: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
5860: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
5870: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
5880: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
5890: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
58a0: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
58b0: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
58c0: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
58d0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
58e0: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
58f0: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
5900: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
5910: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
5920: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
5930: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
5940: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
5950: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
5960: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
5970: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
5980: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
5990: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
59a0: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
59b0: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
59c0: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
59d0: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
59e0: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
59f0: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
5a00: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
5a10: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
5a20: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
5a30: 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63  f teh Expr objec
5a40: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
5a50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
5a60: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
5a70: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
5a80: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
5a90: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
5aa0: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
5ab0: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
5ac0: 61 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  a EXPRDUP_REDUCE
5ad0: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
5ae0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
5af0: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
5b00: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
5b10: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
5b20: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
5b30: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
5b40: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
5b50: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
5b60: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
5b70: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
5b80: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
5b90: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
5ba0: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
5bb0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
5bc0: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
5bd0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
5be0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
5bf0: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
5c00: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
5c10: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
5c20: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
5c30: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
5c40: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
5c50: 20 20 69 66 28 20 30 3d 3d 28 66 6c 61 67 73 26    if( 0==(flags&
5c60: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 20  EXPRDUP_REDUCE) 
5c70: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  ){.    nSize = E
5c80: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20  XPR_FULLSIZE;.  
5c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
5ca0: 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
5cb0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
5cc0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
5cd0: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
5ce0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5cf0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
5d00: 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72  n) ); .    asser
5d10: 74 28 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20  t( (p->flags2 & 
5d20: 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65  EP2_MallocedToke
5d30: 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  n)==0 );.    ass
5d40: 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 32 20  ert( (p->flags2 
5d50: 26 20 45 50 32 5f 49 72 72 65 64 75 63 69 62 6c  & EP2_Irreducibl
5d60: 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  e)==0 );.    if(
5d70: 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e   p->pLeft || p->
5d80: 70 52 69 67 68 74 20 7c 7c 20 70 2d 3e 78 2e 70  pRight || p->x.p
5d90: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
5da0: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
5db0: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
5dc0: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
5dd0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
5de0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
5df0: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b   | EP_TokenOnly;
5e00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5e10: 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  urn nSize;.}../*
5e20: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5e30: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70  n returns the sp
5e40: 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71  ace in bytes req
5e50: 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74  uired to store t
5e60: 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74  he copy .** of t
5e70: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
5e80: 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  e and a copy of 
5e90: 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  the Expr.u.zToke
5ea0: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61  n string (if tha
5eb0: 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64  t.** string is d
5ec0: 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74  efined.).*/.stat
5ed0: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
5ee0: 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70  NodeSize(Expr *p
5ef0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
5f00: 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65  int nByte = dupe
5f10: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
5f20: 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66  p, flags) & 0xff
5f30: 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  f;.  if( !ExprHa
5f40: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5f50: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
5f60: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
5f70: 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
5f80: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
5f90: 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72  oken)+1;.  }.  r
5fa0: 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79  eturn ROUND8(nBy
5fb0: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
5fc0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5fd0: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
5fe0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75  d to create a du
5ff0: 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a  plicate of the .
6000: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  ** expression pa
6010: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
6020: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  t argument. The 
6030: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
6040: 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e  is a.** mask con
6050: 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f  taining EXPRDUP_
6060: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  XXX flags..**.**
6070: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
6080: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61  ned includes spa
6090: 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63  ce to create a c
60a0: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20  opy of the Expr 
60b0: 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66  struct.** itself
60c0: 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20   and the buffer 
60d0: 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45  referred to by E
60e0: 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66  xpr.u.zToken, if
60f0: 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   any..**.** If t
6100: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
6110: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
6120: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
6130: 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a  alue includes .*
6140: 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69  * space to dupli
6150: 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f  cate all Expr no
6160: 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20  des in the tree 
6170: 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70  formed by Expr.p
6180: 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70  Left .** and Exp
6190: 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c  r.pRight variabl
61a0: 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20  es (but not for 
61b0: 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70  any structures p
61c0: 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a  ointed to or .**
61d0: 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20   descended from 
61e0: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
61f0: 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65   or Expr.x.pSele
6200: 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a  ct variables)..*
6210: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
6220: 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20  edExprSize(Expr 
6230: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
6240: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b    int nByte = 0;
6250: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
6260: 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70  nByte = dupedExp
6270: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61  rNodeSize(p, fla
6280: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  gs);.    if( fla
6290: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
62a0: 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  E ){.      nByte
62b0: 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a   += dupedExprSiz
62c0: 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67  e(p->pLeft, flag
62d0: 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69  s) + dupedExprSi
62e0: 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c  ze(p->pRight, fl
62f0: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ags);.    }.  }.
6300: 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a    return nByte;.
6310: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
6320: 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
6330: 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  r to sqlite3Expr
6340: 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68  Dup(), except th
6350: 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a  at if pzBuffer .
6360: 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ** is not NULL t
6370: 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73  hen *pzBuffer is
6380: 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e   assumed to poin
6390: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61  t to a buffer la
63a0: 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74  rge enough .** t
63b0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
63c0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
63d0: 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  , the copies of 
63e0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28  p->u.zToken.** (
63f0: 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20  if applicable), 
6400: 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f  and the copies o
6410: 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61  f the p->pLeft a
6420: 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70  nd p->pRight exp
6430: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20  ressions,.** if 
6440: 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75  any. Before retu
6450: 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72  rning, *pzBuffer
6460: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66   is set to the f
6470: 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65 64  irst byte passed
6480: 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20   the.** portion 
6490: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  of the buffer co
64a0: 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69  pied into by thi
64b0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
64c0: 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72  tatic Expr *expr
64d0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
64e0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
64f0: 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66  ags, u8 **pzBuff
6500: 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  er){.  Expr *pNe
6510: 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
6520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
6530: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
6540: 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  /.  if( p ){.   
6550: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64   const int isRed
6560: 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58  uced = (flags&EX
6570: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
6580: 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20     u8 *zAlloc;. 
6590: 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61     u32 staticFla
65a0: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65  g = 0;..    asse
65b0: 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20  rt( pzBuffer==0 
65c0: 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a  || isReduced );.
65d0: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
65e0: 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74  ut where to writ
65f0: 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73  e the new Expr s
6600: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20  tructure. */.   
6610: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
6620: 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20  .      zAlloc = 
6630: 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20  *pzBuffer;.     
6640: 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50   staticFlag = EP
6650: 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c  _Static;.    }el
6660: 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63  se{.      zAlloc
6670: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6680: 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45  ocRaw(db, dupedE
6690: 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  xprSize(p, flags
66a0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ));.    }.    pN
66b0: 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c  ew = (Expr *)zAl
66c0: 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e  loc;..    if( pN
66d0: 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ew ){.      /* S
66e0: 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74  et nNewSize to t
66f0: 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65  he size allocate
6700: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
6710: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20  ure pointed to. 
6720: 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e       ** by pNew.
6730: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
6740: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
6750: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
6760: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52  or.      ** EXPR
6770: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20  _TOKENONLYSIZE. 
6780: 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f  nToken is set to
6790: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
67a0: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20  ytes consumed.  
67b0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f      ** by the co
67c0: 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a  py of the p->u.z
67d0: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
67e0: 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
67f0: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
6800: 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65  gned nStructSize
6810: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
6820: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
6830: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  ;.      const in
6840: 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74  t nNewSize = nSt
6850: 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66  ructSize & 0xfff
6860: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b  ;.      int nTok
6870: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45  en;.      if( !E
6880: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6890: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
68a0: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
68b0: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  .        nToken 
68c0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
68d0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b  0(p->u.zToken) +
68e0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
68f0: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  .        nToken 
6900: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
6910: 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64     if( isReduced
6920: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
6930: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
6940: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
6950: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  d)==0 );.       
6960: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
6970: 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20  p, nNewSize);.  
6980: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6990: 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65     int nSize = e
69a0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29  xprStructSize(p)
69b0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
69c0: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a  (zAlloc, p, nSiz
69d0: 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  e);.        mems
69e0: 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65  et(&zAlloc[nSize
69f0: 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53  ], 0, EXPR_FULLS
6a00: 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20  IZE-nSize);.    
6a10: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
6a20: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
6a30: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20  , EP_TokenOnly, 
6a40: 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c  and EP_Static fl
6a50: 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ags appropriatel
6a60: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  y. */.      pNew
6a70: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f  ->flags &= ~(EP_
6a80: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
6a90: 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 29 3b  Only|EP_Static);
6aa0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
6ab0: 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a  gs |= nStructSiz
6ac0: 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  e & (EP_Reduced|
6ad0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20  EP_TokenOnly);. 
6ae0: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
6af0: 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a   |= staticFlag;.
6b00: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  .      /* Copy t
6b10: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
6b20: 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a  tring, if any. *
6b30: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b  /.      if( nTok
6b40: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  en ){.        ch
6b50: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
6b60: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
6b70: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
6b80: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  wSize];.        
6b90: 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70  memcpy(zToken, p
6ba0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ->u.zToken, nTok
6bb0: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  en);.      }..  
6bc0: 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e      if( 0==((p->
6bd0: 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67  flags|pNew->flag
6be0: 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  s) & EP_TokenOnl
6bf0: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  y) ){.        /*
6c00: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65   Fill in the pNe
6c10: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20  w->x.pSelect or 
6c20: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65  pNew->x.pList me
6c30: 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  mber. */.       
6c40: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
6c50: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
6c60: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
6c70: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65     pNew->x.pSele
6c80: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
6c90: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  ctDup(db, p->x.p
6ca0: 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63 65  Select, isReduce
6cb0: 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d);.        }els
6cc0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
6cd0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c  w->x.pList = sql
6ce0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
6cf0: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20  db, p->x.pList, 
6d00: 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20  isReduced);.    
6d10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
6d20: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
6d30: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20  pNew->pLeft and 
6d40: 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f  pNew->pRight. */
6d50: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
6d60: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 4e  asAnyProperty(pN
6d70: 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ew, EP_Reduced|E
6d80: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6d90: 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b          zAlloc +
6da0: 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  = dupedExprNodeS
6db0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20  ize(p, flags);. 
6dc0: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
6dd0: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
6de0: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a   EP_Reduced) ){.
6df0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6e00: 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70 28  pLeft = exprDup(
6e10: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58  db, p->pLeft, EX
6e20: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
6e30: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  Alloc);.        
6e40: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
6e50: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
6e60: 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f  pRight, EXPRDUP_
6e70: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
6e80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6e90: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
6ea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
6eb0: 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63  zBuffer = zAlloc
6ec0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6ed0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6ee0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 32 20 3d 20   pNew->flags2 = 
6ef0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  0;.        if( !
6f00: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
6f10: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
6f20: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
6f30: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
6f40: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
6f50: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  , p->pLeft, 0);.
6f60: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6f70: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
6f80: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
6f90: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
6fa0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
6fb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6fc0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
6fd0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
6fe0: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
6ff0: 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73  make deep copies
7000: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   of expressions,
7010: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
7020: 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20  ists, ID lists, 
7030: 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  and select state
7040: 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69  ments.  The copi
7050: 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c  es can.** be del
7060: 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70  eted (by being p
7070: 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72  assed to their r
7080: 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c  espective ...Del
7090: 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a  ete() routines).
70a0: 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ** without effec
70b0: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
70c0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  ls..**.** The ex
70d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49  pression list, I
70e0: 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69  D, and source li
70f0: 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71  sts return by sq
7100: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7110: 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64  (),.** sqlite3Id
7120: 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73  ListDup(), and s
7130: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
7140: 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75  () can not be fu
7150: 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a  rther expanded .
7160: 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ** by subsequent
7170: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
7180: 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f  *ListAppend() ro
7190: 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  utines..**.** An
71a0: 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68  y tables that th
71b0: 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  e SrcList might 
71c0: 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74  point to are not
71d0: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a   duplicated..**.
71e0: 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 72  ** The flags par
71f0: 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  ameter contains 
7200: 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
7210: 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58 58   the EXPRDUP_XXX
7220: 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68   flags..** If th
7230: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
7240: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
7250: 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  en the structure
7260: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a   returned is a.*
7270: 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72 73  * truncated vers
7280: 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ion of the usual
7290: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
72a0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f  that will be sto
72b0: 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  red as.** part o
72c0: 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
72d0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
72e0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
72f0: 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a  chema..*/.Expr *
7300: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73  sqlite3ExprDup(s
7310: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
7320: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7330: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 44 75  .  return exprDu
7340: 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20  p(db, p, flags, 
7350: 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a  0);.}.ExprList *
7360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7370: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
7380: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
7390: 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c   flags){.  ExprL
73a0: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72  ist *pNew;.  str
73b0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
73c0: 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49  m *pItem, *pOldI
73d0: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
73e0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
73f0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
7400: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
7410: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
7420: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
7430: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7440: 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72    pNew->iECursor
7450: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45   = 0;.  pNew->nE
7460: 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78  xpr = i = p->nEx
7470: 70 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73  pr;.  if( (flags
7480: 20 26 20 45 58 50 52 44 55 50 5f 52 45 44 55 43   & EXPRDUP_REDUC
7490: 45 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b  E)==0 ) for(i=1;
74a0: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d   i<p->nExpr; i+=
74b0: 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  i){}.  pNew->a =
74c0: 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33   pItem = sqlite3
74d0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
74e0: 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   i*sizeof(p->a[0
74f0: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65  ]) );.  if( pIte
7500: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
7510: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e  te3DbFree(db, pN
7520: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
7530: 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74  0;.  } .  pOldIt
7540: 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72  em = p->a;.  for
7550: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
7560: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20  ; i++, pItem++, 
7570: 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pOldItem++){.   
7580: 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20   Expr *pOldExpr 
7590: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70  = pOldItem->pExp
75a0: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  r;.    pItem->pE
75b0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
75c0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70  rDup(db, pOldExp
75d0: 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  r, flags);.    p
75e0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
75f0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
7600: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
7610: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  e);.    pItem->z
7620: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
7630: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
7640: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
7650: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
7660: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f  r = pOldItem->so
7670: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74  rtOrder;.    pIt
7680: 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20  em->done = 0;.  
7690: 20 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73    pItem->bSpanIs
76a0: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
76b0: 62 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20  bSpanIsTab;.    
76c0: 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43  pItem->iOrderByC
76d0: 6f 6c 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  ol = pOldItem->i
76e0: 4f 72 64 65 72 42 79 43 6f 6c 3b 0a 20 20 20 20  OrderByCol;.    
76f0: 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
7700: 70 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c 69 61 73  pOldItem->iAlias
7710: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
7720: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  New;.}../*.** If
7730: 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65   cursors, trigge
7740: 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75  rs, views and su
7750: 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c  bqueries are all
7760: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a   omitted from.**
7770: 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e   the build, then
7780: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   none of the fol
7790: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c  lowing routines,
77a0: 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20   except for .** 
77b0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
77c0: 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  (), can be calle
77d0: 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  d. sqlite3Select
77e0: 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d  Dup() is sometim
77f0: 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74  es.** called wit
7800: 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  h a NULL argumen
7810: 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  t..*/.#if !defin
7820: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
7830: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
7840: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
7850: 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66  GGER) \. || !def
7860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7870: 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69  _SUBQUERY).SrcLi
7880: 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
7890: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
78a0: 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69  b, SrcList *p, i
78b0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63  nt flags){.  Src
78c0: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
78d0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  t i;.  int nByte
78e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
78f0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
7900: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
7910: 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a  (p->nSrc>0 ? siz
7920: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
7930: 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b  p->nSrc-1) : 0);
7940: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
7950: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
7960: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
7970: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
7980: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
7990: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
79a0: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
79b0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
79c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
79d0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
79e0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
79f0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
7a00: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
7a10: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
7a20: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
7a30: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
7a40: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70  tem->pSchema = p
7a50: 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61  OldItem->pSchema
7a60: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7a70: 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
7a80: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
7a90: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pOldItem->zDatab
7aa0: 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ase);.    pNewIt
7ab0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
7ac0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
7ad0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
7ae0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7af0: 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
7b00: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
7b10: 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  dItem->zAlias);.
7b20: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f      pNewItem->jo
7b30: 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65  intype = pOldIte
7b40: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
7b50: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73   pNewItem->iCurs
7b60: 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  or = pOldItem->i
7b70: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77  Cursor;.    pNew
7b80: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
7b90: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64  b = pOldItem->ad
7ba0: 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70  drFillSub;.    p
7bb0: 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  NewItem->regRetu
7bc0: 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72  rn = pOldItem->r
7bd0: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4e  egReturn;.    pN
7be0: 65 77 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c  ewItem->isCorrel
7bf0: 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ated = pOldItem-
7c00: 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3b 0a 20  >isCorrelated;. 
7c10: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 76 69 61     pNewItem->via
7c20: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 70 4f 6c 64  Coroutine = pOld
7c30: 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
7c40: 6e 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ne;.    pNewItem
7c50: 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  ->zIndex = sqlit
7c60: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
7c70: 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29  OldItem->zIndex)
7c80: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7c90: 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c  notIndexed = pOl
7ca0: 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65  dItem->notIndexe
7cb0: 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  d;.    pNewItem-
7cc0: 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74  >pIndex = pOldIt
7cd0: 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  em->pIndex;.    
7ce0: 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d  pTab = pNewItem-
7cf0: 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  >pTab = pOldItem
7d00: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
7d10: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54  pTab ){.      pT
7d20: 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  ab->nRef++;.    
7d30: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
7d40: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
7d50: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
7d60: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
7d70: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
7d80: 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71  ewItem->pOn = sq
7d90: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7da0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20   pOldItem->pOn, 
7db0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
7dc0: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73  Item->pUsing = s
7dd0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
7de0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55  db, pOldItem->pU
7df0: 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49  sing);.    pNewI
7e00: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70  tem->colUsed = p
7e10: 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  OldItem->colUsed
7e20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
7e30: 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73  New;.}.IdList *s
7e40: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
7e50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
7e60: 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73  ist *p){.  IdLis
7e70: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
7e80: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
7e90: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
7ea0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7eb0: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
7ec0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
7ed0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
7ee0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20   0;.  pNew->nId 
7ef0: 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77  = p->nId;.  pNew
7f00: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
7f10: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e  allocRaw(db, p->
7f20: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
7f30: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
7f40: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
7f50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7f60: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
7f70: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e  rn 0;.  }.  /* N
7f80: 6f 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ote that because
7f90: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
7fa0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
7fb0: 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20  p->a[] is not.  
7fc0: 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61  ** necessarily a
7fd0: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73   power of two, s
7fe0: 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
7ff0: 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20  nd() may not be 
8000: 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74  called.  ** on t
8010: 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65  he duplicate cre
8020: 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
8030: 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28  ction. */.  for(
8040: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69  i=0; i<p->nId; i
8050: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
8060: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  IdList_item *pNe
8070: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
8080: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
8090: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  IdList_item *pOl
80a0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
80b0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
80c0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
80d0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
80e0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
80f0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20    pNewItem->idx 
8100: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b  = pOldItem->idx;
8110: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
8120: 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71  ew;.}.Select *sq
8130: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
8140: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
8150: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
8160: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  ){.  Select *pNe
8170: 77 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 66  w, *pPrior;.  if
8180: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
8190: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
81a0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
81b0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  b, sizeof(*p) );
81c0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
81d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
81e0: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
81f0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
8200: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c  b, p->pEList, fl
8210: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ags);.  pNew->pS
8220: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
8230: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  istDup(db, p->pS
8240: 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  rc, flags);.  pN
8250: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
8260: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
8270: 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73  p->pWhere, flags
8280: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  );.  pNew->pGrou
8290: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
82a0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
82b0: 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29  pGroupBy, flags)
82c0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
82d0: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
82e0: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
82f0: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  g, flags);.  pNe
8300: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
8310: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
8320: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
8330: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8340: 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  ->op = p->op;.  
8350: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
8360: 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53  Prior = sqlite3S
8370: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
8380: 70 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a  pPrior, flags);.
8390: 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70    if( pPrior ) p
83a0: 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
83b0: 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  New;.  pNew->pNe
83c0: 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  xt = 0;.  pNew->
83d0: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
83e0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
83f0: 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Limit, flags);. 
8400: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
8410: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8420: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20  db, p->pOffset, 
8430: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
8440: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
8450: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
8460: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67  .  pNew->selFlag
8470: 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  s = p->selFlags 
8480: 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65  & ~SF_UsesEpheme
8490: 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  ral;.  pNew->pRi
84a0: 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70  ghtmost = 0;.  p
84b0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
84c0: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
84d0: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
84e0: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
84f0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
8500: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
8510: 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65  pNew;.}.#else.Se
8520: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
8530: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
8540: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
8550: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
8560: 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72  ert( p==0 );.  r
8570: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
8580: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
8590: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
85a0: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70  he end of an exp
85b0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
85c0: 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e  f pList is.** in
85d0: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
85e0: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
85f0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
8600: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
8610: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
8620: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
8630: 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20 66  entire list is f
8640: 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c  reed and.** NULL
8650: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
8660: 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65  f non-NULL is re
8670: 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20  turned, then it 
8680: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
8690: 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e   that the new en
86a0: 74 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66  try was successf
86b0: 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a  ully appended..*
86c0: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
86d0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
86e0: 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
86f0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
8700: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
8710: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
8720: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
8730: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
8740: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
8750: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
8760: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
8770: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
8780: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
8790: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
87a0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
87b0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
87c0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
87d0: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
87e0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
87f0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  ero(db, sizeof(E
8800: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
8810: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
8820: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
8830: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
8840: 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  st->a = sqlite3D
8850: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
8860: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
8870: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ]));.    if( pLi
8880: 73 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20  st->a==0 ) goto 
8890: 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20  no_mem;.  }else 
88a0: 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70  if( (pList->nExp
88b0: 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70  r & (pList->nExp
88c0: 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r-1))==0 ){.    
88d0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
88e0: 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73  item *a;.    ass
88f0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
8900: 72 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73  r>0 );.    a = s
8910: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
8920: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c  db, pList->a, pL
8930: 69 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a  ist->nExpr*2*siz
8940: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
8950: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
8960: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
8970: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
8980: 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
8990: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  }.  assert( pLis
89a0: 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  t->a!=0 );.  if(
89b0: 20 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   1 ){.    struct
89c0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
89d0: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
89e0: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
89f0: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
8a00: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
8a10: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
8a20: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
8a30: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
8a40: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
8a50: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
8a60: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
8a70: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
8a80: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
8a90: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
8aa0: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
8ab0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
8ac0: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
8ad0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8ae0: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
8af0: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d  t.a[].zName elem
8b00: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
8b10: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
8b20: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
8b30: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
8b40: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
8b50: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
8b60: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
8b70: 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75    But pName shou
8b80: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
8b90: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
8ba0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
8bb0: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
8bc0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8bd0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
8be0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8bf0: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
8c00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8c10: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
8c20: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8c30: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
8c40: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
8c50: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
8c60: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
8c70: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
8c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8c90: 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  e to be added */
8ca0: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
8cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
8cc0: 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ue to cause the 
8cd0: 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f  name to be dequo
8ce0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ted */.){.  asse
8cf0: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
8d00: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
8d10: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
8d20: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
8d30: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
8d40: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
8d50: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
8d60: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
8d70: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
8d80: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
8d90: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
8da0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
8db0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
8dc0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
8dd0: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
8de0: 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  b, pName->z, pNa
8df0: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
8e00: 64 65 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d  dequote && pItem
8e10: 2d 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65  ->zName ) sqlite
8e20: 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e  3Dequote(pItem->
8e30: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zName);.  }.}../
8e40: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
8e50: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
8e60: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
8e70: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
8e80: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
8e90: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
8ea0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
8eb0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
8ec0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
8ed0: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
8ee0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
8ef0: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
8f00: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
8f10: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
8f20: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
8f30: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
8f40: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
8f50: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
8f60: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
8f70: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
8f80: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
8f90: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
8fa0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
8fb0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
8fc0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
8fd0: 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a   */.  ExprSpan *
8fe0: 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a  pSpan         /*
8ff0: 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20   The span to be 
9000: 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  added */.){.  sq
9010: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9020: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
9030: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
9040: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
9050: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
9060: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
9070: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
9080: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
9090: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
90a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
90b0: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
90c0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
90d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
90e0: 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70  Item->pExpr==pSp
90f0: 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  an->pExpr );.   
9100: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9110: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
9120: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
9130: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
9140: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
9150: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
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 20 20 20 20 20 20                  
9180: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
9190: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
91a0: 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start));.  }.}..
91b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
91c0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
91d0: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
91e0: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
91f0: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
9200: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
9210: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
9220: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
9230: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
9240: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9250: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
9260: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
9270: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
9280: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
9290: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
92a0: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
92b0: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
92c0: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
92d0: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
92e0: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
92f0: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
9300: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
9310: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
9320: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
9330: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9340: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
9350: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
9360: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
9370: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
9380: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
9390: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
93a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
93b0: 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  rListDelete(sqli
93c0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
93d0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
93e0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
93f0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
9400: 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
9410: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
9420: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
9430: 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  0 || pList->nExp
9440: 72 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 49  r==0 );.  for(pI
9450: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
9460: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
9470: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
9480: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
9490: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
94a0: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73  m->pExpr);.    s
94b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
94c0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
94d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
94e0: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
94f0: 61 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  an);.  }.  sqlit
9500: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
9510: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
9520: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
9530: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  t);.}../*.** The
9540: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
9550: 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73  Walker callbacks
9560: 2e 20 20 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69  .  Walker.u.pi i
9570: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
9580: 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 54  o an integer.  T
9590: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
95a0: 65 20 63 68 65 63 6b 69 6e 67 20 61 6e 20 65 78  e checking an ex
95b0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a  pression to see.
95c0: 2a 2a 20 69 66 20 69 74 20 69 73 20 61 20 63 6f  ** if it is a co
95d0: 6e 73 74 61 6e 74 2e 20 20 53 65 74 20 2a 57 61  nstant.  Set *Wa
95e0: 6c 6b 65 72 2e 75 2e 70 69 20 74 6f 20 30 20 69  lker.u.pi to 0 i
95f0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9600: 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74   is.** not const
9610: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ant..**.** These
9620: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
9630: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69  es are used to i
9640: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c  mplement the fol
9650: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
9660: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
9670: 6f 6e 73 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20  onstant().**    
9680: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9690: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a  nstantNotJoin().
96a0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
96b0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
96c0: 6e 63 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73  nction().**.*/.s
96d0: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
96e0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c  deIsConstant(Wal
96f0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
9700: 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f  pr *pExpr){..  /
9710: 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  * If pWalker->u.
9720: 69 20 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20  i is 3 then any 
9730: 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72  term of the expr
9740: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65  ession that come
9750: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  s from.  ** the 
9760: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
9770: 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69  ses of a join di
9780: 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65  squalifies the e
9790: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66  xpression.  ** f
97a0: 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64  rom being consid
97b0: 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a  ered constant. *
97c0: 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  /.  if( pWalker-
97d0: 3e 75 2e 69 3d 3d 33 20 26 26 20 45 78 70 72 48  >u.i==3 && ExprH
97e0: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
97f0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
9800: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
9810: 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72  ->u.i = 0;.    r
9820: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
9830: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
9840: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
9850: 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e   /* Consider fun
9860: 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e  ctions to be con
9870: 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65  stant if all the
9880: 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ir arguments are
9890: 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a   constant.    **
98a0: 20 61 6e 64 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   and pWalker->u.
98b0: 69 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65  i==2 */.    case
98c0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
98d0: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
98e0: 3e 75 2e 69 3d 3d 32 20 29 20 72 65 74 75 72 6e  >u.i==2 ) return
98f0: 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c   0;.      /* Fal
9900: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
9910: 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20   case TK_ID:.   
9920: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
9930: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
9940: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
9950: 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
9960: 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  N:.      testcas
9970: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
9980: 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _ID );.      tes
9990: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
99a0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
99b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
99c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
99d0: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
99e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
99f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
9a00: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70  OLUMN );.      p
9a10: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b  Walker->u.i = 0;
9a20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
9a30: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 64 65 66  C_Abort;.    def
9a40: 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74  ault:.      test
9a50: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
9a60: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a  =TK_SELECT ); /*
9a70: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
9a80: 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c  stant will disal
9a90: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  low */.      tes
9aa0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
9ab0: 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f  ==TK_EXISTS ); /
9ac0: 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  * selectNodeIsCo
9ad0: 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61  nstant will disa
9ae0: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65  llow */.      re
9af0: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
9b00: 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  e;.  }.}.static 
9b10: 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73  int selectNodeIs
9b20: 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20  Constant(Walker 
9b30: 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
9b40: 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
9b50: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
9b60: 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b  otUsed);.  pWalk
9b70: 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72  er->u.i = 0;.  r
9b80: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
9b90: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
9ba0: 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a  prIsConst(Expr *
9bb0: 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 29  p, int initFlag)
9bc0: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
9bd0: 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
9be0: 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 75 2e  zeof(w));.  w.u.
9bf0: 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20  i = initFlag;.  
9c00: 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
9c10: 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  = exprNodeIsCons
9c20: 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63  tant;.  w.xSelec
9c30: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
9c40: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
9c50: 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
9c60: 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
9c70: 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f  turn w.u.i;.}../
9c80: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
9c90: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
9ca0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
9cb0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
9cc0: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
9cd0: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
9ce0: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
9cf0: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
9d00: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
9d10: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
9d20: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
9d30: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
9d40: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
9d50: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
9d60: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
9d70: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
9d80: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
9d90: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
9da0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
9db0: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
9dc0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
9dd0: 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a 7d  IsConst(p, 1);.}
9de0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
9df0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
9e00: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
9e10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9e20: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74  constant.** that
9e30: 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61   does no origina
9e40: 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f  te from the ON o
9e50: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
9e60: 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65  of a join..** Re
9e70: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76  turn 0 if it inv
9e80: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
9e90: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
9ea0: 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a  s or terms from.
9eb0: 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e  ** an ON or USIN
9ec0: 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  G clause..*/.int
9ed0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9ee0: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78  nstantNotJoin(Ex
9ef0: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
9f00: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
9f10: 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  3);.}../*.** Wal
9f20: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
9f30: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
9f40: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
9f50: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
9f60: 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63   or a function c
9f70: 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e  all with constan
9f80: 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65  t arguments.  Re
9f90: 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68  turn and 0 if th
9fa0: 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76  ere.** are any v
9fb0: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
9fc0: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
9fd0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
9fe0: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
9ff0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
a000: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
a010: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
a020: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
a030: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
a040: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
a050: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
a060: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
a070: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
a080: 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  n(Expr *p){.  re
a090: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
a0a0: 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, 2);.}../*.**
a0b0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
a0c0: 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e  on p codes a con
a0d0: 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68  stant integer th
a0e0: 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  at is small enou
a0f0: 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  gh.** to fit in 
a100: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
a110: 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70  , return 1 and p
a120: 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ut the value of 
a130: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69  the integer.** i
a140: 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74  n *pValue.  If t
a150: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a160: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
a170: 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20  or if it is too 
a180: 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  big.** to fit in
a190: 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
a1a0: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
a1b0: 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56   0 and leave *pV
a1c0: 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  alue unchanged..
a1d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
a1e0: 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72  prIsInteger(Expr
a1f0: 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65   *p, int *pValue
a200: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
a210: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70  ..  /* If an exp
a220: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e  ression is an in
a230: 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68  teger literal th
a240: 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69 67  at fits in a sig
a250: 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20  ned 32-bit.  ** 
a260: 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68  integer, then th
a270: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
a280: 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  ag will have alr
a290: 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f  eady been set */
a2a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
a2b0: 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20  !=TK_INTEGER || 
a2c0: 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  (p->flags & EP_I
a2d0: 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20  ntValue)!=0.    
a2e0: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
a2f0: 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a  3GetInt32(p->u.z
a300: 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29  Token, &rc)==0 )
a310: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  ;..  if( p->flag
a320: 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
a330: 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d  ){.    *pValue =
a340: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20   p->u.iValue;.  
a350: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
a360: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
a370: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  ){.    case TK_U
a380: 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63  PLUS: {.      rc
a390: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73   = sqlite3ExprIs
a3a0: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
a3b0: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  , pValue);.     
a3c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a3d0: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
a3e0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b  : {.      int v;
a3f0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
a400: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
a410: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
a420: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
a430: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
a440: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
a450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a460: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62  }.    default: b
a470: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
a480: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a490: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
a4a0: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
a4b0: 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ce that the expr
a4c0: 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55  ession can be NU
a4d0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  LL..**.** If the
a4e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68   expression migh
a4f0: 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20  t be NULL or if 
a500: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a510: 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a  s too complex.**
a520: 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20   to tell return 
a530: 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  TRUE.  .**.** Th
a540: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
a550: 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ed as an optimiz
a560: 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f  ation, to skip O
a570: 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73  P_IsNull opcodes
a580: 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77  .** when we know
a590: 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61   that a value ca
a5a0: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48  nnot be NULL.  H
a5b0: 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f  ence, a false po
a5c0: 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72  sitive.** (retur
a5d0: 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69  ning TRUE when i
a5e0: 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65  n fact the expre
a5f0: 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20  ssion can never 
a600: 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a  be NULL) might.*
a610: 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72  * be a small per
a620: 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74  formance hit but
a630: 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61   is otherwise ha
a640: 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20  rmless.  On the 
a650: 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61  other.** hand, a
a660: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20   false negative 
a670: 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45  (returning FALSE
a680: 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
a690: 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a   could be NULL).
a6a0: 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  ** will likely r
a6b0: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
a6c0: 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53  rrect answer.  S
a6d0: 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  o when in doubt,
a6e0: 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e   return.** TRUE.
a6f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
a700: 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e  xprCanBeNull(con
a710: 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75  st Expr *p){.  u
a720: 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70  8 op;.  while( p
a730: 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
a740: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
a750: 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65  US ){ p = p->pLe
a760: 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ft; }.  op = p->
a770: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
a780: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
a790: 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
a7a0: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
a7b0: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
a7c0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
a7d0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
a7e0: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
a7f0: 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74  _BLOB:.      ret
a800: 75 72 6e 20 30 3b 0a 20 20 20 20 64 65 66 61 75  urn 0;.    defau
a810: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
a820: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
a830: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 4f 50 5f   Generate an OP_
a840: 49 73 4e 75 6c 6c 20 69 6e 73 74 72 75 63 74 69  IsNull instructi
a850: 6f 6e 20 74 68 61 74 20 74 65 73 74 73 20 72 65  on that tests re
a860: 67 69 73 74 65 72 20 69 52 65 67 20 61 6e 64 20  gister iReg and 
a870: 6a 75 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f 63 61  jumps.** to loca
a880: 74 69 6f 6e 20 69 44 65 73 74 20 69 66 20 74 68  tion iDest if th
a890: 65 20 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20  e value in iReg 
a8a0: 69 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20 76 61  is NULL.  The va
a8b0: 6c 75 65 20 69 6e 20 69 52 65 67 20 0a 2a 2a 20  lue in iReg .** 
a8c0: 77 61 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20  was computed by 
a8d0: 70 45 78 70 72 2e 20 20 49 66 20 77 65 20 63 61  pExpr.  If we ca
a8e0: 6e 20 6c 6f 6f 6b 20 61 74 20 70 45 78 70 72 20  n look at pExpr 
a8f0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
a900: 61 6e 64 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  and.** determine
a910: 20 74 68 61 74 20 69 74 20 63 61 6e 20 6e 65 76   that it can nev
a920: 65 72 20 67 65 6e 65 72 61 74 65 20 61 20 4e 55  er generate a NU
a930: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f  LL, then the OP_
a940: 49 73 4e 75 6c 6c 20 6f 70 65 72 61 74 69 6f 6e  IsNull operation
a950: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  .** can be omitt
a960: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
a970: 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
a980: 6c 4a 75 6d 70 28 0a 20 20 56 64 62 65 20 2a 76  lJump(.  Vdbe *v
a990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
a9a0: 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63  The VDBE under c
a9b0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
a9c0: 20 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78   const Expr *pEx
a9d0: 70 72 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67 65 6e  pr,  /* Only gen
a9e0: 65 72 61 74 65 20 4f 50 5f 49 73 4e 75 6c 6c 20  erate OP_IsNull 
a9f0: 69 66 20 74 68 69 73 20 65 78 70 72 20 63 61 6e  if this expr can
aa00: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
aa10: 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 20  t iReg,         
aa20: 20 20 2f 2a 20 54 65 73 74 20 74 68 65 20 76 61    /* Test the va
aa30: 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
aa40: 73 74 65 72 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f  ster for NULL */
aa50: 0a 20 20 69 6e 74 20 69 44 65 73 74 20 20 20 20  .  int iDest    
aa60: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
aa70: 65 72 65 20 69 66 20 74 68 65 20 76 61 6c 75 65  ere if the value
aa80: 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20   is null */.){. 
aa90: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
aaa0: 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 29  CanBeNull(pExpr)
aab0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
aac0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
aad0: 49 73 4e 75 6c 6c 2c 20 69 52 65 67 2c 20 69 44  IsNull, iReg, iD
aae0: 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  est);.  }.}../*.
aaf0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
ab00: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
ab10: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73  ession is a cons
ab20: 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64  tant which would
ab30: 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64   be.** unchanged
ab40: 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   by OP_Affinity 
ab50: 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74  with the affinit
ab60: 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73  y given in the s
ab70: 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
ab80: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
ab90: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
aba0: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
abb0: 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  e OP_Affinity op
abc0: 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  eration.** can b
abd0: 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e  e omitted.  When
abe0: 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e   in doubt return
abf0: 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65   FALSE.  A false
ac00: 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20   negative.** is 
ac10: 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c  harmless.  A fal
ac20: 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77  se positive, how
ac30: 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74  ever, can result
ac40: 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a   in the wrong.**
ac50: 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20   answer..*/.int 
ac60: 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
ac70: 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
ac80: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20  (const Expr *p, 
ac90: 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20  char aff){.  u8 
aca0: 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53  op;.  if( aff==S
acb0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
acc0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69   return 1;.  whi
acd0: 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
ace0: 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LUS || p->op==TK
acf0: 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70  _UMINUS ){ p = p
ad00: 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20  ->pLeft; }.  op 
ad10: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  = p->op;.  if( o
ad20: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
ad30: 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20   op = p->op2;.  
ad40: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
ad50: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
ad60: 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
ad70: 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
ad80: 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
ad90: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
ada0: 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
adb0: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
adc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
add0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
ade0: 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  AL || aff==SQLIT
adf0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
ae00: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ae10: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
ae20: 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
ae30: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
ae40: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ae50: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65  BLOB: {.      re
ae60: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
ae70: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
ae80: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
ae90: 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29  ( p->iTable>=0 )
aea0: 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62  ;  /* p cannot b
aeb0: 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43  e part of a CHEC
aec0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  K constraint */.
aed0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e        return p->
aee0: 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20  iColumn<0.      
aef0: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
af00: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
af10: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
af20: 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20  FF_NUMERIC);.   
af30: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
af40: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
af50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
af60: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
af70: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   if the given st
af80: 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64  ring is a row-id
af90: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f   column name..*/
afa0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f  .int sqlite3IsRo
afb0: 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  wid(const char *
afc0: 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  z){.  if( sqlite
afd0: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f  3StrICmp(z, "_RO
afe0: 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75  WID_")==0 ) retu
aff0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
b000: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52  te3StrICmp(z, "R
b010: 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  OWID")==0 ) retu
b020: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
b030: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f  te3StrICmp(z, "O
b040: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
b050: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
b060: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b070: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61  true if we are a
b080: 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70  ble to the IN op
b090: 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74  erator optimizat
b0a0: 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72  ion on a.** quer
b0b0: 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  y of the form.**
b0c0: 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28  .**       x IN (
b0d0: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a  SELECT ...).**.*
b0e0: 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45  * Where the SELE
b0f0: 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20  CT... clause is 
b100: 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
b110: 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f  the parameter to
b120: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
b130: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65  ..**.** The Sele
b140: 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  ct object passed
b150: 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20   in has already 
b160: 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65  been preprocesse
b170: 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f  d and no.** erro
b180: 72 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75  rs have been fou
b190: 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nd..*/.#ifndef S
b1a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
b1b0: 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69  ERY.static int i
b1c0: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
b1d0: 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  pt(Select *p){. 
b1e0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
b1f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
b200: 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
b210: 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
b220: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
b230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
b240: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
b250: 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a  f IN is SELECT *
b260: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
b270: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  r ) return 0;   
b280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
b290: 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  t a compound SEL
b2a0: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
b2b0: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
b2c0: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
b2d0: 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73  gate) ){.    tes
b2e0: 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
b2f0: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
b300: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
b310: 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
b320: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b330: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
b340: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
b350: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
b360: 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
b370: 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20  return 0; /* No 
b380: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
b390: 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74   and no aggregat
b3a0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
b3b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
b3c0: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20  pGroupBy==0 );  
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
b3e0: 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
b3f0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
b400: 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
b410: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
b420: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49    /* Has no LIMI
b430: 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73  T clause */.  as
b440: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
b450: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
b460: 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54       /* No LIMIT
b470: 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54   means no OFFSET
b480: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   */.  if( p->pWh
b490: 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b4b0: 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  Has no WHERE cla
b4c0: 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  use */.  pSrc = 
b4d0: 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
b4e0: 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
b4f0: 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
b500: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
b510: 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
b520: 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c   term in FROM cl
b530: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
b540: 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
b550: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
b560: 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20   /* FROM is not 
b570: 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69  a subquery or vi
b580: 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70  ew */.  pTab = p
b590: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
b5a0: 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 61 62    if( NEVER(pTab
b5b0: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
b5c0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
b5d0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20  >pSelect==0 );  
b5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
b5f0: 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
b600: 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
b610: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
b620: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b630: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
b640: 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
b650: 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
b660: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
b670: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
b680: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
b690: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63  ;       /* One c
b6a0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
b6b0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28  ult set */.  if(
b6c0: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
b6d0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
b6e0: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  MN ) return 0; /
b6f0: 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f  * Result is a co
b700: 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  lumn */.  return
b710: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
b720: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b730: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UERY */../*.** C
b740: 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69  ode an OP_Once i
b750: 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61  nstruction and a
b760: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
b770: 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75  r its flag. Retu
b780: 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65  rn the .** addre
b790: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
b7a0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  struction..*/.in
b7b0: 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  t sqlite3CodeOnc
b7c0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
b7d0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
b7e0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
b7f0: 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69  rse);      /* Vi
b800: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
b810: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72  ing coded */.  r
b820: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
b830: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e  eAddOp1(v, OP_On
b840: 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63  ce, pParse->nOnc
b850: 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  e++);.}../*.** T
b860: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b870: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
b880: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
b890: 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
b8a0: 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70  tor..** The pX p
b8b0: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
b8c0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68  expression on th
b8d0: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
b8e0: 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a  operator, which.
b8f0: 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74 68  ** might be eith
b900: 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70  er a list of exp
b910: 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75  ressions or a su
b920: 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
b930: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
b940: 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64  utine is to find
b950: 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74   or create a b-t
b960: 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ree object that 
b970: 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65  can.** be used e
b980: 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f  ither to test fo
b990: 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20  r membership in 
b9a0: 74 68 65 20 52 48 53 20 73 65 74 20 6f 72 20 74  the RHS set or t
b9b0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
b9c0: 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73  h.** all members
b9d0: 20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74 2c   of the RHS set,
b9e0: 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63   skipping duplic
b9f0: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75  ates..**.** A cu
ba00: 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  rsor is opened o
ba10: 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  n the b-tree obj
ba20: 65 63 74 20 74 68 61 74 20 74 68 65 20 52 48 53  ect that the RHS
ba30: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
ba40: 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69  tor.** and pX->i
ba50: 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
ba60: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
ba70: 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t cursor..**.** 
ba80: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
ba90: 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
baa0: 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68  ion indicates th
bab0: 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61  e b-tree type, a
bac0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
bad0: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49     IN_INDEX_ROWI
bae0: 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72  D      - The cur
baf0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
bb00: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
bb10: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
bb20: 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54  X_INDEX_ASC  - T
bb30: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
bb40: 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e  ened on an ascen
bb50: 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
bb60: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
bb70: 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f  DESC - The curso
bb80: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
bb90: 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
bba0: 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
bbb0: 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54  X_EPH        - T
bbc0: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
bbd0: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
bbe0: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
bbf0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
bc00: 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
bc10: 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
bc20: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  able..**.** An e
bc30: 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d  xisting b-tree m
bc40: 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20  ight be used if 
bc50: 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69  the RHS expressi
bc60: 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c  on pX is a simpl
bc70: 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75  e.** subquery su
bc80: 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ch as:.**.**    
bc90: 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e   SELECT <column>
bca0: 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a   FROM <table>.**
bcb0: 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f  .** If the RHS o
bcc0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
bcd0: 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61  r is a list or a
bce0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75   more complex su
bcf0: 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20  bquery, then.** 
bd00: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
bd10: 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  le might need to
bd20: 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72   be generated fr
bd30: 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74  om the RHS and t
bd40: 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c  hen.** pX->iTabl
bd50: 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
bd60: 74 6f 20 74 68 65 20 65 70 68 65 72 6d 65 72 61  to the ephermera
bd70: 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  l table instead 
bd80: 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  of an.** existin
bd90: 67 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a  g table.  .**.**
bda0: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
bdb0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
bdc0: 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  0, then the b-tr
bdd0: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
bde0: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
bdf0: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
be00: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
be10: 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20  any duplicates. 
be20: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a  In this case an.
be30: 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ** epheremal tab
be40: 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
be50: 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
be60: 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20  ted <column> is 
be70: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
be80: 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
be90: 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
bea0: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
beb0: 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a  MARY KEY or it.*
bec0: 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 63  * has a UNIQUE c
bed0: 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49  onstraint or UNI
bee0: 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  QUE index..**.**
bef0: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
bf00: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
bf10: 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20  not 0, then the 
bf20: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
bf30: 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
bf40: 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
bf50: 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63  tests. In this c
bf60: 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  ase an epheremal
bf70: 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
bf80: 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
bf90: 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e  column> is an IN
bfa0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
bfb0: 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61  Y or an index ca
bfc0: 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77  n .** be found w
bfd0: 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20  ith <column> as 
bfe0: 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  its left-most co
bff0: 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lumn..**.** When
c000: 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
c010: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
c020: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
c030: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
c040: 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  tion.** needs to
c050: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
c060: 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74 75   not the structu
c070: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53  re contains an S
c080: 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75  QL NULL .** valu
c090: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  e in order to co
c0a0: 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65  rrectly evaluate
c0b0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b   expressions lik
c0c0: 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e  e "X IN (Y, Z)".
c0d0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
c0e0: 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20  any chance that 
c0f0: 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20  the (...) might 
c100: 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76  contain a NULL v
c110: 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69  alue at.** runti
c120: 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73  me, then a regis
c130: 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
c140: 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65   and the registe
c150: 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e  r number written
c160: 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75  .** to *prNotFou
c170: 6e 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  nd. If there is 
c180: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
c190: 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e  he (...) contain
c1a0: 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
c1b0: 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f  e, then *prNotFo
c1c0: 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68  und is left unch
c1d0: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
c1e0: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
c1f0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20  located and its 
c200: 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  location stored 
c210: 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20  in *prNotFound, 
c220: 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74  then.** its init
c230: 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  ial value is NUL
c240: 4c 2e 20 20 49 66 20 74 68 65 20 28 2e 2e 2e 29  L.  If the (...)
c250: 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e   does not remain
c260: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
c270: 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66   the duration of
c280: 20 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e   the query (i.e.
c290: 20 74 68 65 20 53 45 4c 45 43 54 20 77 69 74 68   the SELECT with
c2a0: 69 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20  in the (...).** 
c2b0: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
c2c0: 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74  subquery) then t
c2d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
c2e0: 61 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74  allocated regist
c2f0: 65 72 20 69 73 0a 2a 2a 20 72 65 73 65 74 20 74  er is.** reset t
c300: 6f 20 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d 65  o NULL each time
c310: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
c320: 20 72 65 72 75 6e 2e 20 54 68 69 73 20 61 6c 6c   rerun. This all
c330: 6f 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65  ows the.** calle
c340: 72 20 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f  r to use vdbe co
c350: 64 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  de equivalent to
c360: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
c370: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67 69  **.**   if( regi
c380: 73 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a  ster==NULL ){.**
c390: 20 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20       has_null = 
c3a0: 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74  <test if data st
c3b0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
c3c0: 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65   null>.**     re
c3d0: 67 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20  gister = 1.**   
c3e0: 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  }.**.** in order
c3f0: 20 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e   to avoid runnin
c400: 67 20 74 68 65 20 3c 74 65 73 74 20 69 66 20 64  g the <test if d
c410: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
c420: 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20  ntains null>.** 
c430: 74 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20  test more often 
c440: 74 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61 72  than is necessar
c450: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
c460: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
c470: 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  RY.int sqlite3Fi
c480: 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20  ndInIndex(Parse 
c490: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
c4a0: 58 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75  X, int *prNotFou
c4b0: 6e 64 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  nd){.  Select *p
c4c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c4e0: 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69  SELECT to the ri
c4f0: 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ght of IN operat
c500: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  or */.  int eTyp
c510: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c530: 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62   Type of RHS tab
c540: 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a  le. IN_INDEX_* *
c550: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
c560: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
c570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
c580: 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74  sor of the RHS t
c590: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
c5a0: 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 70 72  stBeUnique = (pr
c5b0: 4e 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20  NotFound==0);   
c5c0: 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d  /* True if RHS m
c5d0: 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f  ust be unique */
c5e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
c5f0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
c600: 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74  se);     /* Virt
c610: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
c620: 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73  g coded */..  as
c630: 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
c640: 5f 49 4e 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  _IN );..  /* Che
c650: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20  ck to see if an 
c660: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
c670: 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  r index can be u
c680: 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69  sed to.  ** sati
c690: 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20  sfy the query.  
c6a0: 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62  This is preferab
c6b0: 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67  le to generating
c6c0: 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68   a new .  ** eph
c6d0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20  emeral table..  
c6e0: 2a 2f 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61  */.  p = (ExprHa
c6f0: 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
c700: 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58  _xIsSelect) ? pX
c710: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29  ->x.pSelect : 0)
c720: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
c730: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20  Parse->nErr==0) 
c740: 26 26 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  && isCandidateFo
c750: 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20  rInOpt(p) ){.   
c760: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c770: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
c780: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
c790: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
c7a0: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
c7b0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c7d0: 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a  Table <table>. *
c7e0: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  /.    Expr *pExp
c7f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c810: 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75  Expression <colu
c820: 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  mn> */.    int i
c830: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
c860: 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f  lumn <column> */
c870: 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c8a0: 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20  atabase idx for 
c8b0: 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73  pTab */..    ass
c8c0: 65 72 74 28 20 70 20 29 3b 20 20 20 20 20 20 20  ert( p );       
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c8f0: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c900: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
c910: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d  ert( p->pEList!=
c920: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
c930: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c940: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c950: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
c960: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
c970: 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
c980: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c990: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c9a0: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
c9b0: 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20  ert( p->pSrc!=0 
c9c0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
c9d0: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c9e0: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c9f0: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61  pt(p) */.    pTa
ca00: 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
ca10: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70  ].pTab;.    pExp
ca20: 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
ca30: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [0].pExpr;.    i
ca40: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
ca50: 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20 2f 2a  lumn;.   .    /*
ca60: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 56 65 72 69   Code an OP_Veri
ca70: 66 79 43 6f 6f 6b 69 65 20 61 6e 64 20 4f 50 5f  fyCookie and OP_
ca80: 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74  TableLock for <t
ca90: 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44  able>. */.    iD
caa0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cab0: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
cac0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
cad0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
cae0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
caf0: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
cb00: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
cb10: 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
cb20: 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
cb30: 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ame);..    /* Th
cb40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
cb50: 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
cb60: 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62  two places. In b
cb70: 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64  oth cases the vd
cb80: 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c  be.    ** has al
cb90: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
cba0: 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20  ated. So assume 
cbb0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29  sqlite3GetVdbe()
cbc0: 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a   is always.    *
cbd0: 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72  * successful her
cbe0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
cbf0: 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28  sert(v);.    if(
cc00: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
cc10: 20 69 6e 74 20 69 41 64 64 72 3b 0a 0a 20 20 20   int iAddr;..   
cc20: 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74     iAddr = sqlit
cc30: 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
cc40: 65 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  e);..      sqlit
cc50: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
cc60: 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
cc70: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
cc80: 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
cc90: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
cca0: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
ccb0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
ccc0: 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Addr);.    }else
ccd0: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
cce0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd00: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
cd10: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  e */..      /* T
cd20: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
cd30: 75 65 6e 63 65 20 75 73 65 64 20 62 79 20 74 68  uence used by th
cd40: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66  e comparison. If
cd50: 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 0a   an index is to.
cd60: 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64        ** be used
cd70: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74   in place of a t
cd80: 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75  emp-table, it mu
cd90: 73 74 20 62 65 20 6f 72 64 65 72 65 64 20 61 63  st be ordered ac
cda0: 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a  cording.      **
cdb0: 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69   to this collati
cdc0: 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f  on sequence.  */
cdd0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
cde0: 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69  pReq = sqlite3Bi
cdf0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
ce00: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
ce10: 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20  Left, pExpr);.. 
ce20: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
ce30: 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
ce40: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
ce50: 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  d to perform the
ce60: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61   .      ** compa
ce70: 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  rison is the sam
ce80: 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74  e as the affinit
ce90: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  y of the column.
cea0: 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   If.      ** it 
ceb0: 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f  is not, it is no
cec0: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
ced0: 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20  e any index..   
cee0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
cef0: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71  affinity_ok = sq
cf00: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
cf10: 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d 3e 61  tyOk(pX, pTab->a
cf20: 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
cf30: 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  ty);..      for(
cf40: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
cf50: 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65  x; pIdx && eType
cf60: 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f  ==0 && affinity_
cf70: 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  ok; pIdx=pIdx->p
cf80: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
cf90: 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  f( (pIdx->aiColu
cfa0: 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20  mn[0]==iCol).   
cfb0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
cfc0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
cfd0: 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e 61  ENC(db), pIdx->a
cfe0: 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52  zColl[0], 0)==pR
cff0: 65 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  eq.         && (
d000: 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c  !mustBeUnique ||
d010: 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d   (pIdx->nColumn=
d020: 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72  =1 && pIdx->onEr
d030: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20  ror!=OE_None)). 
d040: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
d050: 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20      int iAddr;. 
d060: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
d070: 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Key;.  .        
d080: 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a    pKey = (char *
d090: 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  )sqlite3IndexKey
d0a0: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
d0b0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 41  x);.          iA
d0c0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
d0d0: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20  eOnce(pParse);. 
d0e0: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
d0f0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
d100: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
d110: 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ab, pIdx->tnum, 
d120: 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59 49      pKey,P4_KEYI
d150: 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
d160: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
d170: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
d180: 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
d190: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49         assert( I
d1a0: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
d1b0: 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  SC == IN_INDEX_I
d1c0: 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20  NDEX_ASC+1 );.  
d1d0: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
d1e0: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
d1f0: 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74  SC + pIdx->aSort
d200: 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 20  Order[0];..     
d210: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d220: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
d230: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
d240: 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26 20  ( prNotFound && 
d250: 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  !pTab->aCol[iCol
d260: 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20  ].notNull ){.   
d270: 20 20 20 20 20 20 20 20 20 2a 70 72 4e 6f 74 46           *prNotF
d280: 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ound = ++pParse-
d290: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
d2a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d2b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
d2c0: 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29   0, *prNotFound)
d2d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d2f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
d300: 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   eType==0 ){.   
d310: 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 6f   /* Could not fo
d320: 75 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20  und an existing 
d330: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
d340: 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53  o use as the RHS
d350: 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20   b-tree..    ** 
d360: 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  We will have to 
d370: 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65  generate an ephe
d380: 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64  meral table to d
d390: 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a  o the job..    *
d3a0: 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e  /.    u32 savedN
d3b0: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
d3c0: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
d3d0: 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65      int rMayHave
d3e0: 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54  Null = 0;.    eT
d3f0: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45  ype = IN_INDEX_E
d400: 50 48 3b 0a 20 20 20 20 69 66 28 20 70 72 4e 6f  PH;.    if( prNo
d410: 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20 20  tFound ){.      
d420: 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 72 4d  *prNotFound = rM
d430: 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70  ayHaveNull = ++p
d440: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
d450: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d460: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
d470: 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29   0, *prNotFound)
d480: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d490: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
d4a0: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3e  rse->nQueryLoop>
d4b0: 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  0 );.      pPars
d4c0: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
d4d0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  0;.      if( pX-
d4e0: 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c  >pLeft->iColumn<
d4f0: 30 20 26 26 20 21 45 78 70 72 48 61 73 41 6e 79  0 && !ExprHasAny
d500: 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
d510: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
d520: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
d530: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20  _INDEX_ROWID;.  
d540: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d550: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
d560: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c  lect(pParse, pX,
d570: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65   rMayHaveNull, e
d580: 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
d590: 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73  OWID);.    pPars
d5a0: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
d5b0: 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
d5c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58  .  }else{.    pX
d5d0: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
d5e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54  .  }.  return eT
d5f0: 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ype;.}.#endif../
d600: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
d610: 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75  de for scalar su
d620: 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73  bqueries used as
d630: 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72   a subquery expr
d640: 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a  ession, EXISTS,.
d650: 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f  ** or IN operato
d660: 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  rs.  Examples:.*
d670: 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54  *.**     (SELECT
d680: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20   a FROM b)      
d690: 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a      -- subquery.
d6a0: 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53  **     EXISTS (S
d6b0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
d6c0: 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71    -- EXISTS subq
d6d0: 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e  uery.**     x IN
d6e0: 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20   (4,5,11)       
d6f0: 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65         -- IN ope
d700: 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20  rator with list 
d710: 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  on right-hand si
d720: 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  de.**     x IN (
d730: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
d740: 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
d750: 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72  tor with subquer
d760: 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a  y on the right.*
d770: 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70  *.** The pExpr p
d780: 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62  arameter describ
d790: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
d7a0: 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  n that contains 
d7b0: 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74  the IN.** operat
d7c0: 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a  or or subquery..
d7d0: 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
d7e0: 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f  er isRowid is no
d7f0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70  n-zero, then exp
d800: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
d810: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
d820: 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  o be of the form
d830: 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c   "<rowid> IN (?,
d840: 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c   ?, ?)", where <
d850: 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65  rowid> is a refe
d860: 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65  rence.** to some
d870: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c   integer key col
d880: 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42  umn of a table B
d890: 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63  -Tree. In this c
d8a0: 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69  ase, use an.** i
d8b0: 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20  ntkey B-Tree to 
d8c0: 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
d8d0: 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20   IN(...) values 
d8e0: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
d8f0: 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29  sual.** (slower)
d900: 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
d910: 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a   keys B-Tree..**
d920: 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e  .** If rMayHaveN
d930: 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ull is non-zero,
d940: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
d950: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   the operation i
d960: 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20  s an IN.** (not 
d970: 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
d980: 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65  TS) and that the
d990: 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61   RHS might conta
d9a0: 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75  ins NULLs..** Fu
d9b0: 72 74 68 65 72 6d 6f 72 65 2c 20 74 68 65 20 49  rthermore, the I
d9c0: 4e 20 69 73 20 69 6e 20 61 20 57 48 45 52 45 20  N is in a WHERE 
d9d0: 63 6c 61 75 73 65 20 61 6e 64 20 74 68 61 74 20  clause and that 
d9e0: 77 65 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a  we really want.*
d9f0: 2a 20 74 6f 20 69 74 65 72 61 74 65 20 6f 76 65  * to iterate ove
da00: 72 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  r the RHS of the
da10: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 6e 20   IN operator in 
da20: 6f 72 64 65 72 20 74 6f 20 71 75 69 63 6b 6c 79  order to quickly
da30: 20 6c 6f 63 61 74 65 0a 2a 2a 20 61 6c 6c 20 63   locate.** all c
da40: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 4c 48 53  orresponding LHS
da50: 20 65 6c 65 6d 65 6e 74 73 2e 20 20 41 6c 6c 20   elements.  All 
da60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  this routine doe
da70: 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 0a  s is initialize.
da80: 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ** the register 
da90: 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76  given by rMayHav
daa0: 65 4e 75 6c 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20  eNull to NULL.  
dab0: 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73  Calling routines
dac0: 20 77 69 6c 6c 20 74 61 6b 65 0a 2a 2a 20 63 61   will take.** ca
dad0: 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74  re of changing t
dae0: 68 69 73 20 72 65 67 69 73 74 65 72 20 76 61 6c  his register val
daf0: 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  ue to non-NULL i
db00: 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c  f the RHS is NUL
db10: 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  L-free..**.** If
db20: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73   rMayHaveNull is
db30: 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e   zero, that mean
db40: 73 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75  s that the subqu
db50: 65 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65  ery is being use
db60: 64 0a 2a 2a 20 66 6f 72 20 6d 65 6d 62 65 72 73  d.** for members
db70: 68 69 70 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  hip testing only
db80: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
db90: 65 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  eed to initializ
dba0: 65 20 61 6e 79 0a 2a 2a 20 72 65 67 69 73 74 65  e any.** registe
dbb0: 72 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  rs to indicate t
dbc0: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 72 20 61  he presence or a
dbd0: 62 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20  bsence of NULLs 
dbe0: 6f 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a  on the RHS..**.*
dbf0: 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f  * For a SELECT o
dc00: 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
dc10: 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  r, return the re
dc20: 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
dc30: 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e  s the.** result.
dc40: 20 20 46 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f    For IN operato
dc50: 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  rs or if an erro
dc60: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 72 65  r occurs, the re
dc70: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 30 2e  turn value is 0.
dc80: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
dc90: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
dca0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
dcb0: 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72  Subselect(.  Par
dcc0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
dcd0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
dce0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
dcf0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
dd00: 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20       /* The IN, 
dd10: 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54  SELECT, or EXIST
dd20: 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  S operator */.  
dd30: 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  int rMayHaveNull
dd40: 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ,       /* Regis
dd50: 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73  ter that records
dd60: 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65   whether NULLs e
dd70: 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20  xist in RHS */. 
dd80: 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20   int isRowid    
dd90: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
dda0: 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f  rue, LHS of IN o
ddb0: 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77  perator is a row
ddc0: 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 74  id */.){.  int t
ddd0: 65 73 74 41 64 64 72 20 3d 20 2d 31 3b 20 20 20  estAddr = -1;   
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74     /* One-time t
de00: 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20  est address */. 
de10: 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20   int rReg = 0;  
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
de40: 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73  ster storing res
de50: 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65  ulting */.  Vdbe
de60: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
de70: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
de80: 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
de90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
dea0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
deb0: 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f  sh(pParse);..  /
dec0: 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74  * This code must
ded0: 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65   be run in its e
dee0: 6e 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69  ntirety every ti
def0: 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
df00: 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79  ered.  ** if any
df10: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
df20: 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a  g is true:.  **.
df30: 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
df40: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
df50: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
df60: 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20  ubquery.  **    
df70: 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
df80: 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70  d side is an exp
df90: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
dfa0: 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65  taining variable
dfb0: 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20  s.  **    *  We 
dfc0: 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69  are inside a tri
dfd0: 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gger.  **.  ** I
dfe0: 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
dff0: 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68  ve are false, th
e000: 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68  en we can run th
e010: 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63  is code just onc
e020: 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20  e.  ** save the 
e030: 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75  results, and reu
e040: 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  se the same resu
e050: 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74  lt on subsequent
e060: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20   invocations..  
e070: 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  */.  if( !ExprHa
e080: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
e090: 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
e0a0: 29 20 29 7b 0a 20 20 20 20 74 65 73 74 41 64 64  ) ){.    testAdd
e0b0: 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  r = sqlite3CodeO
e0c0: 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  nce(pParse);.  }
e0d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e0e0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
e0f0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
e100: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68  ain==2 ){.    ch
e110: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
e120: 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20  e3MPrintf(.     
e130: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22     pParse->db, "
e140: 45 58 45 43 55 54 45 20 25 73 25 73 20 53 55 42  EXECUTE %s%s SUB
e150: 51 55 45 52 59 20 25 64 22 2c 20 74 65 73 74 41  QUERY %d", testA
e160: 64 64 72 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45  ddr>=0?"":"CORRE
e170: 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20  LATED ",.       
e180: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
e190: 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52  N?"LIST":"SCALAR
e1a0: 22 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  ", pParse->iNext
e1b0: 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a  SelectId.    );.
e1c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e1d0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
e1e0: 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
e1f0: 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
e200: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
e210: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
e220: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
e230: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
e240: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  IN: {.      char
e250: 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
e260: 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
e270: 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f  ity of the LHS o
e280: 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20  f the IN */.    
e290: 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66    KeyInfo keyInf
e2a0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
e2b0: 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 74 68 65   Keyinfo for the
e2c0: 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
e2d0: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
e2e0: 20 75 38 20 73 6f 72 74 4f 72 64 65 72 20 3d 20   u8 sortOrder = 
e2f0: 30 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 61 53  0;    /* Fake aS
e300: 6f 72 74 4f 72 64 65 72 20 66 6f 72 20 6b 65 79  ortOrder for key
e310: 49 6e 66 6f 20 2a 2f 0a 20 20 20 20 20 20 69 6e  Info */.      in
e320: 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
e330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
e340: 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
e350: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
e360: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  tion */.      Ex
e370: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
e380: 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65  r->pLeft; /* the
e390: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
e3a0: 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20  perator */..    
e3b0: 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75    if( rMayHaveNu
e3c0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ll ){.        sq
e3d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e3e0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
e3f0: 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20  MayHaveNull);.  
e400: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 66 66      }..      aff
e410: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
e420: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
e430: 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  t);..      /* Wh
e440: 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e  ether this is an
e450: 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e   'x IN(SELECT...
e460: 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c  )' or an 'x IN(<
e470: 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20  exprlist>)'.    
e480: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
e490: 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68  it is handled th
e4a0: 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20  e same way.  An 
e4b0: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
e4c0: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
e4d0: 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d  led with single-
e4e0: 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73  field index keys
e4f0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
e500: 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
e510: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45  ** from the SELE
e520: 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c  CT or the <exprl
e530: 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ist>..      **. 
e540: 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27       ** If the '
e550: 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  x' expression is
e560: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
e570: 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e   or the SELECT..
e580: 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ..      ** state
e590: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
e5a0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
e5b0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
e5c0: 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
e5d0: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
e5e0: 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
e5f0: 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
e600: 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20  'x' and the.    
e610: 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73    ** SELECT... s
e620: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
e630: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
e640: 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
e650: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  sed.      ** if 
e660: 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
e670: 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
e680: 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
e690: 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20  f neither.      
e6a0: 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53  ** 'x' nor the S
e6b0: 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
e6c0: 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
e6d0: 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
e6e0: 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69  inity.      ** i
e6f0: 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  s used..      */
e700: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
e710: 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
e720: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64  Tab++;.      add
e730: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
e740: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
e750: 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72  Ephemeral, pExpr
e760: 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52 6f 77  ->iTable, !isRow
e770: 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  id);.      if( r
e780: 4d 61 79 48 61 76 65 4e 75 6c 6c 3d 3d 30 20 29  MayHaveNull==0 )
e790: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e7a0: 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
e7b0: 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 20 20  ORDERED);.      
e7c0: 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c  memset(&keyInfo,
e7d0: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e   0, sizeof(keyIn
e7e0: 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49  fo));.      keyI
e7f0: 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a  nfo.nField = 1;.
e800: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 53        keyInfo.aS
e810: 6f 72 74 4f 72 64 65 72 20 3d 20 26 73 6f 72 74  ortOrder = &sort
e820: 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20 20 69 66  Order;..      if
e830: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
e840: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
e850: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
e860: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
e870: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
e880: 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
e890: 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
e8a0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
e8b0: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
e8c0: 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
e8d0: 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
e8e0: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
e8f0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
e900: 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
e910: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
e920: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
e930: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
e940: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t *pEList;..    
e950: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
e960: 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
e970: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
e980: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
e990: 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
e9a0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65  ble);.        de
e9b0: 73 74 2e 61 66 66 53 64 73 74 20 3d 20 28 75 38  st.affSdst = (u8
e9c0: 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  )affinity;.     
e9d0: 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
e9e0: 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
e9f0: 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
ea00: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
ea10: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
ea20: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
ea30: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ea40: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
ea50: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
ea60: 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
ea70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
ea80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ea90: 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
eaa0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
eab0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ist;.        if(
eac0: 20 41 4c 57 41 59 53 28 70 45 4c 69 73 74 21 3d   ALWAYS(pEList!=
ead0: 30 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  0 && pEList->nEx
eae0: 70 72 3e 30 29 20 29 7b 20 0a 20 20 20 20 20 20  pr>0) ){ .      
eaf0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
eb00: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[0] = sqlite3Bi
eb10: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
eb20: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
eb30: 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20  ->pLeft,.       
eb40: 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61         pEList->a
eb50: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
eb60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
eb70: 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
eb80: 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20  pr->x.pList!=0) 
eb90: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
eba0: 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
ebb0: 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
ebc0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
ebd0: 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
ebe0: 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
ebf0: 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
ec00: 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
ec10: 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
ec20: 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
ec30: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
ec40: 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
ec50: 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
ec60: 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
ec70: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
ec80: 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
ec90: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
eca0: 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
ecb0: 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
ecc0: 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
ecd0: 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
ece0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
ecf0: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
ed00: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
ed10: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
ed20: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
ed30: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
ed40: 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72         int r1, r
ed50: 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20  2, r3;..        
ed60: 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
ed70: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e  .          affin
ed80: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
ed90: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
eda0: 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  .        keyInfo
edb0: 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  .aColl[0] = sqli
edc0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
edd0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
ede0: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 6b 65  eft);.        ke
edf0: 79 49 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72  yInfo.aSortOrder
ee00: 20 3d 20 26 73 6f 72 74 4f 72 64 65 72 3b 0a 0a   = &sortOrder;..
ee10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ee20: 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
ee30: 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
ee40: 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20  list>. */.      
ee50: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
ee60: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ee70: 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
ee80: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
ee90: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
eea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
eeb0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
eec0: 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  0, r2);.        
eed0: 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
eee0: 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
eef0: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
ef00: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
ef10: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
ef20: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
ef30: 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f        int iValTo
ef40: 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  Ins;..          
ef50: 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  /* If the expres
ef60: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73  sion is not cons
ef70: 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c  tant then we wil
ef80: 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  l need to.      
ef90: 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
efa0: 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73  he test that was
efb0: 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65   generated above
efc0: 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
efd0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
efe0: 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65  is code only exe
eff0: 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63  cutes once.  Bec
f000: 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63  ause for a non-c
f010: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20  onstant.        
f020: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
f030: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e  we need to rerun
f040: 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20   this code each 
f050: 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20  time..          
f060: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
f070: 20 74 65 73 74 41 64 64 72 3e 3d 30 20 26 26 20   testAddr>=0 && 
f080: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
f090: 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20  nstant(pE2) ){. 
f0a0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f0b0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
f0c0: 6f 70 28 76 2c 20 74 65 73 74 41 64 64 72 29 3b  op(v, testAddr);
f0d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
f0e0: 74 41 64 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20  tAddr = -1;.    
f0f0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
f100: 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
f110: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
f120: 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
f130: 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
f140: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
f150: 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69   isRowid && sqli
f160: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
f170: 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73  (pE2, &iValToIns
f180: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
f190: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f1a0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49  p3(v, OP_InsertI
f1b0: 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nt, pExpr->iTabl
f1c0: 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73  e, r2, iValToIns
f1d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
f1e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
f1f0: 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r3 = sqlite3Expr
f200: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
f210: 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20  e, pE2, r1);.   
f220: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
f230: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
f240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f250: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
f260: 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20  stBeInt, r3,.   
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f290: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
f2a0: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
f2b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f2c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f2d0: 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e  _Insert, pExpr->
f2e0: 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b  iTable, r2, r3);
f2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
f300: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
f310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f320: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
f330: 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c  cord, r3, 1, r2,
f340: 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f360: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
f370: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
f380: 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20  rse, r3, 1);.   
f390: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f3a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f3b0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45  OP_IdxInsert, pE
f3c0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29  xpr->iTable, r2)
f3d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
f3e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f3f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
f400: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
f410: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
f420: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f430: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
f440: 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
f450: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 69    }.      if( !i
f460: 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  sRowid ){.      
f470: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f480: 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
f490: 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c  void *)&keyInfo,
f4a0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
f4b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
f4c0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
f4d0: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
f4e0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
f4f0: 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  :.    default: {
f500: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
f510: 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
f520: 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
f530: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
f540: 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
f550: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
f560: 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
f570: 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
f580: 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
f590: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
f5a0: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
f5b0: 6d 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  mn.  If this is 
f5c0: 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65  an EXISTS, write
f5d0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  .      ** an int
f5e0: 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73  eger 0 (not exis
f5f0: 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73  ts) or 1 (exists
f600: 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20  ) into a memory 
f610: 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e  cell.      ** an
f620: 64 20 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65  d record that me
f630: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
f640: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
f650: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
f660: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
f670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
f680: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
f690: 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20  o encode */.    
f6a0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
f6b0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
f6c0: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
f6d0: 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45  o deal with SELE
f6e0: 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  Ct result */..  
f6f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
f700: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
f710: 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
f720: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
f730: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
f740: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
f750: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
f760: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
f770: 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20  K_SELECT );..   
f780: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
f790: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
f7a0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
f7b0: 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  );.      pSel = 
f7c0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
f7d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
f7e0: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
f7f0: 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65  est, 0, ++pParse
f800: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69  ->nMem);.      i
f810: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
f820: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
f830: 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
f840: 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20  SRT_Mem;.       
f850: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f860: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
f870: 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b  , dest.iSDParm);
f880: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
f890: 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
f8a0: 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
f8b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
f8c0: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
f8d0: 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
f8e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f8f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f900: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 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 45 58 49 53 54 53  (v, "Init EXISTS
f940: 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
f950: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
f960: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
f970: 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c  se->db, pSel->pL
f980: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65  imit);.      pSe
f990: 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
f9a0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
f9b0: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20   TK_INTEGER, 0, 
f9c0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 20 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74       &sqlite3Int
f9f0: 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20  Tokens[1]);.    
fa00: 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d    pSel->iLimit =
fa10: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   0;.      if( sq
fa20: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
fa30: 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
fa40: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
fa50: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
fa60: 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e      rReg = dest.
fa70: 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45  iSDParm;.      E
fa80: 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c  xprSetIrreducibl
fa90: 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  e(pExpr);.      
faa0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
fab0: 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64 64 72  ..  if( testAddr
fac0: 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
fad0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
fae0: 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20 7d  , testAddr);.  }
faf0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
fb00: 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
fb10: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65  );..  return rRe
fb20: 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  g;.}.#endif /* S
fb30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
fb40: 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
fb50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
fb60: 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
fb70: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
fb80: 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
fb90: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
fba0: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
fbb0: 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
fbc0: 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
fbd0: 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
fbe0: 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
fbf0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
fc00: 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74 2d 68  on.  The right-h
fc10: 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 0a 2a  and side (RHS).*
fc20: 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  * is an array of
fc30: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61   zero or more va
fc40: 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70 72 65  lues.  The expre
fc50: 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66  ssion is true if
fc60: 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63   the LHS is.** c
fc70: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
fc80: 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 76 61  the RHS.  The va
fc90: 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70 72 65  lue of the expre
fca0: 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e  ssion is unknown
fcb0: 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68   (NULL).** if th
fcc0: 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72  e LHS is NULL or
fcd0: 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
fce0: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ot contained wit
fcf0: 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e 64 20  hin the RHS and 
fd00: 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61  the.** RHS conta
fd10: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
fd20: 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  NULL values..**.
fd30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
fd40: 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 77  generates code w
fd50: 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  ill jump to dest
fd60: 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c  IfFalse if the L
fd70: 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  HS 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 2e 20 20 49 66 20 64 75 65 20  he RHS.  If due 
fda0: 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e  to NULLs we cann
fdb0: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  ot determine if 
fdc0: 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f  the LHS.** is co
fdd0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
fde0: 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  HS then jump to 
fdf0: 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20  destIfNull.  If 
fe00: 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
fe10: 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ined.** within t
fe20: 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c  he RHS then fall
fe30: 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61   through..*/.sta
fe40: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
fe50: 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61  ExprCodeIN(.  Pa
fe60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
fe70: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
fe80: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
fe90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
fea0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
feb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
fec0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
fed0: 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c  int destIfFalse,
fee0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
fef0: 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74  re if LHS is not
ff00: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
ff10: 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64  e RHS */.  int d
ff20: 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20  estIfNull       
ff30: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
ff40: 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
ff50: 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20   unknown due to 
ff60: 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULLs */.){.  in
ff70: 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  t rRhsHasNull = 
ff80: 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  0;  /* Register 
ff90: 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20  that is true if 
ffa0: 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
ffb0: 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68  L values */.  ch
ffc0: 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
ffd0: 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
ffe0: 6e 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  n affinity to us
fff0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  e */.  int eType
10000 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10010 54 79 70 65 20 6f 66 20 74 68 65 20 52 48 53 20  Type of the RHS 
10020 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20 20 20  */.  int r1;    
10030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
10040 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
10050 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ster */.  Vdbe *
10060 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
10070 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64  /* Statement und
10080 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
10090 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  */..  /* Compute
100a0 20 74 68 65 20 52 48 53 2e 20 20 20 41 66 74 65   the RHS.   Afte
100b0 72 20 74 68 69 73 20 73 74 65 70 2c 20 74 68 65  r this step, the
100c0 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
100d0 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69  or.  ** pExpr->i
100e0 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61  Table will conta
100f0 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74  ins the values t
10100 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
10110 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  RHS..  */.  v = 
10120 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
10130 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
10140 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65         /* OOM de
10150 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20  tected prior to 
10160 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
10170 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
10180 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20  t((v, "begin IN 
10190 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65  expr"));.  eType
101a0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
101b0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45  Index(pParse, pE
101c0 78 70 72 2c 20 26 72 52 68 73 48 61 73 4e 75 6c  xpr, &rRhsHasNul
101d0 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  l);..  /* Figure
101e0 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74   out the affinit
101f0 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61  y to use to crea
10200 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68  te a key from th
10210 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 6f  e results.  ** o
10220 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10230 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74  . affinityStr st
10240 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74  ores a static st
10250 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
10260 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f  r.  ** P4 of OP_
10270 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 2a 2f  MakeRecord..  */
10280 0a 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f  .  affinity = co
10290 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
102a0 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a 20 43  (pExpr);..  /* C
102b0 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65  ode the LHS, the
102c0 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65   <expr> from "<e
102d0 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a  xpr> IN (...)"..
102e0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
102f0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
10300 73 65 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69  se);.  r1 = sqli
10310 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
10320 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
10330 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
10340 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 72   pExpr->pLeft, r
10350 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  1);..  /* If the
10360 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68   LHS is NULL, th
10370 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
10380 20 65 69 74 68 65 72 20 66 61 6c 73 65 20 6f 72   either false or
10390 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a   NULL depending.
103a0 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20    ** on whether 
103b0 74 68 65 20 52 48 53 20 69 73 20 65 6d 70 74 79  the RHS is empty
103c0 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74   or not, respect
103d0 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ively..  */.  if
103e0 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
103f0 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
10400 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
10410 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
10420 20 77 68 65 72 65 20 74 68 65 20 66 61 6c 73 65   where the false
10430 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d   and NULL outcom
10440 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  es are.    ** th
10450 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 73  e same. */.    s
10460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10470 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
10480 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  1, destIfNull);.
10490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
104a0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
104b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
104c0 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 0a 20  _NotNull, r1);. 
104d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
104e0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
104f0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
10500 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
10510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10520 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
10530 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  , 0, destIfNull)
10540 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10550 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
10560 72 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  r1);.  }..  if( 
10570 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
10580 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20  ROWID ){.    /* 
10590 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
105a0 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57  e RHS is the ROW
105b0 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72  ID of table b-tr
105c0 65 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ee.    */.    sq
105d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
105e0 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
105f0 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c 73 65   r1, destIfFalse
10600 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10610 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
10620 6f 74 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d  otExists, pExpr-
10630 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
10640 61 6c 73 65 2c 20 72 31 29 3b 0a 20 20 7d 65 6c  alse, r1);.  }el
10650 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68  se{.    /* In th
10660 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53  is case, the RHS
10670 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   is an index b-t
10680 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ree..    */.    
10690 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
106a0 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  4(v, OP_Affinity
106b0 2c 20 72 31 2c 20 31 2c 20 30 2c 20 26 61 66 66  , r1, 1, 0, &aff
106c0 69 6e 69 74 79 2c 20 31 29 3b 0a 0a 20 20 20 20  inity, 1);..    
106d0 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d 65  /* If the set me
106e0 6d 62 65 72 73 68 69 70 20 74 65 73 74 20 66 61  mbership test fa
106f0 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ils, then the re
10700 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20  sult of the .   
10710 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22   ** "x IN (...)"
10720 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
10730 20 62 65 20 65 69 74 68 65 72 20 30 20 6f 72 20   be either 0 or 
10740 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74  NULL. If the set
10750 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  .    ** contains
10760 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c   no NULL values,
10770 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
10780 20 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65   is 0. If the se
10790 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  t .    ** contai
107a0 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e  ns one or more N
107b0 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e  ULL values, then
107c0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
107d0 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73  he.    ** expres
107e0 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c  sion is also NUL
107f0 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  L..    */.    if
10800 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30  ( rRhsHasNull==0
10810 20 7c 7c 20 64 65 73 74 49 66 46 61 6c 73 65 3d   || destIfFalse=
10820 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20  =destIfNull ){. 
10830 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
10840 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74 20 69  nch runs if it i
10850 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69  s known at compi
10860 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74 68 65  le time that the
10870 20 52 48 53 0a 20 20 20 20 20 20 2a 2a 20 63 61   RHS.      ** ca
10880 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  nnot contain NUL
10890 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68  L values. This h
108a0 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72 65  appens as the re
108b0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66  sult.      ** of
108c0 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   a "NOT NULL" co
108d0 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20  nstraint in the 
108e0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
108f0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
10900 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73  ** Also run this
10910 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20   branch if NULL 
10920 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
10930 20 46 41 4c 53 45 0a 20 20 20 20 20 20 2a 2a 20   FALSE.      ** 
10940 66 6f 72 20 74 68 69 73 20 70 61 72 74 69 63 75  for this particu
10950 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  lar IN operator.
10960 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10980 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
10990 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
109a0 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
109b0 20 72 31 2c 20 31 29 3b 0a 0a 20 20 20 20 7d 65   r1, 1);..    }e
109c0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
109d0 20 74 68 69 73 20 62 72 61 6e 63 68 2c 20 74 68   this branch, th
109e0 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
109f0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20  might contain a 
10a00 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20 2a  NULL and.      *
10a10 2a 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  * the presence o
10a20 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20  f a NULL on the 
10a30 52 48 53 20 6d 61 6b 65 73 20 61 20 64 69 66 66  RHS makes a diff
10a40 65 72 65 6e 63 65 20 69 6e 20 74 68 65 0a 20 20  erence in the.  
10a50 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a      ** outcome..
10a60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
10a70 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a 33 3b 0a 0a  nt j1, j2, j3;..
10a80 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63        /* First c
10a90 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
10aa0 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69  he LHS is contai
10ab0 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e 20  ned in the RHS. 
10ac0 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a   If so,.      **
10ad0 20 74 68 65 6e 20 74 68 65 20 70 72 65 73 65 6e   then the presen
10ae0 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74  ce of NULLs in t
10af0 68 65 20 52 48 53 20 64 6f 65 73 20 6e 6f 74 20  he RHS does not 
10b00 6d 61 74 74 65 72 2c 20 73 6f 20 6a 75 6d 70 0a  matter, so jump.
10b10 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 61 6c        ** over al
10b20 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74 68  l of the code th
10b30 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a 20 20 20 20  at follows..    
10b40 20 20 2a 2f 0a 20 20 20 20 20 20 6a 31 20 3d 20    */.      j1 = 
10b50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b60 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
10b70 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10b80 20 30 2c 20 72 31 2c 20 31 29 3b 0a 0a 20 20 20   0, r1, 1);..   
10b90 20 20 20 2f 2a 20 48 65 72 65 20 77 65 20 62 65     /* Here we be
10ba0 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
10bb0 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 69 66  ode that runs if
10bc0 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 0a   the LHS is not.
10bd0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
10be0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
10bf0 53 2e 20 20 47 65 6e 65 72 61 74 65 20 61 64 64  S.  Generate add
10c00 69 74 69 6f 6e 61 6c 20 63 6f 64 65 20 74 68 61  itional code tha
10c10 74 0a 20 20 20 20 20 20 2a 2a 20 74 65 73 74 73  t.      ** tests
10c20 20 74 68 65 20 52 48 53 20 66 6f 72 20 4e 55 4c   the RHS for NUL
10c30 4c 73 2e 20 20 49 66 20 74 68 65 20 52 48 53 20  Ls.  If the RHS 
10c40 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 20  contains a NULL 
10c50 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75  then.      ** ju
10c60 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c  mp to destIfNull
10c70 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
10c80 6e 6f 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20  no NULLs in the 
10c90 52 48 53 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  RHS then.      *
10ca0 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  * jump to destIf
10cb0 46 61 6c 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  False..      */.
10cc0 20 20 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74        j2 = sqlit
10cd0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
10ce0 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73  OP_NotNull, rRhs
10cf0 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  HasNull);.      
10d00 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j3 = sqlite3Vdbe
10d10 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
10d20 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
10d30 61 62 6c 65 2c 20 30 2c 20 72 52 68 73 48 61 73  able, 0, rRhsHas
10d40 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20  Null, 1);.      
10d50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10d60 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
10d70 20 2d 31 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c   -1, rRhsHasNull
10d80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10d90 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10da0 6a 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  j3);.      sqlit
10db0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10dc0 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 52 68 73 48  OP_AddImm, rRhsH
10dd0 61 73 4e 75 6c 6c 2c 20 31 29 3b 0a 20 20 20 20  asNull, 1);.    
10de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10df0 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 0a 20  pHere(v, j2);.. 
10e00 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20       /* Jump to 
10e10 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
10e20 74 61 72 67 65 74 20 64 65 70 65 6e 64 69 6e 67  target depending
10e30 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
10e40 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ot.      ** the 
10e50 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e  RHS contains a N
10e60 55 4c 4c 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ULL.      */.   
10e70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10e80 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
10e90 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74  RhsHasNull, dest
10ea0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
10eb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10ec0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
10ed0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20  destIfFalse);.. 
10ee0 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 46       /* The OP_F
10ef0 6f 75 6e 64 20 61 74 20 74 68 65 20 74 6f 70 20  ound at the top 
10f00 6f 66 20 74 68 69 73 20 62 72 61 6e 63 68 20 6a  of this branch j
10f10 75 6d 70 73 20 68 65 72 65 20 77 68 65 6e 20 74  umps here when t
10f20 72 75 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20 63  rue, .      ** c
10f30 61 75 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61  ausing the overa
10f40 6c 6c 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  ll IN expression
10f50 20 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20 66   evaluation to f
10f60 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 20 20 20  all through..   
10f70 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
10f80 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
10f90 76 2c 20 6a 31 29 3b 0a 20 20 20 20 7d 0a 20 20  v, j1);.    }.  
10fa0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
10fb0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
10fc0 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
10fd0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
10fe0 72 73 65 2c 20 31 29 3b 0a 20 20 56 64 62 65 43  rse, 1);.  VdbeC
10ff0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
11000 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65  IN expr"));.}.#e
11010 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11020 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
11030 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65  ./*.** Duplicate
11040 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c 75 65   an 8-byte value
11050 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
11060 2a 64 75 70 38 62 79 74 65 73 28 56 64 62 65 20  *dup8bytes(Vdbe 
11070 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
11080 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75 74  in){.  char *out
11090 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
110a0 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62  ocRaw(sqlite3Vdb
110b0 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20 69 66  eDb(v), 8);.  if
110c0 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65 6d  ( out ){.    mem
110d0 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29 3b  cpy(out, in, 8);
110e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75  .  }.  return ou
110f0 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  t;.}..#ifndef SQ
11100 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
11110 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47  NG_POINT./*.** G
11120 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
11130 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
11140 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e   put the floatin
11150 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
11160 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b   described by z[
11170 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
11180 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
11190 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
111a0 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
111b0 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
111c0 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
111d0 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
111e0 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
111f0 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
11200 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
11210 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
11220 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
11230 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
11240 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52  tatic void codeR
11250 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  eal(Vdbe *v, con
11260 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
11270 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20  negateFlag, int 
11280 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57  iMem){.  if( ALW
11290 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20  AYS(z!=0) ){.   
112a0 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20   double value;. 
112b0 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20     char *zV;.   
112c0 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20   sqlite3AtoF(z, 
112d0 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53  &value, sqlite3S
112e0 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
112f0 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73  TE_UTF8);.    as
11300 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73  sert( !sqlite3Is
11310 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a  NaN(value) ); /*
11320 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65   The new AtoF ne
11330 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20  ver returns NaN 
11340 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74  */.    if( negat
11350 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20  eFlag ) value = 
11360 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20 3d  -value;.    zV =
11370 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63   dup8bytes(v, (c
11380 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20  har*)&value);.  
11390 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
113a0 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  Op4(v, OP_Real, 
113b0 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20  0, iMem, 0, zV, 
113c0 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a  P4_REAL);.  }.}.
113d0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47  #endif.../*.** G
113e0 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
113f0 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
11400 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
11410 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
11420 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  text z[0..n-1] i
11430 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
11440 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e  m..**.** Expr.u.
11450 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73  zToken is always
11460 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74   UTF8 and zero-t
11470 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74  erminated..*/.st
11480 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
11490 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61  teger(Parse *pPa
114a0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
114b0 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69  , int negFlag, i
114c0 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65  nt iMem){.  Vdbe
114d0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
114e0 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72  dbe;.  if( pExpr
114f0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
11500 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74  Value ){.    int
11510 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56   i = pExpr->u.iV
11520 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  alue;.    assert
11530 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( i>=0 );.    if
11540 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20  ( negFlag ) i = 
11550 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -i;.    sqlite3V
11560 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11570 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d  Integer, i, iMem
11580 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11590 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76  int c;.    i64 v
115a0 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  alue;.    const 
115b0 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d  char *z = pExpr-
115c0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61  >u.zToken;.    a
115d0 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
115e0 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 41 74     c = sqlite3At
115f0 6f 69 36 34 28 7a 2c 20 26 76 61 6c 75 65 2c 20  oi64(z, &value, 
11600 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11610 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
11620 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 7c  ;.    if( c==0 |
11630 7c 20 28 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c  | (c==2 && negFl
11640 61 67 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ag) ){.      cha
11650 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20 69 66 28  r *zV;.      if(
11660 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75   negFlag ){ valu
11670 65 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c  e = c==2 ? SMALL
11680 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c  EST_INT64 : -val
11690 75 65 3b 20 7d 0a 20 20 20 20 20 20 7a 56 20 3d  ue; }.      zV =
116a0 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63   dup8bytes(v, (c
116b0 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20  har*)&value);.  
116c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
116d0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36  ddOp4(v, OP_Int6
116e0 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a  4, 0, iMem, 0, z
116f0 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  V, P4_INT64);.  
11700 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20    }else{.#ifdef 
11710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
11720 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
11730 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11740 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69  (pParse, "oversi
11750 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25  zed integer: %s%
11760 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d  s", negFlag ? "-
11770 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73  " : "", z);.#els
11780 65 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  e.      codeReal
11790 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20  (v, z, negFlag, 
117a0 69 4d 65 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  iMem);.#endif.  
117b0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
117c0 20 43 6c 65 61 72 20 61 20 63 61 63 68 65 20 65   Clear a cache e
117d0 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ntry..*/.static 
117e0 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72 79 43  void cacheEntryC
117f0 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72  lear(Parse *pPar
11800 73 65 2c 20 73 74 72 75 63 74 20 79 43 6f 6c 43  se, struct yColC
11810 61 63 68 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  ache *p){.  if( 
11820 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20  p->tempReg ){.  
11830 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
11840 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
11850 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
11860 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  g) ){.      pPar
11870 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
11880 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
11890 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
118a0 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67  }.    p->tempReg
118b0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   = 0;.  }.}.../*
118c0 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68  .** Record in th
118d0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74  e column cache t
118e0 68 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72  hat a particular
118f0 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a   column from a.*
11900 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  * particular tab
11910 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  le is stored in 
11920 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67  a particular reg
11930 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ister..*/.void s
11940 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
11950 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  tore(Parse *pPar
11960 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e  se, int iTab, in
11970 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67  t iCol, int iReg
11980 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
11990 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20  t minLru;.  int 
119a0 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74  idxLru;.  struct
119b0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
119c0 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e 30    assert( iReg>0
119d0 20 29 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72   );  /* Register
119e0 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77   numbers are alw
119f0 61 79 73 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a  ays positive */.
11a00 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
11a10 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38  -1 && iCol<32768
11a20 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63   );  /* Finite c
11a30 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f  olumn numbers */
11a40 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
11a50 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c  E_ColumnCache fl
11a60 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  ag disables the 
11a70 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54  column cache.  T
11a80 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  his is used.  **
11a90 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c   for testing onl
11aa0 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68  y - to verify th
11ab0 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73  at SQLite always
11ac0 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20 61   gets the same a
11ad0 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20  nswer.  ** with 
11ae0 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65 20  and without the 
11af0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
11b00 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
11b10 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50  ationDisabled(pP
11b20 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
11b30 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20  _ColumnCache) ) 
11b40 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69  return;..  /* Fi
11b50 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20  rst replace any 
11b60 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a  existing entry..
11b70 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
11b80 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68 65 20  ly, the way the 
11b90 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20  column cache is 
11ba0 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20  currently used, 
11bb0 77 65 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  we are guarantee
11bc0 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  d.  ** that the 
11bd0 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65  object will neve
11be0 72 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20  r already be in 
11bf0 63 61 63 68 65 2e 20 20 56 65 72 69 66 79 20 74  cache.  Verify t
11c00 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20  his guarantee.. 
11c10 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
11c20 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  UG.  for(i=0, p=
11c30 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
11c40 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
11c50 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
11c60 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
11c70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e  ->iReg==0 || p->
11c80 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20  iTable!=iTab || 
11c90 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  p->iColumn!=iCol
11ca0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
11cb0 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70    /* Find an emp
11cc0 74 79 20 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c  ty slot and repl
11cd0 61 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28  ace it */.  for(
11ce0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
11cf0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
11d00 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
11d10 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
11d20 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a  ( p->iReg==0 ){.
11d30 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20        p->iLevel 
11d40 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
11d50 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  Level;.      p->
11d60 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
11d70 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20       p->iColumn 
11d80 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d  = iCol;.      p-
11d90 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
11da0 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
11db0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75   0;.      p->lru
11dc0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
11dd0 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65  eCnt++;.      re
11de0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
11df0 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
11e00 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79 20  e last recently 
11e10 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75  used */.  minLru
11e20 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   = 0x7fffffff;. 
11e30 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20   idxLru = -1;.  
11e40 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
11e50 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
11e60 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
11e70 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
11e80 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e    if( p->lru<min
11e90 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64 78  Lru ){.      idx
11ea0 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d  Lru = i;.      m
11eb0 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a  inLru = p->lru;.
11ec0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
11ed0 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e 3d 30  ALWAYS(idxLru>=0
11ee0 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50  ) ){.    p = &pP
11ef0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
11f00 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e  idxLru];.    p->
11f10 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
11f20 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
11f30 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
11f40 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75  ab;.    p->iColu
11f50 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  mn = iCol;.    p
11f60 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ->iReg = iReg;. 
11f70 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
11f80 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  0;.    p->lru = 
11f90 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
11fa0 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  t++;.    return;
11fb0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
11fc0 64 69 63 61 74 65 20 74 68 61 74 20 72 65 67 69  dicate that regi
11fd0 73 74 65 72 73 20 62 65 74 77 65 65 6e 20 69 52  sters between iR
11fe0 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20  eg..iReg+nReg-1 
11ff0 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72  are being overwr
12000 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20  itten..** Purge 
12010 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67  the range of reg
12020 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20  isters from the 
12030 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f  column cache..*/
12040 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
12050 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72  rCacheRemove(Par
12060 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
12070 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b  iReg, int nReg){
12080 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
12090 69 4c 61 73 74 20 3d 20 69 52 65 67 20 2b 20 6e  iLast = iReg + n
120a0 52 65 67 20 2d 20 31 3b 0a 20 20 73 74 72 75 63  Reg - 1;.  struc
120b0 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
120c0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
120d0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
120e0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
120f0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
12100 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69      int r = p->i
12110 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d  Reg;.    if( r>=
12120 69 52 65 67 20 26 26 20 72 3c 3d 69 4c 61 73 74  iReg && r<=iLast
12130 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
12140 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
12150 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
12160 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
12170 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65   }.}../*.** Reme
12180 6d 62 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  mber the current
12190 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f   column cache co
121a0 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20  ntext.  Any new 
121b0 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a  entries added.**
121c0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f   added to the co
121d0 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72  lumn cache after
121e0 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72   this call are r
121f0 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a  emoved when the.
12200 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
12210 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a   pop occurs..*/.
12220 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
12230 43 61 63 68 65 50 75 73 68 28 50 61 72 73 65 20  CachePush(Parse 
12240 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72  *pParse){.  pPar
12250 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b  se->iCacheLevel+
12260 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  +;.}../*.** Remo
12270 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  ve from the colu
12280 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74  mn cache any ent
12290 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61  ries that were a
122a0 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a  dded since the.*
122b0 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 4e  * the previous N
122c0 20 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 73   Push operations
122d0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
122e0 73 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  s, restore the c
122f0 61 63 68 65 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ache.** to the s
12300 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 4e  tate it was in N
12310 20 50 75 73 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a   Pushes ago..*/.
12320 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
12330 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a  CachePop(Parse *
12340 70 50 61 72 73 65 2c 20 69 6e 74 20 4e 29 7b 0a  pParse, int N){.
12350 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
12360 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
12370 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20 29 3b    assert( N>0 );
12380 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
12390 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d  e->iCacheLevel>=
123a0 4e 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  N );.  pParse->i
123b0 43 61 63 68 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b  CacheLevel -= N;
123c0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
123d0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
123e0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
123f0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
12400 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
12410 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50   && p->iLevel>pP
12420 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
12430 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  l ){.      cache
12440 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
12450 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e, p);.      p->
12460 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  iReg = 0;.    }.
12470 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
12480 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d  n a cached colum
12490 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b  n is reused, mak
124a0 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20  e sure that its 
124b0 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e  register is.** n
124c0 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62  o longer availab
124d0 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67  le as a temp reg
124e0 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23  ister.  ticket #
124f0 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65  3879:  that same
12500 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67  .** register mig
12510 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ht be in the cac
12520 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  he in multiple p
12530 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72  laces, so be sur
12540 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d  e to.** get them
12550 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   all..*/.static 
12560 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
12570 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
12580 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12590 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
125a0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
125b0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
125c0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
125d0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
125e0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
125f0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
12600 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
12610 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d   ){.      p->tem
12620 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
12630 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
12640 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78  erate code to ex
12650 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
12660 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  of the iCol-th c
12670 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
12680 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12690 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
126a0 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62  mnOfTable(.  Vdb
126b0 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20  e *v,        /* 
126c0 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63  The VDBE under c
126d0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
126e0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
126f0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f   /* The table co
12700 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
12710 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ue */.  int iTab
12720 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 63  Cur,    /* The c
12730 75 72 73 6f 72 20 66 6f 72 20 74 68 69 73 20 74  ursor for this t
12740 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  able */.  int iC
12750 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ol,       /* Ind
12760 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
12770 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20   to extract */. 
12780 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20   int regOut     
12790 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
127a0 76 61 6c 75 64 20 69 6e 74 6f 20 74 68 69 73 20  valud into this 
127b0 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
127c0 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69   if( iCol<0 || i
127d0 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  Col==pTab->iPKey
127e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
127f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12800 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20  Rowid, iTabCur, 
12810 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  regOut);.  }else
12820 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49  {.    int op = I
12830 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
12840 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50   OP_VColumn : OP
12850 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c  _Column;.    sql
12860 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12870 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 69  , op, iTabCur, i
12880 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
12890 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
128a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
128b0 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
128c0 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75  Tab, iCol, regOu
128d0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
128e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
128f0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
12900 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
12910 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
12920 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74  able pTab and st
12930 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
12940 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74  alue in a regist
12950 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a  er.  An effort.*
12960 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f  * is made to sto
12970 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
12980 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
12990 69 52 65 67 2c 20 62 75 74 20 74 68 69 73 20 69  iReg, but this i
129a0 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74  s.** not guarant
129b0 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69  eed.  The locati
129c0 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  on of the column
129d0 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
129e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ed..**.** There 
129f0 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
12a00 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69  cursor to pTab i
12a10 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68  n iTable when th
12a20 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
12a30 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f   called.  If iCo
12a40 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65  lumn<0 then code
12a50 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68   is generated th
12a60 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20  at extracts the 
12a70 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rowid..*/.int sq
12a80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
12a90 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
12aa0 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
12ab0 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
12ac0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
12ad0 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
12ae0 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
12af0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
12b00 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
12b10 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
12b20 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
12b30 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
12b40 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
12b50 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
12b60 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
12b70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
12b80 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
12b90 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg,        /* St
12ba0 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
12bb0 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
12bc0 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c         /* P5 val
12bd0 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e  ue for OP_Column
12be0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
12bf0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
12c00 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
12c10 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
12c20 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  ;..  for(i=0, p=
12c30 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
12c40 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
12c50 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
12c60 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
12c70 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c  eg>0 && p->iTabl
12c80 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e  e==iTable && p->
12c90 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  iColumn==iColumn
12ca0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75   ){.      p->lru
12cb0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
12cc0 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  eCnt++;.      sq
12cd0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
12ce0 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65  nRegister(pParse
12cf0 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20  , p->iReg);.    
12d00 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67    return p->iReg
12d10 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20  ;.    }.  }  .  
12d20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
12d30 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
12d40 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
12d50 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c  e(v, pTab, iTabl
12d60 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
12d70 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20  );.  if( p5 ){. 
12d80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
12d90 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20  angeP5(v, p5);. 
12da0 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73   }else{   .    s
12db0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
12dc0 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61  tore(pParse, iTa
12dd0 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
12de0 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eg);.  }.  retur
12df0 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
12e00 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d   Clear all colum
12e10 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e  n cache entries.
12e20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12e30 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 50  ExprCacheClear(P
12e40 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
12e50 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
12e60 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
12e70 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
12e80 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
12e90 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
12ea0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
12eb0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
12ec0 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
12ed0 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
12ee0 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52   p);.      p->iR
12ef0 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
12f00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  }.}../*.** Recor
12f10 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
12f20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  an affinity chan
12f30 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  ge has occurred 
12f40 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67  on iCount.** reg
12f50 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
12f60 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a  with iStart..*/.
12f70 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
12f80 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
12f90 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
12fa0 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69  e, int iStart, i
12fb0 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71  nt iCount){.  sq
12fc0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
12fd0 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74  move(pParse, iSt
12fe0 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a  art, iCount);.}.
12ff0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
13000 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e  code to move con
13010 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74  tent from regist
13020 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f  ers iFrom...iFro
13030 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72  m+nReg-1.** over
13040 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65   to iTo..iTo+nRe
13050 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f  g-1. Keep the co
13060 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f  lumn cache up-to
13070 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  -date..*/.void s
13080 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
13090 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
130a0 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
130b0 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b   iTo, int nReg){
130c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
130d0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
130e0 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d  .  assert( iFrom
130f0 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46  >=iTo+nReg || iF
13100 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b  rom+nReg<=iTo );
13110 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13120 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
13130 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
13140 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 2d 31 29  om, iTo, nReg-1)
13150 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
13160 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
13170 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
13180 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
13190 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 2d  {.    int x = p-
131a0 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 78  >iReg;.    if( x
131b0 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69 46 72  >=iFrom && x<iFr
131c0 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 20  om+nReg ){.     
131d0 20 70 2d 3e 69 52 65 67 20 2b 3d 20 69 54 6f 2d   p->iReg += iTo-
131e0 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  iFrom;.    }.  }
131f0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
13200 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
13210 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
13220 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f  COVERAGE_TEST)./
13230 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
13240 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72   if any register
13250 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46   in the range iF
13260 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73  rom..iTo (inclus
13270 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20  ive).** is used 
13280 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  as part of the c
13290 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  olumn cache..**.
132a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
132b0 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  is used within a
132c0 73 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74  ssert() and test
132d0 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e  case() macros on
132e0 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e  ly.** and does n
132f0 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e  ot appear in a n
13300 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a  ormal build..*/.
13310 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41  static int usedA
13320 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72  sColumnCache(Par
13330 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
13340 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
13350 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
13360 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
13370 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
13380 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
13390 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
133a0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
133b0 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e  .    int r = p->
133c0 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e  iReg;.    if( r>
133d0 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f  =iFrom && r<=iTo
133e0 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20   ) return 1;    
133f0 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a  /*NO_TEST*/.  }.
13400 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
13410 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
13420 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43  EBUG || SQLITE_C
13430 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a  OVERAGE_TEST */.
13440 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
13450 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
13460 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
13470 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
13480 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
13490 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72   Attempt to stor
134a0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
134b0 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65   register "targe
134c0 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  t"..** Return th
134d0 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
134e0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
134f0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  red..**.** With 
13500 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
13510 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e  ere is no guaran
13520 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73  tee that results
13530 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72   will.** be stor
13540 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54  ed in target.  T
13550 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20  he result might 
13560 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d  be stored in som
13570 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73  e other.** regis
13580 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ter if it is con
13590 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f  venient to do so
135a0 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
135b0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
135c0 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
135d0 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74   code and move t
135e0 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68  he results to th
135f0 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67  e desired.** reg
13600 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
13610 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
13620 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  get(Parse *pPars
13630 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
13640 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
13650 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
13660 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20  >pVdbe;  /* The 
13670 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  VM under constru
13680 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ction */.  int o
13690 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
136a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
136b0 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  de being coded *
136c0 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20  /.  int inReg = 
136d0 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a  target;       /*
136e0 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20   Results stored 
136f0 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65  in register inRe
13700 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  g */.  int regFr
13710 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee1 = 0;        
13720 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
13730 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
13740 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
13750 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
13760 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
13770 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
13780 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
13790 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
137a0 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b   r1, r2, r3, r4;
137b0 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
137c0 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  s register numbe
137d0 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rs */.  sqlite3 
137e0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
137f0 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73  ; /* The databas
13800 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
13810 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
13820 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
13830 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
13840 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
13850 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
13860 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
13870 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d );.    return 
13880 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45  0;.  }..  if( pE
13890 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70  xpr==0 ){.    op
138a0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65   = TK_NULL;.  }e
138b0 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45  lse{.    op = pE
138c0 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73  xpr->op;.  }.  s
138d0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
138e0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
138f0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  UMN: {.      Agg
13900 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
13910 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
13920 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41  ;.      struct A
13930 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
13940 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
13950 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b  ol[pExpr->iAgg];
13960 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
13970 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
13980 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
13990 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30  rt( pCol->iMem>0
139a0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
139b0 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a  g = pCol->iMem;.
139c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
139d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
139e0 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74  AggInfo->useSort
139f0 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ingIdx ){.      
13a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13a10 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
13a20 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74  , pAggInfo->sort
13a30 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20  ingIdxPTab,.    
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a50 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
13a60 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74  iSorterColumn, t
13a70 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
13a80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
13a90 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
13aa0 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
13ab0 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
13ac0 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
13ad0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
13ae0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  : {.      int iT
13af0 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  ab = pExpr->iTab
13b00 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54  le;.      if( iT
13b10 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ab<0 ){.        
13b20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  if( pParse->ckBa
13b30 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  se>0 ){.        
13b40 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
13b50 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
13b60 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69  s or inserting i
13b70 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65  nto partial inde
13b80 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  x */.          i
13b90 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43  nReg = pExpr->iC
13ba0 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e  olumn + pParse->
13bb0 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  ckBase;.        
13bc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13be0 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 66 72    /* Deleting fr
13bf0 6f 6d 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  om a partial ind
13c00 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ex */.          
13c10 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69  iTab = pParse->i
13c20 50 61 72 74 49 64 78 54 61 62 3b 0a 20 20 20 20  PartIdxTab;.    
13c30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13c40 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
13c50 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
13c60 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
13c70 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20  pr->pTab,.      
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
13ca0 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74  iColumn, iTab, t
13cb0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cd0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32        pExpr->op2
13ce0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13cf0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13d00 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
13d10 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
13d20 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
13d30 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13d40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
13d50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13d60 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
13d70 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
13d80 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
13d90 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
13da0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
13db0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
13dc0 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78   codeReal(v, pEx
13dd0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
13de0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13df0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
13e00 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
13e10 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
13e20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
13e30 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
13e40 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
13e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13e60 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
13e70 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74  ring8, 0, target
13e80 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
13e90 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  oken, 0);.      
13ea0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13eb0 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
13ec0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13ed0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
13ee0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
13ef0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13f00 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
13f10 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
13f20 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
13f30 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69  _BLOB: {.      i
13f40 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt n;.      cons
13f50 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
13f60 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20   char *zBlob;.  
13f70 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
13f80 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
13f90 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
13fa0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13fb0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
13fc0 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78  n[0]=='x' || pEx
13fd0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
13fe0 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73  ='X' );.      as
13ff0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
14000 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29  Token[1]=='\'' )
14010 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78  ;.      z = &pEx
14020 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b  pr->u.zToken[2];
14030 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
14040 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20  e3Strlen30(z) - 
14050 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
14060 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20   z[n]=='\'' );. 
14070 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c       zBlob = sql
14080 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71  ite3HexToBlob(sq
14090 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
140a0 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  z, n);.      sql
140b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
140c0 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20  , OP_Blob, n/2, 
140d0 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62  target, 0, zBlob
140e0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
140f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14100 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
14110 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
14120 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
14130 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14140 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
14150 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
14160 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
14170 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20  oken!=0 );.     
14180 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
14190 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29  u.zToken[0]!=0 )
141a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
141b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
141c0 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
141d0 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  >iColumn, target
141e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
141f0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21  pr->u.zToken[1]!
14200 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
14210 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
14220 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20  Token[0]=='?' . 
14230 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
14240 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  trcmp(pExpr->u.z
14250 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61  Token, pParse->a
14260 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
14270 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20  umn-1])==0 );.  
14280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14290 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
142a0 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70   pParse->azVar[p
142b0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d  Expr->iColumn-1]
142c0 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
142d0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
142e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
142f0 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
14300 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70  .      inReg = p
14310 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
14320 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14330 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a  .    case TK_AS:
14340 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
14350 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14360 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
14370 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
14380 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
14390 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
143a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
143b0 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
143c0 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
143d0 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
143e0 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
143f0 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
14400 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c  /.      int aff,
14410 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e   to_op;.      in
14420 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
14430 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
14440 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
14450 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14460 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
14470 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
14480 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
14490 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c  .      aff = sql
144a0 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
144b0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
144c0 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d  );.      to_op =
144d0 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46   aff - SQLITE_AF
144e0 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65  F_TEXT + OP_ToTe
144f0 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
14500 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65  ( to_op==OP_ToTe
14510 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  xt    || aff!=SQ
14520 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
14530 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14540 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c  ( to_op==OP_ToBl
14550 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  ob    || aff!=SQ
14560 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20  LITE_AFF_NONE   
14570 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14580 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75  ( to_op==OP_ToNu
14590 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51  meric || aff!=SQ
145a0 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
145b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
145c0 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e  ( to_op==OP_ToIn
145d0 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  t     || aff!=SQ
145e0 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
145f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14600 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65  ( to_op==OP_ToRe
14610 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51  al    || aff!=SQ
14620 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20  LITE_AFF_REAL   
14630 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14640 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
14650 54 65 78 74 20 29 3b 0a 20 20 20 20 20 20 74 65  Text );.      te
14660 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
14670 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  P_ToBlob );.    
14680 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
14690 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20  p==OP_ToNumeric 
146a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
146b0 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49  e( to_op==OP_ToI
146c0 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  nt );.      test
146d0 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
146e0 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20  ToReal );.      
146f0 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
14700 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
14710 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14720 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
14730 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
14740 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
14750 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
14760 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14770 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e  Op1(v, to_op, in
14780 52 65 67 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Reg);.      test
14790 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75  case( usedAsColu
147a0 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
147b0 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b  inReg, inReg) );
147c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
147d0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
147e0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e  hange(pParse, in
147f0 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  Reg, 1);.      b
14800 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
14810 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
14820 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
14830 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
14840 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
14850 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
14860 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
14870 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
14880 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
14890 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
148a0 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
148b0 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
148c0 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
148d0 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
148e0 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
148f0 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
14900 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14910 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
14920 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14930 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
14940 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14950 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
14960 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14970 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
14980 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14990 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
149a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
149b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
149c0 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
149d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
149e0 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
149f0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
14a00 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
14a10 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14a20 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
14a30 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
14a40 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
14a50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
14a60 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
14a70 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
14a80 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
14a90 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
14aa0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
14ac0 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c  , r2, inReg, SQL
14ad0 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
14ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
14af0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
14b00 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14b10 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
14b20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14b30 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
14b40 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
14b50 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
14b60 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  se( op==TK_IS );
14b70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14b80 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b   op==TK_ISNOT );
14b90 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
14ba0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14bb0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14bc0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
14bd0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
14be0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14bf0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14c00 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
14c10 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  2);.      op = (
14c20 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
14c30 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
14c40 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
14c50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14c60 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
14c70 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
14c80 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
14c90 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
14ca0 54 4f 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f  TOREP2 | SQLITE_
14cb0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74  NULLEQ);.      t
14cc0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
14cd0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
14ce0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
14cf0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
14d00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14d10 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
14d20 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
14d30 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
14d40 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
14d50 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
14d60 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
14d70 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
14d80 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
14d90 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
14da0 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
14db0 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
14dc0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
14dd0 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54  IFT: .    case T
14de0 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
14df0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44    assert( TK_AND
14e00 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20  ==OP_And );.    
14e10 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d    assert( TK_OR=
14e20 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20  =OP_Or );.      
14e30 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d  assert( TK_PLUS=
14e40 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20  =OP_Add );.     
14e50 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55   assert( TK_MINU
14e60 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29  S==OP_Subtract )
14e70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14e80 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69  TK_REM==OP_Remai
14e90 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73  nder );.      as
14ea0 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d  sert( TK_BITAND=
14eb0 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20  =OP_BitAnd );.  
14ec0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
14ed0 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29  ITOR==OP_BitOr )
14ee0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14ef0 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76  TK_SLASH==OP_Div
14f00 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ide );.      ass
14f10 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d  ert( TK_LSHIFT==
14f20 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a  OP_ShiftLeft );.
14f30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14f40 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _RSHIFT==OP_Shif
14f50 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20  tRight );.      
14f60 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41  assert( TK_CONCA
14f70 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a  T==OP_Concat );.
14f80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14f90 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20  op==TK_AND );.  
14fa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14fb0 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20  ==TK_OR );.     
14fc0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14fd0 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20  K_PLUS );.      
14fe0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14ff0 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20  _MINUS );.      
15000 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15010 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 74 65  _REM );.      te
15020 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
15030 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74  ITAND );.      t
15040 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15050 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 74  BITOR );.      t
15060 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15070 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 74  SLASH );.      t
15080 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15090 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  LSHIFT );.      
150a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
150b0 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _RSHIFT );.     
150c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
150d0 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20  K_CONCAT );.    
150e0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
150f0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
15100 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
15110 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
15120 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
15130 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15140 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
15150 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
15160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15170 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32  AddOp3(v, op, r2
15180 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
15190 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
151a0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
151b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
151c0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
151d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
151e0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
151f0 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  US: {.      Expr
15200 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
15210 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73  >pLeft;.      as
15220 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
15230 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
15240 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
15250 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e  {.        codeIn
15260 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c  teger(pParse, pL
15270 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  eft, 1, target);
15280 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15290 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
152a0 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  INT.      }else 
152b0 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
152c0 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  K_FLOAT ){.     
152d0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
152e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
152f0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
15300 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52  );.        codeR
15310 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e  eal(v, pLeft->u.
15320 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65  zToken, 1, targe
15330 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  t);.#endif.     
15340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15350 72 65 67 46 72 65 65 31 20 3d 20 72 31 20 3d 20  regFree1 = r1 = 
15360 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
15370 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
15380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15390 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
153a0 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20 20  er, 0, r1);.    
153b0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
153c0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
153d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
153e0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
153f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15400 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
15410 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c  ubtract, r2, r1,
15420 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15430 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
15440 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
15450 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
15460 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62   target;.      b
15470 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15480 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
15490 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
154a0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
154b0 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
154c0 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61  itNot );.      a
154d0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f  ssert( TK_NOT==O
154e0 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74  P_Not );.      t
154f0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15500 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  BITNOT );.      
15510 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15520 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  _NOT );.      r1
15530 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15540 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
15550 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
15560 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
15570 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
15580 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e  1==0 );.      in
15590 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
155a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
155b0 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
155c0 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62   inReg);.      b
155d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
155e0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
155f0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
15600 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
15610 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73   addr;.      ass
15620 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
15630 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
15640 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
15650 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
15660 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  l );.      testc
15670 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
15680 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
15690 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
156a0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71  NULL );.      sq
156b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
156c0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
156d0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
156e0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
156f0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
15700 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
15710 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
15720 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
15730 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
15740 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15750 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c  dbeAddOp1(v, op,
15760 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
15770 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15780 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67   OP_AddImm, targ
15790 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73  et, -1);.      s
157a0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
157b0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
157c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
157d0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
157e0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
157f0 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f    AggInfo *pInfo
15800 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
15810 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
15820 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
15830 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
15840 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
15850 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
15860 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15870 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15880 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
15890 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70  regate: %s()", p
158a0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
158b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
158c0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49        inReg = pI
158d0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72  nfo->aFunc[pExpr
158e0 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20  ->iAgg].iMem;.  
158f0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
15900 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
15910 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a  e TK_CONST_FUNC:
15920 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
15930 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
15940 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20  xprList *pFarg; 
15950 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
15960 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
15970 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
15980 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20   nFarg;         
15990 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
159a0 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
159b0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  nts */.      Fun
159c0 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
159d0 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
159e0 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ion definition o
159f0 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 69  bject */.      i
15a00 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20  nt nId;         
15a10 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
15a20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
15a30 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
15a40 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
15a50 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a  r *zId;       /*
15a60 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
15a70 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  me */.      int 
15a80 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20  constMask = 0;  
15a90 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75     /* Mask of fu
15aa0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
15ab0 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61   that are consta
15ac0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nt */.      int 
15ad0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
15ae0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
15af0 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65  er */.      u8 e
15b00 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20  nc = ENC(db);   
15b10 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
15b20 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20  ncoding used by 
15b30 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
15b40 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
15b50 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a  pColl = 0;    /*
15b60 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   A collating seq
15b70 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20  uence */..      
15b80 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
15b90 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
15ba0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
15bb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15bc0 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55   op==TK_CONST_FU
15bd0 4e 43 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  NC );.      test
15be0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e  case( op==TK_FUN
15bf0 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 69  CTION );.      i
15c00 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f  f( ExprHasAnyPro
15c10 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
15c20 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
15c30 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
15c40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15c50 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
15c60 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
15c70 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72      }.      nFar
15c80 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72  g = pFarg ? pFar
15c90 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  g->nExpr : 0;.  
15ca0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
15cb0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
15cc0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
15cd0 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
15ce0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
15cf0 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c  .      nId = sql
15d00 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64  ite3Strlen30(zId
15d10 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  );.      pDef = 
15d20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
15d30 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64  ion(db, zId, nId
15d40 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
15d50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  ;.      if( pDef
15d60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
15d70 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15d80 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
15d90 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29  function: %.*s()
15da0 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20  ", nId, zId);.  
15db0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15dc0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
15dd0 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20  ttempt a direct 
15de0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
15df0 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43  f the built-in C
15e00 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20  OALESCE() and.  
15e10 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20      ** IFNULL() 
15e20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  functions.  This
15e30 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73   avoids unnecess
15e40 61 72 79 20 65 76 61 6c 61 74 69 6f 6e 20 6f 66  ary evalation of
15e50 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  .      ** argume
15e60 6e 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72  nts past the fir
15e70 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75  st non-NULL argu
15e80 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
15e90 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
15ea0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
15eb0 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20  NC_COALESCE ){. 
15ec0 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f         int endCo
15ed0 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33  alesce = sqlite3
15ee0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
15ef0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15f00 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20  ( nFarg>=2 );.  
15f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15f20 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
15f30 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
15f40 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15f50 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61    for(i=1; i<nFa
15f60 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
15f70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15f80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
15f90 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64  ull, target, end
15fa0 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
15fb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15fc0 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
15fd0 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a  se, target, 1);.
15fe0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15ff0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
16000 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
16010 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16020 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  e(pParse, pFarg-
16030 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[i].pExpr, tar
16040 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  get);.          
16050 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16060 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
16070 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16080 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
16090 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
160a0 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
160b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
160c0 7d 0a 0a 0a 20 20 20 20 20 20 69 66 28 20 70 46  }...      if( pF
160d0 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  arg ){.        r
160e0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
160f0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
16100 6e 46 61 72 67 29 3b 0a 0a 20 20 20 20 20 20 20  nFarg);..       
16110 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29   /* For length()
16120 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75   and typeof() fu
16130 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63  nctions with a c
16140 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a  olumn argument,.
16150 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
16160 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20  he P5 parameter 
16170 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e  to the OP_Column
16180 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41   opcode to OPFLA
16190 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20  G_LENGTHARG.    
161a0 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47      ** or OPFLAG
161b0 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65  _TYPEOFARG respe
161c0 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69  ctively, to avoi
161d0 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61  d unnecessary da
161e0 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ta.        ** lo
161f0 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  ading..        *
16200 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  /.        if( (p
16210 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 28 53 51  Def->flags & (SQ
16220 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
16230 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50  |SQLITE_FUNC_TYP
16240 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  EOF))!=0 ){.    
16250 20 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b        u8 exprOp;
16260 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
16270 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20  t( nFarg==1 );. 
16280 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16290 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
162a0 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
162b0 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72     exprOp = pFar
162c0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  g->a[0].pExpr->o
162d0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  p;.          if(
162e0 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55   exprOp==TK_COLU
162f0 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b  MN || exprOp==TK
16300 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  _AGG_COLUMN ){. 
16310 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
16320 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  t( SQLITE_FUNC_L
16330 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45  ENGTH==OPFLAG_LE
16340 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
16350 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
16360 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f  QLITE_FUNC_TYPEO
16370 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  F==OPFLAG_TYPEOF
16380 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
16390 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
163a0 66 2d 3e 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  f->flags==SQLITE
163b0 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 20 29 3b 0a  _FUNC_LENGTH );.
163c0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72              pFar
163d0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  g->a[0].pExpr->o
163e0 70 32 20 3d 20 70 44 65 66 2d 3e 66 6c 61 67 73  p2 = pDef->flags
163f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16400 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
16410 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
16420 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20 20  ePush(pParse);  
16430 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
16440 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
16450 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16460 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
16470 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20  rse, pFarg, r1, 
16480 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
16490 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
164a0 70 50 61 72 73 65 2c 20 31 29 3b 20 20 20 2f 2a  pParse, 1);   /*
164b0 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
164c0 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65  34be */.      }e
164d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
164e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
164f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16500 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
16510 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
16520 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
16530 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
16540 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
16550 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
16560 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
16570 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
16580 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
16590 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
165a0 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
165b0 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
165c0 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
165d0 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
165e0 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
165f0 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
16600 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
16610 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
16620 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
16630 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
16640 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
16650 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
16660 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
16670 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
16680 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
16690 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
166a0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
166b0 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
166c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
166d0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
166e0 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
166f0 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
16700 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
16710 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
16720 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
16730 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
16740 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
16750 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
16760 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
16770 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
16780 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
16790 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
167a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
167b0 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70  ( nFarg>=2 && (p
167c0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
167d0 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
167e0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
167f0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
16800 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
16810 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
16820 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
16830 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
16840 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  Farg>0 ){.      
16850 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
16860 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
16870 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
16880 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30  Farg, pFarg->a[0
16890 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
168a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  }.#endif.      f
168b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b  or(i=0; i<nFarg;
168c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
168d0 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74  f( i<32 && sqlit
168e0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
168f0 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78  (pFarg->a[i].pEx
16900 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
16910 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31   constMask |= (1
16920 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  <<i);.        }.
16930 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
16940 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
16950 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29  E_FUNC_NEEDCOLL)
16960 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  !=0 && !pColl ){
16970 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
16980 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16990 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46  llSeq(pParse, pF
169a0 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
169b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
169c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
169d0 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
169e0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
169f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
16a00 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
16a10 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20   db->pDfltColl; 
16a20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16a30 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16a40 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
16a50 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
16a60 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
16a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
16a80 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
16a90 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63  , OP_Function, c
16aa0 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61  onstMask, r1, ta
16ab0 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
16ad0 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55  har*)pDef, P4_FU
16ae0 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71  NCDEF);.      sq
16af0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16b00 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b  5(v, (u8)nFarg);
16b10 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
16b20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16b30 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
16b40 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
16b50 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  nFarg);.      }.
16b60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16b70 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
16b80 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
16b90 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
16ba0 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
16bb0 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
16bc0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
16bd0 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
16be0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
16bf0 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
16c00 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
16c10 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
16c20 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
16c30 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
16c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16c50 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
16c60 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
16c70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16c80 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
16c90 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
16ca0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16cb0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
16cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16cd0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
16ce0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16cf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16d00 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
16d10 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
16d20 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
16d30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16d40 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
16d50 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
16d60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16d70 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
16d80 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
16d90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16da0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
16db0 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  mm, target, 0);.
16dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16dd0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
16de0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
16df0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16e00 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16e10 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
16e20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  */...    /*.    
16e30 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
16e40 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20  y AND z.    **. 
16e50 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71     ** This is eq
16e60 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20  uivalent to.    
16e70 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d  **.    **    x>=
16e80 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a  y AND x<=z.    *
16e90 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74  *.    ** X is st
16ea0 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
16eb0 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
16ec0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
16ed0 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
16ee0 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69  Expr..    ** Z i
16ef0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
16f00 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
16f10 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Expr..    */.   
16f20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
16f30 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
16f40 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
16f50 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75  Left;.      stru
16f60 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
16f70 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72   *pLItem = pExpr
16f80 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20  ->x.pList->a;.  
16f90 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
16fa0 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
16fb0 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  ;..      r1 = sq
16fc0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
16fd0 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  p(pParse, pLeft,
16fe0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
16ff0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
17000 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17010 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67  se, pRight, &reg
17020 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65  Free2);.      te
17030 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
17040 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
17050 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
17060 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d  =0 );.      r3 =
17070 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17080 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17090 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65    r4 = sqlite3Ge
170a0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
170b0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
170c0 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
170d0 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65  t, pRight, OP_Ge
170e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
170f0 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20      r1, r2, r3, 
17100 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
17110 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b  .      pLItem++;
17120 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
17130 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
17140 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
17150 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17160 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
17170 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
17180 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17190 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65  rse, pRight, &re
171a0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74  gFree2);.      t
171b0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
171c0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  2==0 );.      co
171d0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
171e0 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
171f0 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20   OP_Le, r1, r2, 
17200 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r4, SQLITE_STORE
17210 50 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  P2);.      sqlit
17220 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17230 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20  OP_And, r3, r4, 
17240 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
17250 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17260 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
17270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
17280 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17290 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20  arse, r4);.     
172a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
172b0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54    case TK_COLLAT
172c0 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  E: .    case TK_
172d0 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  UPLUS: {.      i
172e0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
172f0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
17300 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
17310 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
17320 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
17330 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
17340 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
17350 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
17360 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
17370 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
17380 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
17390 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
173a0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
173b0 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
173c0 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
173d0 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
173e0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
173f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
17400 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
17410 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
17420 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
17430 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
17440 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
17450 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
17460 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
17470 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
17480 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
17490 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
174a0 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
174b0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
174c0 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
174d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
174e0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
174f0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
17500 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
17510 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
17520 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
17530 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
17540 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
17550 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
17560 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
17570 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
17580 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
17590 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
175a0 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
175b0 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
175c0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
175d0 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
175e0 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
175f0 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
17600 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
17610 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
17620 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
17630 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
17640 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
17650 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
17660 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
17670 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
17680 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
17690 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
176a0 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
176b0 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
176c0 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
176d0 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
176e0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
176f0 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
17700 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
17710 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
17720 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
17730 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
17740 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
17750 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
17760 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
17770 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
17780 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
17790 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
177a0 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
177b0 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
177c0 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
177d0 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
177e0 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
177f0 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
17800 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
17810 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
17820 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
17830 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
17840 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
17850 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
17860 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
17870 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
17880 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20  .      int p1 = 
17890 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20  pExpr->iTable * 
178a0 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b  (pTab->nCol+1) +
178b0 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c   1 + pExpr->iCol
178c0 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  umn;..      asse
178d0 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt( pExpr->iTabl
178e0 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  e==0 || pExpr->i
178f0 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
17900 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
17910 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20  >iColumn>=-1 && 
17920 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
17930 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
17940 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
17950 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70  >iPKey<0 || pExp
17960 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62  r->iColumn!=pTab
17970 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20  ->iPKey );.     
17980 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26   assert( p1>=0 &
17990 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c  & p1<(pTab->nCol
179a0 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20  *2+2) );..      
179b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
179c0 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70  2(v, OP_Param, p
179d0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
179e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
179f0 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22  , "%s.%s -> $%d"
17a00 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
17a10 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22  ->iTable ? "new"
17a20 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20   : "old"),.     
17a30 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75     (pExpr->iColu
17a40 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn<0 ? "rowid" :
17a50 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43   pExpr->pTab->aC
17a60 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
17a70 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  n].zName),.     
17a80 20 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20     target.      
17a90 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
17aa0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
17ab0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a  G_POINT.      /*
17ac0 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68   If the column h
17ad0 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
17ae0 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74  , it may current
17af0 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ly be stored as 
17b00 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  an.      ** inte
17b10 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c  ger. Use OP_Real
17b20 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65  Affinity to make
17b30 20 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c   sure it is real
17b40 6c 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20  ly real.  */.   
17b50 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
17b60 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20  olumn>=0 .      
17b70 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   && pTab->aCol[p
17b80 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61  Expr->iColumn].a
17b90 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
17ba0 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29  AFF_REAL.      )
17bb0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17bc0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17bd0 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
17be0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
17bf0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
17c00 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  eak;.    }...   
17c10 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
17c20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
17c30 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
17c40 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
17c50 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
17c60 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
17c70 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
17c80 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
17c90 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
17ca0 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
17cb0 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
17cc0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
17cd0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
17ce0 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
17cf0 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
17d00 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
17d10 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
17d20 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
17d30 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
17d40 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
17d50 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
17d60 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
17d70 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
17d80 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
17d90 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
17da0 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
17db0 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
17dc0 2a 20 59 20 69 73 20 69 6e 20 70 45 78 70 72 2d  * Y is in pExpr-
17dd0 3e 70 52 69 67 68 74 2e 20 20 54 68 65 20 59 20  >pRight.  The Y 
17de0 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c  is also optional
17df0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
17e00 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c  o.    ** ELSE cl
17e10 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ause and no othe
17e20 72 20 74 65 72 6d 20 6d 61 74 63 68 65 73 2c 20  r term matches, 
17e30 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
17e40 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78  of the.    ** ex
17e50 70 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e  prssion is NULL.
17e60 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e  .    ** Ei is in
17e70 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
17e80 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20  [i*2] and Ri is 
17e90 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
17ea0 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20  i*2+1]..    **. 
17eb0 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74     ** The result
17ec0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
17ed0 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72  on is the Ri for
17ee0 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
17ef0 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f  ing Ei,.    ** o
17f00 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
17f10 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68   matching Ei, th
17f20 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f  e ELSE term Y, o
17f30 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  r if there is.  
17f40 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72    ** no ELSE ter
17f50 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  m, NULL..    */.
17f60 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
17f70 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45  ert( op==TK_CASE
17f80 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
17f90 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17fb0 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
17fc0 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
17fd0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
17fe0 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
18000 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
18010 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
18020 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
18030 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
18040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
18050 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
18060 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
18070 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18090 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
180a0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
180b0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
180c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
180d0 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
180e0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
180f0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
18100 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
18110 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
18120 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
18130 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18150 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
18160 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
18170 78 70 72 20 63 61 63 68 65 58 3b 20 20 20 20 20  xpr cacheX;     
18180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18190 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70 72 65   /* Cached expre
181a0 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20  ssion X */.     
181b0 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181d0 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72     /* The X expr
181e0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
181f0 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b  Expr *pTest = 0;
18200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18210 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d    /* X==Ei (form
18220 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28   A) or just Ei (
18230 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20  form B) */.     
18240 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69   VVA_ONLY( int i
18250 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61  CacheLevel = pPa
18260 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
18270 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72  ; )..      asser
18280 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
18290 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
182a0 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70  sSelect) && pExp
182b0 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20  r->x.pList );.  
182c0 20 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70      assert((pExp
182d0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
182e0 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20  r % 2) == 0);.  
182f0 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
18300 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
18310 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
18320 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
18330 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
18340 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
18350 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
18360 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
18370 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
18380 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18390 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
183a0 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
183b0 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
183c0 20 20 20 20 20 20 63 61 63 68 65 58 20 3d 20 2a        cacheX = *
183d0 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  pX;.        test
183e0 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
183f0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
18400 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
18410 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
18420 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68   );.        cach
18430 65 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  eX.iTable = sqli
18440 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
18450 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67  pParse, pX, &reg
18460 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
18470 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
18480 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
18490 20 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f   cacheX.op = TK_
184a0 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20  REGISTER;.      
184b0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d    opCompare.op =
184c0 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20   TK_EQ;.        
184d0 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20  opCompare.pLeft 
184e0 3d 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20  = &cacheX;.     
184f0 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
18500 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f  mpare;.        /
18510 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35  * Ticket b351d95
18520 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61  f9cd5ef17e9d9dba
18530 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30  e18f5ca861119000
18540 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  1:.        ** Th
18550 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72  e value in regFr
18560 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43  ee1 might get SC
18570 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20  opy-ed into the 
18580 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20  file result..   
18590 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20       ** So make 
185a0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
185b0 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20  gFree1 register 
185c0 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f  is not reused fo
185d0 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  r other.        
185e0 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20  ** purposes and 
185f0 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69  possibly overwri
18600 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20  tten.  */.      
18610 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a    regFree1 = 0;.
18620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
18630 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
18640 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20  i=i+2){.        
18650 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
18660 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
18670 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a        if( pX ){.
18680 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18690 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20  ( pTest!=0 );.  
186a0 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
186b0 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74  e.pRight = aList
186c0 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
186d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
186e0 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
186f0 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
18700 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
18710 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d        nextCase =
18720 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18730 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
18740 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73    testcase( pTes
18750 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
18760 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
18770 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
18780 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65  Parse, pTest, ne
18790 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a  xtCase, SQLITE_J
187a0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
187b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
187c0 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
187d0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
187e0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  N );.        tes
187f0 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d  tcase( aListelem
18800 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  [i+1].pExpr->op=
18810 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
18820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18830 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
18840 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
18850 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
18860 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18870 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
18880 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c  oto, 0, endLabel
18890 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
188a0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
188b0 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Parse, 1);.     
188c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
188d0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65  solveLabel(v, ne
188e0 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d  xtCase);.      }
188f0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
18900 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
18910 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18920 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
18930 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18940 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
18950 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
18960 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
18970 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
18980 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
18990 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
189a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
189b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
189c0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
189d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
189e0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
189f0 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
18a00 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20  e->nErr>0 .     
18a10 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
18a20 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43  >iCacheLevel==iC
18a30 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20  acheLevel );.   
18a40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
18a50 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
18a60 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62  dLabel);.      b
18a70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
18a80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18a90 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65  TRIGGER.    case
18aa0 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
18ab0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
18ac0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52  ->affinity==OE_R
18ad0 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20  ollback .       
18ae0 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
18af0 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
18b00 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
18b10 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
18b20 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20  OE_Fail.        
18b30 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
18b40 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
18b50 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
18b60 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72  if( !pParse->pTr
18b70 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20  iggerTab ){.    
18b80 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18b90 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
18bc0 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
18bd0 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
18be0 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
18bf0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
18c00 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
18c10 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
18c20 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
18c30 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
18c40 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
18c50 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
18c60 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
18c70 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
18c80 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69  alue) );.      i
18c90 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
18ca0 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b  ty==OE_Ignore ){
18cb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18cc0 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
18cd0 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61          v, OP_Ha
18ce0 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f  lt, SQLITE_OK, O
18cf0 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78  E_Ignore, 0, pEx
18d00 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b  pr->u.zToken,0);
18d10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c        sqlite3Hal
18d30 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
18d40 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  se, SQLITE_CONST
18d50 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20  RAINT_TRIGGER,. 
18d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
18d80 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45  pr->affinity, pE
18d90 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
18da0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
18db0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
18dc0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
18dd0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18de0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
18df0 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
18e00 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18e10 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
18e20 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
18e30 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
18e40 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
18e50 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
18e60 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
18e70 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61  esults.** into a
18e80 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75   register.  Retu
18e90 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
18ea0 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65  number where the
18eb0 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20   results.** are 
18ec0 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  stored..**.** If
18ed0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
18ee0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
18ef0 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  ister that can b
18f00 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a  e deallocated,.*
18f10 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73  * then write its
18f20 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52   number into *pR
18f30 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  eg.  If the resu
18f40 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  lt register is n
18f50 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  ot.** a temporar
18f60 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  y, then set *pRe
18f70 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e  g to zero..*/.in
18f80 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
18f90 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61  eTemp(Parse *pPa
18fa0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
18fb0 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20  , int *pReg){.  
18fc0 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
18fd0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
18fe0 65 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20 73  e);.  int r2 = s
18ff0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
19000 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
19010 70 72 2c 20 72 31 29 3b 0a 20 20 69 66 28 20 72  pr, r1);.  if( r
19020 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70 52  2==r1 ){.    *pR
19030 65 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65  eg = r1;.  }else
19040 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
19050 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
19060 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70 52  se, r1);.    *pR
19070 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  eg = 0;.  }.  re
19080 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn r2;.}../*.*
19090 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
190a0 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
190b0 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
190c0 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
190d0 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
190e0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
190f0 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
19100 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
19110 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
19120 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f  ister target..*/
19130 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
19140 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72  Code(Parse *pPar
19150 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
19160 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
19170 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73  int inReg;..  as
19180 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
19190 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
191a0 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
191b0 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e  pExpr && pExpr->
191c0 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
191d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
191e0 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
191f0 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c  >pVdbe, OP_Copy,
19200 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
19210 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  target);.  }else
19220 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71  {.    inReg = sq
19230 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
19240 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
19250 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
19260 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
19270 70 56 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d  pVdbe || pParse-
19280 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
19290 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52  d );.    if( inR
192a0 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50  eg!=target && pP
192b0 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
192c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
192d0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
192e0 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
192f0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
19300 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
19310 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a  rn target;.}../*
19320 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19330 65 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20  e that evalutes 
19340 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
19350 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
19360 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
19370 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
19380 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
19390 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
193a0 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
193b0 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
193c0 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
193d0 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
193e0 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
193f0 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
19400 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
19410 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
19420 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
19430 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
19440 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
19450 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
19460 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
19470 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
19480 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
19490 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
194a0 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
194b0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
194c0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
194d0 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   reused..*/.int 
194e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
194f0 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
19500 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
19510 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
19520 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
19530 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
19540 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67  t inReg;.  inReg
19550 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
19560 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
19570 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73  , target);.  ass
19580 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
19590 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
195a0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
195b0 20 74 65 72 6d 73 20 74 6f 20 49 4e 53 45 52 54   terms to INSERT
195c0 20 6f 72 20 55 50 44 41 54 45 2e 20 20 41 6e 64   or UPDATE.  And
195d0 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f   the only.  ** o
195e0 74 68 65 72 20 70 6c 61 63 65 20 77 68 65 72 65  ther place where
195f0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e   expressions can
19600 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
19610 74 6f 20 54 4b 5f 52 45 47 49 53 54 45 52 20 69  to TK_REGISTER i
19620 73 0a 20 20 2a 2a 20 69 6e 20 57 48 45 52 45 20  s.  ** in WHERE 
19630 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
19640 67 2e 20 20 53 6f 20 61 73 20 63 75 72 72 65 6e  g.  So as curren
19650 74 6c 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2c  tly implemented,
19660 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6e   there is.  ** n
19670 6f 20 77 61 79 20 66 6f 72 20 61 20 54 4b 5f 52  o way for a TK_R
19680 45 47 49 53 54 45 52 20 74 6f 20 65 78 69 73 74  EGISTER to exist
19690 20 68 65 72 65 2e 20 20 42 75 74 20 69 74 20 73   here.  But it s
196a0 65 65 6d 73 20 70 72 75 64 65 6e 74 20 74 6f 0a  eems prudent to.
196b0 20 20 2a 2a 20 6b 65 65 70 20 74 68 65 20 41 4c    ** keep the AL
196c0 57 41 59 53 28 29 20 69 6e 20 63 61 73 65 20 74  WAYS() in case t
196d0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
196e0 6f 76 65 20 63 68 61 6e 67 65 20 77 69 74 68 20  ove change with 
196f0 66 75 74 75 72 65 0a 20 20 2a 2a 20 6d 6f 64 69  future.  ** modi
19700 66 69 63 61 74 69 6f 6e 73 20 6f 72 20 65 6e 68  fications or enh
19710 61 6e 63 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  ancements. */.  
19720 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
19730 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
19740 52 29 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20  R) ){  .    int 
19750 69 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d  iMem;.    iMem =
19760 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
19770 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19780 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
19790 79 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b  y, inReg, iMem);
197a0 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
197b0 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70  le = iMem;.    p
197c0 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70  Expr->op2 = pExp
197d0 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72  r->op;.    pExpr
197e0 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
197f0 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
19800 20 69 6e 52 65 67 3b 0a 7d 0a 0a 23 69 66 20 64   inReg;.}..#if d
19810 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
19820 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
19830 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  N)./*.** Generat
19840 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
19850 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  le explanation o
19860 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
19870 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
19880 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
19890 28 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78 70  (Vdbe *pOut, Exp
198a0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
198b0 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
198c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
198d0 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
198e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
198f0 20 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20   *zBinOp = 0;   
19900 2f 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61 74  /* Binary operat
19910 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
19920 61 72 20 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20  ar *zUniOp = 0; 
19930 20 20 2f 2a 20 55 6e 61 72 79 20 6f 70 65 72 61    /* Unary opera
19940 74 6f 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  tor */.  if( pEx
19950 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
19960 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
19970 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
19980 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
19990 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
199a0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
199b0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  MN: {.      sqli
199c0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
199d0 28 70 4f 75 74 2c 20 22 41 47 47 7b 25 64 3a 25  (pOut, "AGG{%d:%
199e0 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d}",.           
199f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
19a00 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
19a10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19a20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
19a30 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
19a40 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
19a50 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  e<0 ){.        /
19a60 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
19a70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20  ens when coding 
19a80 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74  check constraint
19a90 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  s */.        sql
19aa0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
19ab0 66 28 70 4f 75 74 2c 20 22 43 4f 4c 55 4d 4e 28  f(pOut, "COLUMN(
19ac0 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f  %d)", pExpr->iCo
19ad0 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lumn);.      }el
19ae0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
19af0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19b00 28 70 4f 75 74 2c 20 22 7b 25 64 3a 25 64 7d 22  (pOut, "{%d:%d}"
19b10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19b30 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45  Expr->iTable, pE
19b40 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
19b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
19b60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19b70 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
19b80 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
19b90 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
19ba0 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Value ){.       
19bb0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
19bc0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 64 22  rintf(pOut, "%d"
19bd0 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75  , pExpr->u.iValu
19be0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
19bf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19c00 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
19c10 75 74 2c 20 22 25 73 22 2c 20 70 45 78 70 72 2d  ut, "%s", pExpr-
19c20 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
19c30 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
19c40 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
19c50 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
19c60 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61  ING_POINT.    ca
19c70 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
19c80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
19c90 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
19ca0 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %s", pExpr->u.zT
19cb0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
19cc0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
19cd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
19ce0 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ING: {.      sql
19cf0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
19d00 66 28 70 4f 75 74 2c 22 25 51 22 2c 20 70 45 78  f(pOut,"%Q", pEx
19d10 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
19d20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19d30 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
19d40 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
19d50 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
19d60 28 70 4f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20  (pOut,"NULL");. 
19d70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19d80 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19d90 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
19da0 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
19db0 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  LOB: {.      sql
19dc0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
19dd0 66 28 70 4f 75 74 2c 22 25 73 22 2c 20 70 45 78  f(pOut,"%s", pEx
19de0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
19df0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19e00 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
19e10 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
19e20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19e30 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
19e40 2c 22 56 41 52 49 41 42 4c 45 28 25 73 2c 25 64  ,"VARIABLE(%s,%d
19e50 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19e70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
19e80 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
19e90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19ea0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
19eb0 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
19ec0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
19ed0 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 52 45 47  Printf(pOut,"REG
19ee0 49 53 54 45 52 28 25 64 29 22 2c 20 70 45 78 70  ISTER(%d)", pExp
19ef0 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
19f00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19f10 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
19f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19f30 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
19f40 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
19f50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19f60 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19f70 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
19f80 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
19f90 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
19fa0 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
19fb0 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
19fc0 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
19fd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66   const char *zAf
19fe0 66 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20  f = "unk";.     
19ff0 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
1a000 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
1a010 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 29 7b  pr->u.zToken) ){
1a020 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
1a030 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 20 20  LITE_AFF_TEXT:  
1a040 20 20 7a 41 66 66 20 3d 20 22 54 45 58 54 22 3b    zAff = "TEXT";
1a050 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a060 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a070 41 46 46 5f 4e 4f 4e 45 3a 20 20 20 20 7a 41 66  AFF_NONE:    zAf
1a080 66 20 3d 20 22 4e 4f 4e 45 22 3b 20 20 20 20 20  f = "NONE";     
1a090 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
1a0a0 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
1a0b0 55 4d 45 52 49 43 3a 20 7a 41 66 66 20 3d 20 22  UMERIC: zAff = "
1a0c0 4e 55 4d 45 52 49 43 22 3b 20 20 62 72 65 61 6b  NUMERIC";  break
1a0d0 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  ;.        case S
1a0e0 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
1a0f0 52 3a 20 7a 41 66 66 20 3d 20 22 49 4e 54 45 47  R: zAff = "INTEG
1a100 45 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ER";  break;.   
1a110 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1a120 5f 41 46 46 5f 52 45 41 4c 3a 20 20 20 20 7a 41  _AFF_REAL:    zA
1a130 66 66 20 3d 20 22 52 45 41 4c 22 3b 20 20 20 20  ff = "REAL";    
1a140 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1a150 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a160 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a170 20 22 43 41 53 54 2d 25 73 28 22 2c 20 7a 41 66   "CAST-%s(", zAf
1a180 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
1a190 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1a1a0 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1a1b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a1c0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a1d0 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62  t, ")");.      b
1a1e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1a1f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1a200 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
1a210 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a  se TK_LT:      z
1a220 42 69 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20  BinOp = "LT";   
1a230 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a240 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42  e TK_LE:      zB
1a250 69 6e 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20  inOp = "LE";    
1a260 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a270 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69   TK_GT:      zBi
1a280 6e 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20  nOp = "GT";     
1a290 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a2a0 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e  TK_GE:      zBin
1a2b0 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62  Op = "GE";     b
1a2c0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a2d0 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_NE:      zBinO
1a2e0 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72  p = "NE";     br
1a2f0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a300 5f 45 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _EQ:      zBinOp
1a310 20 3d 20 22 45 51 22 3b 20 20 20 20 20 62 72 65   = "EQ";     bre
1a320 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a330 49 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  IS:      zBinOp 
1a340 3d 20 22 49 53 22 3b 20 20 20 20 20 62 72 65 61  = "IS";     brea
1a350 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1a360 53 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d  SNOT:   zBinOp =
1a370 20 22 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b   "ISNOT";  break
1a380 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  ;.    case TK_AN
1a390 44 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  D:     zBinOp = 
1a3a0 22 41 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b  "AND";    break;
1a3b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1a3c0 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1a3d0 4f 52 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  OR";     break;.
1a3e0 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
1a3f0 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41  :    zBinOp = "A
1a400 44 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  DD";    break;. 
1a410 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
1a420 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55      zBinOp = "MU
1a430 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  L";    break;.  
1a440 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
1a450 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42     zBinOp = "SUB
1a460 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1a470 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20   case TK_REM:   
1a480 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22    zBinOp = "REM"
1a490 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1a4a0 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20  case TK_BITAND: 
1a4b0 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e   zBinOp = "BITAN
1a4c0 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  D"; break;.    c
1a4d0 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20  ase TK_BITOR:   
1a4e0 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22  zBinOp = "BITOR"
1a4f0 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
1a500 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a  se TK_SLASH:   z
1a510 42 69 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20  BinOp = "DIV";  
1a520 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a530 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42  e TK_LSHIFT:  zB
1a540 69 6e 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b  inOp = "LSHIFT";
1a550 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a560 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69   TK_RSHIFT:  zBi
1a570 6e 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20  nOp = "RSHIFT"; 
1a580 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a590 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e  TK_CONCAT:  zBin
1a5a0 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62  Op = "CONCAT"; b
1a5b0 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
1a5c0 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69  TK_UMINUS:  zUni
1a5d0 4f 70 20 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62  Op = "UMINUS"; b
1a5e0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a5f0 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f  K_UPLUS:   zUniO
1a600 70 20 3d 20 22 55 50 4c 55 53 22 3b 20 20 62 72  p = "UPLUS";  br
1a610 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a620 5f 42 49 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70  _BITNOT:  zUniOp
1a630 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 62 72 65   = "BITNOT"; bre
1a640 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a650 4e 4f 54 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20  NOT:     zUniOp 
1a660 3d 20 22 4e 4f 54 22 3b 20 20 20 20 62 72 65 61  = "NOT";    brea
1a670 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1a680 53 4e 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d  SNULL:  zUniOp =
1a690 20 22 49 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b   "ISNULL"; break
1a6a0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
1a6b0 54 4e 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20  TNULL: zUniOp = 
1a6c0 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b  "NOTNULL"; break
1a6d0 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ;..    case TK_C
1a6e0 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  OLLATE: {.      
1a6f0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1a700 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
1a710 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
1a720 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1a730 74 66 28 70 4f 75 74 2c 22 2e 43 4f 4c 4c 41 54  tf(pOut,".COLLAT
1a740 45 28 25 73 29 22 2c 70 45 78 70 72 2d 3e 75 2e  E(%s)",pExpr->u.
1a750 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
1a760 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1a770 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
1a780 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
1a790 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
1a7a0 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
1a7b0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
1a7c0 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
1a7d0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
1a7e0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1a7f0 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  s */.      if( E
1a800 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
1a810 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
1a820 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
1a830 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20    pFarg = 0;.   
1a840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a850 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d    pFarg = pExpr-
1a860 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
1a870 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  }.      if( op==
1a880 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
1a890 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a8a0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1a8b0 70 4f 75 74 2c 20 22 41 47 47 5f 46 55 4e 43 54  pOut, "AGG_FUNCT
1a8c0 49 4f 4e 25 64 3a 25 73 28 22 2c 0a 20 20 20 20  ION%d:%s(",.    
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8e0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1a8f0 6f 70 32 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  op2, pExpr->u.zT
1a900 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
1a910 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1a920 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a930 28 70 4f 75 74 2c 20 22 46 55 4e 43 54 49 4f 4e  (pOut, "FUNCTION
1a940 3a 25 73 28 22 2c 20 70 45 78 70 72 2d 3e 75 2e  :%s(", pExpr->u.
1a950 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
1a960 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
1a970 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1a980 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
1a990 73 74 28 70 4f 75 74 2c 20 70 46 61 72 67 29 3b  st(pOut, pFarg);
1a9a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1a9b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1a9c0 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a  ntf(pOut, ")");.
1a9d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a9e0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1a9f0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1aa00 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
1aa10 54 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  TS: {.      sqli
1aa20 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1aa30 28 70 4f 75 74 2c 20 22 45 58 49 53 54 53 28 22  (pOut, "EXISTS("
1aa40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1aa50 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f  ExplainSelect(pO
1aa60 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  ut, pExpr->x.pSe
1aa70 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  lect);.      sql
1aa80 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1aa90 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 20  f(pOut,")");.   
1aaa0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1aab0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
1aac0 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CT: {.      sqli
1aad0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1aae0 28 70 4f 75 74 2c 20 22 28 22 29 3b 0a 20 20 20  (pOut, "(");.   
1aaf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1ab00 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45  nSelect(pOut, pE
1ab10 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
1ab20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ab30 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1ab40 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72  , ")");.      br
1ab50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ab60 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
1ab70 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1ab80 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 49  nPrintf(pOut, "I
1ab90 4e 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  N(");.      sqli
1aba0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1abb0 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Out, pExpr->pLef
1abc0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1abd0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1abe0 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  Out, ",");.     
1abf0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1ac00 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1ac10 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
1ac20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1ac30 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20  ainSelect(pOut, 
1ac40 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1ac50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1ac60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ac70 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
1ac80 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  Out, pExpr->x.pL
1ac90 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
1aca0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1acb0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1acc0 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  )");.      break
1acd0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1ace0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
1acf0 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
1ad00 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
1ad10 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
1ad20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1ad30 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1ad40 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
1ad50 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
1ad60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
1ad70 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1ad80 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
1ad90 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
1ada0 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
1adb0 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
1adc0 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
1add0 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
1ade0 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
1adf0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
1ae00 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
1ae10 45 78 70 72 20 2a 70 58 20 3d 20 70 45 78 70 72  Expr *pX = pExpr
1ae20 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ->pLeft;.      E
1ae30 78 70 72 20 2a 70 59 20 3d 20 70 45 78 70 72 2d  xpr *pY = pExpr-
1ae40 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
1ae50 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72  Expr;.      Expr
1ae60 20 2a 70 5a 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pZ = pExpr->x.
1ae70 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
1ae80 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
1ae90 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1aea0 75 74 2c 20 22 42 45 54 57 45 45 4e 28 22 29 3b  ut, "BETWEEN(");
1aeb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1aec0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1aed0 70 58 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pX);.      sqlit
1aee0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1aef0 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  pOut, ",");.    
1af00 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1af10 45 78 70 72 28 70 4f 75 74 2c 20 70 59 29 3b 0a  Expr(pOut, pY);.
1af20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1af30 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1af40 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c   ",");.      sql
1af50 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1af60 70 4f 75 74 2c 20 70 5a 29 3b 0a 20 20 20 20 20  pOut, pZ);.     
1af70 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1af80 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29  rintf(pOut, ")")
1af90 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1afa0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1afb0 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20  _TRIGGER: {.    
1afc0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f    /* If the opco
1afd0 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52  de is TK_TRIGGER
1afe0 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
1aff0 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72  ssion is a refer
1b000 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ence.      ** to
1b010 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
1b020 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
1b030 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76  pseudo-tables av
1b040 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  ailable to.     
1b050 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67   ** trigger prog
1b060 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61  rams. In this ca
1b070 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69  se Expr.iTable i
1b080 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74  s set to 1 for t
1b090 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  he.      ** new.
1b0a0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
1b0b0 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64  or 0 for the old
1b0c0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  .* pseudo-table.
1b0d0 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20   Expr.iColumn.  
1b0e0 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
1b0f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   the column of t
1b100 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  he pseudo-table 
1b110 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d  to read, or to -
1b120 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  1 to.      ** re
1b130 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  ad the rowid fie
1b140 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ld..      */.   
1b150 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b160 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25  nPrintf(pOut, "%
1b170 73 28 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20  s(%d)", .       
1b180 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1b190 20 3f 20 22 4e 45 57 22 20 3a 20 22 4f 4c 44 22   ? "NEW" : "OLD"
1b1a0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1b1b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b1c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1b1d0 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  K_CASE: {.      
1b1e0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b1f0 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53 45  intf(pOut, "CASE
1b200 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (");.      sqlit
1b210 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1b220 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1b230 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b240 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b250 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
1b260 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1b270 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45 78  prList(pOut, pEx
1b280 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
1b290 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b2a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b2b0 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
1b2c0 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
1b2d0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1b2e0 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 75 6e 6b  ar *zType = "unk
1b2f0 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  ";.      switch(
1b300 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1b310 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
1b320 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20 20   OE_Rollback:   
1b330 7a 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62 61 63  zType = "rollbac
1b340 6b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  k";  break;.    
1b350 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72      case OE_Abor
1b360 74 3a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  t:      zType = 
1b370 22 61 62 6f 72 74 22 3b 20 20 20 20 20 62 72 65  "abort";     bre
1b380 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1b390 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20 20 20   OE_Fail:       
1b3a0 7a 54 79 70 65 20 3d 20 22 66 61 69 6c 22 3b 20  zType = "fail"; 
1b3b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b3c0 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f      case OE_Igno
1b3d0 72 65 3a 20 20 20 20 20 7a 54 79 70 65 20 3d 20  re:     zType = 
1b3e0 22 69 67 6e 6f 72 65 22 3b 20 20 20 20 62 72 65  "ignore";    bre
1b3f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1b400 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b410 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 52 41  Printf(pOut, "RA
1b420 49 53 45 2d 25 73 28 25 73 29 22 2c 20 7a 54 79  ISE-%s(%s)", zTy
1b430 70 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  pe, pExpr->u.zTo
1b440 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
1b450 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1b460 20 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e 4f 70    }.  if( zBinOp
1b470 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1b480 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b490 74 2c 22 25 73 28 22 2c 20 7a 42 69 6e 4f 70 29  t,"%s(", zBinOp)
1b4a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1b4b0 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1b4c0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1b4d0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b4e0 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 2c 22 29  Printf(pOut,",")
1b4f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1b500 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1b510 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1b520 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b530 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22  nPrintf(pOut,")"
1b540 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  );.  }else if( z
1b550 55 6e 69 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c  UniOp ){.    sql
1b560 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1b570 66 28 70 4f 75 74 2c 22 25 73 28 22 2c 20 7a 55  f(pOut,"%s(", zU
1b580 6e 69 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  niOp);.    sqlit
1b590 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1b5a0 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1b5b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1b5c0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1b5d0 2c 22 29 22 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ,")");.  }.}.#en
1b5e0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
1b5f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
1b600 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a 0a 23  E_EXPLAIN) */..#
1b610 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1b620 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1b630 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e  PLAIN)./*.** Gen
1b640 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65  erate a human-re
1b650 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69  adable explanati
1b660 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  on of an express
1b670 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
1b680 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e  d sqlite3Explain
1b690 45 78 70 72 4c 69 73 74 28 56 64 62 65 20 2a 70  ExprList(Vdbe *p
1b6a0 4f 75 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  Out, ExprList *p
1b6b0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1b6c0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c    if( pList==0 |
1b6d0 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  | pList->nExpr==
1b6e0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1b6f0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b700 75 74 2c 20 22 28 65 6d 70 74 79 2d 6c 69 73 74  ut, "(empty-list
1b710 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  )");.    return;
1b720 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69  .  }else if( pLi
1b730 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a  st->nExpr==1 ){.
1b740 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b750 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c 69  inExpr(pOut, pLi
1b760 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
1b770 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1b780 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
1b790 28 70 4f 75 74 29 3b 0a 20 20 20 20 66 6f 72 28  (pOut);.    for(
1b7a0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1b7b0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b7c0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b7d0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 69 74 65  rintf(pOut, "ite
1b7e0 6d 5b 25 64 5d 20 3d 20 22 2c 20 69 29 3b 0a 20  m[%d] = ", i);. 
1b7f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b800 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a 20  ainPush(pOut);. 
1b810 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b820 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c  ainExpr(pOut, pL
1b830 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
1b840 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b850 78 70 6c 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b  xplainPop(pOut);
1b860 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
1b870 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
1b880 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b890 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b8a0 74 2c 20 22 20 41 53 20 25 73 22 2c 20 70 4c 69  t, " AS %s", pLi
1b8b0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
1b8c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b8d0 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62  f( pList->a[i].b
1b8e0 53 70 61 6e 49 73 54 61 62 20 29 7b 0a 20 20 20  SpanIsTab ){.   
1b8f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b900 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1b910 22 20 28 25 73 29 22 2c 20 70 4c 69 73 74 2d 3e  " (%s)", pList->
1b920 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[i].zSpan);.   
1b930 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
1b940 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
1b950 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b960 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 4f 75 74  e3ExplainNL(pOut
1b970 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1b980 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1b990 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20  ainPop(pOut);.  
1b9a0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
1b9b0 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f  LITE_DEBUG */../
1b9c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1b9d0 20 69 66 20 70 45 78 70 72 20 69 73 20 61 6e 20   if pExpr is an 
1b9e0 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
1b9f0 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72  ion that is appr
1ba00 6f 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66  opriate.** for f
1ba10 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20  actoring out of 
1ba20 61 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72  a loop.  Appropr
1ba30 69 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  iate expressions
1ba40 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a   are:.**.**    *
1ba50 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e    Any expression
1ba60 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20   that evaluates 
1ba70 74 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f  to two or more o
1ba80 70 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  pcodes..**.**   
1ba90 20 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67   *  Any OP_Integ
1baa0 65 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f  er, OP_Real, OP_
1bab0 53 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c  String, OP_Blob,
1bac0 20 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20   OP_Null, .**   
1bad0 20 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62      or OP_Variab
1bae0 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
1baf0 20 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63   need to be plac
1bb00 65 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20  ed in a .**     
1bb10 20 20 73 70 65 63 69 66 69 63 20 72 65 67 69 73    specific regis
1bb20 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ter..**.** There
1bb30 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1bb40 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69  factoring out si
1bb50 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e  ngle-instruction
1bb60 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70   constant.** exp
1bb70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65  ressions that ne
1bb80 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20  ed to be placed 
1bb90 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  in a particular 
1bba0 72 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57  register.  .** W
1bbb0 65 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74  e could factor t
1bbc0 68 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65  hem out, but the
1bbd0 6e 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75  n we would end u
1bbe0 70 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f  p adding an.** O
1bbf0 50 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74  P_SCopy instruct
1bc00 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  ion to move the 
1bc10 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63  value into the c
1bc20 6f 72 72 65 63 74 20 72 65 67 69 73 74 65 72 0a  orrect register.
1bc30 2a 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69  ** later.  We mi
1bc40 67 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74  ght as well just
1bc50 20 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   use the origina
1bc60 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e  l instruction an
1bc70 64 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f  d.** avoid the O
1bc80 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74  P_SCopy..*/.stat
1bc90 69 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72  ic int isAppropr
1bca0 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67  iateForFactoring
1bcb0 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
1bcc0 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
1bcd0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
1bce0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1bcf0 30 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73  0;  /* Only cons
1bd00 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  tant expressions
1bd10 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65   are appropriate
1bd20 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a   for factoring *
1bd30 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1bd40 66 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64  flags & EP_Fixed
1bd50 44 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Dest)==0 ){.    
1bd60 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e  return 1;  /* An
1bd70 79 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f  y constant witho
1bd80 75 74 20 61 20 66 69 78 65 64 20 64 65 73 74 69  ut a fixed desti
1bd90 6e 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70  nation is approp
1bda0 72 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77  riate */.  }.  w
1bdb0 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
1bdc0 55 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70  UPLUS ) p = p->p
1bdd0 4c 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20  Left;.  switch( 
1bde0 70 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66  p->op ){.#ifndef
1bdf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
1be00 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
1be10 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64  se TK_BLOB:.#end
1be20 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
1be30 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73  ARIABLE:.    cas
1be40 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
1be50 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
1be60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1be70 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  L:.    case TK_S
1be80 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74  TRING: {.      t
1be90 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
1bea0 54 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20  TK_BLOB );.     
1beb0 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
1bec0 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b  ==TK_VARIABLE );
1bed0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bee0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47   p->op==TK_INTEG
1bef0 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ER );.      test
1bf00 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
1bf10 46 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74  FLOAT );.      t
1bf20 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
1bf30 54 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  TK_NULL );.     
1bf40 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
1bf50 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20  ==TK_STRING );. 
1bf60 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69       /* Single-i
1bf70 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74  nstruction const
1bf80 61 6e 74 73 20 77 69 74 68 20 61 20 66 69 78 65  ants with a fixe
1bf90 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72  d destination ar
1bfa0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  e.      ** bette
1bfb0 72 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20  r done in-line. 
1bfc0 20 49 66 20 77 65 20 66 61 63 74 6f 72 20 74 68   If we factor th
1bfd0 65 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75  em, they will ju
1bfe0 73 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20  st end.      ** 
1bff0 75 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e  up generating an
1c000 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76   OP_SCopy to mov
1c010 65 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74  e the value to t
1c020 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20  he destination. 
1c030 20 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72       ** register
1c040 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
1c050 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 0;.    }.    c
1c060 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
1c070 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
1c080 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
1c090 54 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f  T || p->pLeft->o
1c0a0 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
1c0b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1c0c0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1c0d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c0e0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
1c0f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c100 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
1c110 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70  }../*.** If pExp
1c120 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  r is a constant 
1c130 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1c140 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
1c150 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20  or.** factoring 
1c160 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74  out of a loop, t
1c170 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65  hen evaluate the
1c180 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
1c190 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61  nto a register a
1c1a0 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65  nd convert the e
1c1b0 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61  xpression into a
1c1c0 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20   TK_REGISTER.** 
1c1d0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73  expression..*/.s
1c1e0 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f  tatic int evalCo
1c1f0 6e 73 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a  nstExpr(Walker *
1c200 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
1c210 45 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a  Expr){.  Parse *
1c220 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
1c230 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74  ->pParse;.  swit
1c240 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
1c250 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
1c260 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
1c270 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ISTER: {.      r
1c280 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
1c290 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c2a0 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20  TK_COLLATE: {.  
1c2b0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
1c2c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
1c2d0 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
1c2e0 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
1c2f0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
1c300 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54     case TK_CONST
1c310 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f  _FUNC: {.      /
1c320 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  * The arguments 
1c330 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61  to a function ha
1c340 76 65 20 61 20 66 69 78 65 64 20 64 65 73 74 69  ve a fixed desti
1c350 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a  nation..      **
1c360 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20   Mark them this 
1c370 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e  way to avoid gen
1c380 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20  erated unneeded 
1c390 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a  OP_SCopy.      *
1c3a0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  * instructions. 
1c3b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c3c0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1c3d0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1c3e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c3f0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1c400 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1c410 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
1c420 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1c430 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73      int i = pLis
1c440 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
1c450 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1c460 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1c470 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  pList->a;.      
1c480 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d    for(; i>0; i--
1c490 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1c4a0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
1c4b0 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20 29  (pItem->pExpr) )
1c4c0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66   pItem->pExpr->f
1c4d0 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69 78 65 64  lags |= EP_Fixed
1c4e0 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Dest;.        }.
1c4f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1c500 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1c510 20 69 66 28 20 69 73 41 70 70 72 6f 70 72 69 61   if( isAppropria
1c520 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 70  teForFactoring(p
1c530 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Expr) ){.    int
1c540 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e   r1 = ++pParse->
1c550 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32  nMem;.    int r2
1c560 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1c570 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1c580 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   pExpr, r1);.   
1c590 20 2f 2a 20 49 66 20 72 32 21 3d 72 31 2c 20 69   /* If r2!=r1, i
1c5a0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 67  t means that reg
1c5b0 69 73 74 65 72 20 72 31 20 69 73 20 6e 65 76 65  ister r1 is neve
1c5c0 72 20 75 73 65 64 2e 20 20 54 68 61 74 20 69 73  r used.  That is
1c5d0 20 68 61 72 6d 6c 65 73 73 0a 20 20 20 20 2a 2a   harmless.    **
1c5e0 20 62 75 74 20 73 75 62 6f 70 74 69 6d 61 6c 2c   but suboptimal,
1c5f0 20 73 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6b   so we want to k
1c600 6e 6f 77 20 61 62 6f 75 74 20 74 68 65 20 73 69  now about the si
1c610 74 75 61 74 69 6f 6e 20 74 6f 20 66 69 78 20 69  tuation to fix i
1c620 74 2e 0a 20 20 20 20 2a 2a 20 48 65 6e 63 65 20  t..    ** Hence 
1c630 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
1c640 73 65 72 74 3a 20 2a 2f 0a 20 20 20 20 61 73 73  sert: */.    ass
1c650 65 72 74 28 20 72 32 3d 3d 72 31 20 29 3b 0a 20  ert( r2==r1 );. 
1c660 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20     pExpr->op2 = 
1c670 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70  pExpr->op;.    p
1c680 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  Expr->op = TK_RE
1c690 47 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78 70  GISTER;.    pExp
1c6a0 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a  r->iTable = r2;.
1c6b0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1c6c0 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rune;.  }.  retu
1c6d0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1c6e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61  .}../*.** Preeva
1c6f0 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20 73  luate constant s
1c700 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 69  ubexpressions wi
1c710 74 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20 73  thin pExpr and s
1c720 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
1c730 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 73  lts in registers
1c740 2e 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72 20  .  Modify pExpr 
1c750 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  so that the cons
1c760 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 69 6f  tant subexpresio
1c770 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47  ns.** are TK_REG
1c780 49 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74 68  ISTER opcodes th
1c790 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
1c7a0 70 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c 75  precomputed valu
1c7b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
1c7c0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1c7d0 70 20 69 66 20 74 68 65 20 6a 75 6d 70 20 74 6f  p if the jump to
1c7e0 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68 65 63   the cookie-chec
1c7f0 6b 20 63 6f 64 65 20 68 61 73 0a 2a 2a 20 61 6c  k code has.** al
1c800 72 65 61 64 79 20 6f 63 63 75 72 2e 20 20 53 69  ready occur.  Si
1c810 6e 63 65 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63  nce the cookie-c
1c820 68 65 63 6b 20 6a 75 6d 70 20 69 73 20 67 65 6e  heck jump is gen
1c830 65 72 61 74 65 64 20 70 72 69 6f 72 20 74 6f 0a  erated prior to.
1c840 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 73 65 72  ** any other ser
1c850 69 6f 75 73 20 70 72 6f 63 65 73 73 69 6e 67 2c  ious processing,
1c860 20 74 68 69 73 20 63 68 65 63 6b 20 65 6e 73 75   this check ensu
1c870 72 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  res that there i
1c880 73 20 6e 6f 0a 2a 2a 20 77 61 79 20 74 6f 20 61  s no.** way to a
1c890 63 63 69 64 65 6e 74 6c 79 20 62 79 70 61 73 73  ccidently bypass
1c8a0 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e   the constant in
1c8b0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 73 2e 0a 2a  itializations..*
1c8c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c8d0 65 20 69 73 20 61 6c 73 6f 20 61 20 6e 6f 2d 6f  e is also a no-o
1c8e0 70 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  p if the SQLITE_
1c8f0 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20 6f  FactorOutConst o
1c900 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69  ptimization.** i
1c910 73 20 64 69 73 61 62 6c 65 64 20 76 69 61 20 74  s disabled via t
1c920 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  he sqlite3_test_
1c930 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1c940 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
1c950 54 49 4f 4e 53 29 0a 2a 2a 20 69 6e 74 65 72 66  TIONS).** interf
1c960 61 63 65 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77  ace.  This allow
1c970 73 20 74 65 73 74 20 6c 6f 67 69 63 20 74 6f 20  s test logic to 
1c980 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1c990 73 61 6d 65 20 61 6e 73 77 65 72 20 69 73 0a 2a  same answer is.*
1c9a0 2a 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 20 71  * obtained for q
1c9b0 75 65 72 69 65 73 20 72 65 67 61 72 64 6c 65 73  ueries regardles
1c9c0 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
1c9d0 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  not constants ar
1c9e0 65 0a 2a 2a 20 70 72 65 63 6f 6d 70 75 74 65 64  e.** precomputed
1c9f0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20   into registers 
1ca00 6f 72 20 69 66 20 74 68 65 79 20 61 72 65 20 69  or if they are i
1ca10 6e 73 65 72 74 65 64 20 69 6e 2d 6c 69 6e 65 2e  nserted in-line.
1ca20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ca30 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
1ca40 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
1ca50 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
1ca60 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 66 28   Walker w;.  if(
1ca70 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1ca80 6f 74 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  oto ) return;.  
1ca90 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
1caa0 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d  Disabled(pParse-
1cab0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 46 61 63 74  >db, SQLITE_Fact
1cac0 6f 72 4f 75 74 43 6f 6e 73 74 29 20 29 20 72 65  orOutConst) ) re
1cad0 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
1cae0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
1caf0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
1cb00 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73 74 45  ack = evalConstE
1cb10 78 70 72 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  xpr;.  w.pParse 
1cb20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
1cb30 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
1cb40 70 45 78 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pExpr);.}.../*.*
1cb50 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1cb60 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
1cb70 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
1cb80 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
1cb90 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1cba0 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
1cbb0 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
1cbc0 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
1cbd0 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
1cbe0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1cbf0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
1cc00 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  luated..*/.int s
1cc10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
1cc20 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
1cc30 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
1cc40 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1cc50 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1cc60 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65  List,   /* The e
1cc70 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
1cc80 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1cc90 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20  int target,     
1cca0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
1ccb0 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a  rite results */.
1ccc0 20 20 69 6e 74 20 64 6f 48 61 72 64 43 6f 70 79    int doHardCopy
1ccd0 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61 20 68       /* Make a h
1cce0 61 72 64 20 63 6f 70 79 20 6f 66 20 65 76 65 72  ard copy of ever
1ccf0 79 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  y element */.){.
1cd00 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1cd10 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1cd20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73   int i, n;.  ass
1cd30 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
1cd40 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1cd50 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
1cd60 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
1cd70 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67  0 );  /* Never g
1cd80 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68  ets this far oth
1cd90 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20  erwise */.  n = 
1cda0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
1cdb0 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
1cdc0 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
1cdd0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1cde0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
1cdf0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
1ce00 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c   int inReg = sql
1ce10 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1ce20 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
1ce30 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
1ce40 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
1ce50 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 73 71  et+i ){.      sq
1ce60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ce70 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 64  pParse->pVdbe, d
1ce80 6f 48 61 72 64 43 6f 70 79 20 3f 20 4f 50 5f 43  oHardCopy ? OP_C
1ce90 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 2c 0a  opy : OP_SCopy,.
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ceb0 20 20 20 20 20 20 20 20 69 6e 52 65 67 2c 20 74          inReg, t
1cec0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 0a  arget+i);.    }.
1ced0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
1cee0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1cef0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54  e code for a BET
1cf00 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  WEEN operator..*
1cf10 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45  *.**    x BETWEE
1cf20 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20  N y AND z.**.** 
1cf30 54 68 65 20 61 62 6f 76 65 20 69 73 20 65 71 75  The above is equ
1cf40 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a  ivalent to .**.*
1cf50 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
1cf60 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74  =z.**.** Code it
1cf70 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67   as such, taking
1cf80 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20   care to do the 
1cf90 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73  common subexpres
1cfa0 73 69 6f 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61  sion.** elementa
1cfb0 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74  tion of x..*/.st
1cfc0 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f  atic void exprCo
1cfd0 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72  deBetween(.  Par
1cfe0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
1cff0 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1d000 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1d010 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
1d020 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
1d030 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72  The BETWEEN expr
1d040 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
1d050 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
1d060 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
1d070 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
1d080 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 54  */.  int jumpIfT
1d090 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74  rue,   /* Take t
1d0a0 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
1d0b0 45 54 57 45 45 4e 20 69 73 20 74 72 75 65 20 2a  ETWEEN is true *
1d0c0 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
1d0d0 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ll    /* Take th
1d0e0 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
1d0f0 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f  TWEEN is NULL */
1d100 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72 41  .){.  Expr exprA
1d110 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41  nd;     /* The A
1d120 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20  ND operator in  
1d130 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a  x>=y AND x<=z  *
1d140 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66  /.  Expr compLef
1d150 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e  t;    /* The  x>
1d160 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =y  term */.  Ex
1d170 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20  pr compRight;   
1d180 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65  /* The  x<=z  te
1d190 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70  rm */.  Expr exp
1d1a0 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rX;       /* The
1d1b0 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69    x  subexpressi
1d1c0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  on */.  int regF
1d1d0 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d  ree1 = 0; /* Tem
1d1e0 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
1d1f0 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
1d200 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1d210 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1d220 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70  Select) );.  exp
1d230 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65  rX = *pExpr->pLe
1d240 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70  ft;.  exprAnd.op
1d250 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70   = TK_AND;.  exp
1d260 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f  rAnd.pLeft = &co
1d270 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  mpLeft;.  exprAn
1d280 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70  d.pRight = &comp
1d290 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66  Right;.  compLef
1d2a0 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20  t.op = TK_GE;.  
1d2b0 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d  compLeft.pLeft =
1d2c0 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c   &exprX;.  compL
1d2d0 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  eft.pRight = pEx
1d2e0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
1d2f0 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52  ].pExpr;.  compR
1d300 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b  ight.op = TK_LE;
1d310 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65  .  compRight.pLe
1d320 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
1d330 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20  ompRight.pRight 
1d340 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1d350 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
1d360 65 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73  exprX.iTable = s
1d370 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1d380 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  mp(pParse, &expr
1d390 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
1d3a0 20 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52   exprX.op = TK_R
1d3b0 45 47 49 53 54 45 52 3b 0a 20 20 69 66 28 20 6a  EGISTER;.  if( j
1d3c0 75 6d 70 49 66 54 72 75 65 20 29 7b 0a 20 20 20  umpIfTrue ){.   
1d3d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1d3e0 75 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  ue(pParse, &expr
1d3f0 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
1d400 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  fNull);.  }else{
1d410 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1d420 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1d430 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
1d440 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
1d450 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1d460 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1d470 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f   regFree1);..  /
1d480 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74  * Ensure adequat
1d490 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20  e test coverage 
1d4a0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  */.  testcase( j
1d4b0 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1d4c0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1d4d0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1d4e0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1d4f0 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1d500 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
1d510 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
1d520 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1d530 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1d540 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1d550 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
1d560 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1d570 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1d580 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
1d590 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
1d5a0 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1d5b0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1d5c0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1d5d0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1d5e0 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1d5f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1d600 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1d610 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1d620 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1d630 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1d640 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1d650 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d660 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1d670 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1d680 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  ree1!=0 );.}../*
1d690 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1d6a0 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
1d6b0 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
1d6c0 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
1d6d0 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
1d6e0 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
1d6f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1d700 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
1d710 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
1d720 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
1d730 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1d740 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
1d750 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
1d760 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
1d770 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
1d780 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
1d790 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
1d7a0 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
1d7b0 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51  fNull flag is SQ
1d7c0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e  LITE_JUMPIFNULL.
1d7d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
1d7e0 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
1d7f0 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
1d800 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
1d810 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
1d820 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
1d830 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
1d840 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
1d850 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
1d860 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
1d870 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
1d880 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
1d890 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
1d8a0 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
1d8b0 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
1d8c0 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
1d8d0 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
1d8e0 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
1d8f0 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
1d900 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
1d910 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
1d920 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
1d930 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
1d940 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
1d950 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1d960 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
1d970 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
1d980 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
1d990 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1d9a0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
1d9b0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1d9c0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
1d9d0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
1d9e0 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
1d9f0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
1da00 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
1da10 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1da20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
1da30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20  ) )     return; 
1da40 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
1da50 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
1da60 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
1da70 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
1da80 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e   ) return;  /* N
1da90 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  o way this can h
1daa0 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20  appen */.  op = 
1dab0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
1dac0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1dad0 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
1dae0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
1daf0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1db00 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
1db10 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1db20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1db30 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1db40 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1db50 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1db60 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1db70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d  r->pLeft, d2,jum
1db80 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
1db90 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1dba0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1dbb0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1dbc0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
1dbd0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1dbe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1dbf0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1dc00 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
1dc10 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1dc20 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  arse, 1);.      
1dc30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1dc40 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
1dc50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1dc60 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1dc70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1dc80 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1dc90 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
1dca0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1dcb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1dcc0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1dcd0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1dce0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1dcf0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1dd00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1dd10 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
1dd20 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1dd30 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1dd40 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1dd50 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1dd60 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
1dd70 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1dd80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1dd90 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
1dda0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
1ddb0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
1ddc0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
1ddd0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
1dde0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
1ddf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1de00 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
1de10 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1de20 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
1de30 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
1de40 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
1de50 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
1de60 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
1de70 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
1de80 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
1de90 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
1dea0 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
1deb0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
1dec0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ded0 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
1dee0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1def0 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
1df00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1df10 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
1df20 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1df30 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
1df40 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
1df50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1df60 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1df70 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1df80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1df90 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1dfa0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1dfb0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1dfc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1dfd0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1dfe0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1dff0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
1e000 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1e010 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1e020 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1e030 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e040 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1e050 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1e060 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e070 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1e080 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1e090 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1e0a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e0b0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1e0c0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1e0d0 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1e0e0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
1e0f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e100 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
1e110 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1e120 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e130 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e140 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1e150 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1e160 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e170 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e180 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1e190 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  e2);.      op = 
1e1a0 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
1e1b0 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
1e1c0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1e1d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e1e0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1e1f0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1e200 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1e210 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e  , dest, SQLITE_N
1e220 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
1e230 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1e240 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1e250 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1e260 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1e270 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1e280 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
1e290 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
1e2a0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1e2b0 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
1e2c0 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  IsNull );.      
1e2d0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
1e2e0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
1e2f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e300 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
1e310 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e320 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
1e330 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
1e340 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e350 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1e360 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1e370 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
1e380 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e390 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
1e3a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e3b0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e3c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e3d0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
1e3e0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
1e3f0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1e400 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1e410 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
1e420 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1e430 65 73 74 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75  est, 1, jumpIfNu
1e440 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1e450 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1e460 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1e470 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
1e480 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
1e490 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
1e4a0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1e4b0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
1e4c0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a  t destIfNull = j
1e4d0 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74  umpIfNull ? dest
1e4e0 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   : destIfFalse;.
1e4f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e500 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
1e510 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
1e520 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
1e530 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e540 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1e550 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20  oto, 0, dest);. 
1e560 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e570 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1e580 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1e590 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e5a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
1e5b0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20  ult: {.      r1 
1e5c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e5d0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1e5e0 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
1e5f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e600 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1e610 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  f, r1, dest, jum
1e620 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
1e630 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1e640 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1e650 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1e660 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1e670 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e680 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
1e690 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1e6a0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
1e6b0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1e6c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1e6d0 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f  egFree2);  .}../
1e6e0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1e6f0 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
1e700 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
1e710 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
1e720 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
1e730 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
1e740 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1e750 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
1e760 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
1e770 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
1e780 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1e790 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
1e7a0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
1e7b0 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
1e7c0 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
1e7d0 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
1e7e0 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
1e7f0 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49  mpIfNull is SQLI
1e800 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72  TE_JUMPIFNULL or
1e810 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66   fall through if
1e820 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69   jumpIfNull.** i
1e830 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s 0..*/.void sql
1e840 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1e850 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1e860 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1e870 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
1e880 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
1e890 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1e8a0 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
1e8b0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1e8c0 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1e8d0 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
1e8e0 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
1e8f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
1e900 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
1e910 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
1e920 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
1e930 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f  ==0) ) return; /
1e940 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56  * Existence of V
1e950 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
1e960 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70  aller */.  if( p
1e970 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74  Expr==0 )    ret
1e980 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76  urn;..  /* The v
1e990 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f  alue of pExpr->o
1e9a0 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c  p and op are rel
1e9b0 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
1e9c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1e9d0 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20   pExpr->op      
1e9e0 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20        op.  **   
1e9f0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20      ---------   
1ea00 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
1ea10 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  -.  **       TK_
1ea20 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20  ISNULL          
1ea30 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20  OP_NotNull.  ** 
1ea40 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c        TK_NOTNULL
1ea50 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75           OP_IsNu
1ea60 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
1ea70 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _NE             
1ea80 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20   OP_Eq.  **     
1ea90 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20    TK_EQ         
1eaa0 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20       OP_Ne.  ** 
1eab0 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20        TK_GT     
1eac0 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20           OP_Le. 
1ead0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20   **       TK_LE 
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1eaf0 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Gt.  **       TK
1eb00 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _GE             
1eb10 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Lt.  **     
1eb20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20    TK_LT         
1eb30 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a       OP_Ge.  **.
1eb40 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76    ** For other v
1eb50 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e  alues of pExpr->
1eb60 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69  op, op is undefi
1eb70 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a  ned and unused..
1eb80 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    ** The value o
1eb90 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
1eba0 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61  nstants are arra
1ebb0 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77  nged such that w
1ebc0 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75  e.  ** can compu
1ebd0 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61  te the mapping a
1ebe0 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66  bove using the f
1ebf0 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73  ollowing express
1ec00 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74  ion..  ** Assert
1ec10 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20  ()s verify that 
1ec20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
1ec30 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f  is correct..  */
1ec40 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d  .  op = ((pExpr-
1ec50 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  >op+(TK_ISNULL&1
1ec60 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c  ))^1)-(TK_ISNULL
1ec70 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  &1);..  /* Verif
1ec80 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d  y correct alignm
1ec90 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  ent of TK_ and O
1eca0 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a  P_ constants.  *
1ecb0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  /.  assert( pExp
1ecc0 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  r->op!=TK_ISNULL
1ecd0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75   || op==OP_NotNu
1ece0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
1ecf0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f  pExpr->op!=TK_NO
1ed00 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TNULL || op==OP_
1ed10 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  IsNull );.  asse
1ed20 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1ed30 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45  K_NE || op==OP_E
1ed40 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  q );.  assert( p
1ed50 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20  Expr->op!=TK_EQ 
1ed60 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  || op==OP_Ne );.
1ed70 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1ed80 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70  >op!=TK_LT || op
1ed90 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ge );.  ass
1eda0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1edb0 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LE || op==OP_
1edc0 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Gt );.  assert( 
1edd0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54  pExpr->op!=TK_GT
1ede0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b   || op==OP_Le );
1edf0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1ee00 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f  ->op!=TK_GE || o
1ee10 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73  p==OP_Lt );..  s
1ee20 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
1ee30 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
1ee40 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  AND: {.      tes
1ee50 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1ee60 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1ee70 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1ee80 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1ee90 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1eea0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1eeb0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1eec0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1eed0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
1eee0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1eef0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ef00 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
1ef10 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
1ef20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1ef30 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1ef40 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1ef50 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1ef60 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1ef70 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1ef80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ef90 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1efa0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
1efb0 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49   jumpIfNull^SQLI
1efc0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1efd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1efe0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1eff0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1f000 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1f010 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f020 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1f030 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
1f040 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1f050 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
1f060 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f070 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
1f080 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1f090 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1f0a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1f0b0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1f0c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1f0d0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1f0e0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1f0f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f100 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1f110 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1f120 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1f130 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1f140 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1f150 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1f160 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f170 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_LT );.      t
1f180 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f190 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LE );.      test
1f1a0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20  case( op==TK_GT 
1f1b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f1c0 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  e( op==TK_GE );.
1f1d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f1e0 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
1f1f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f200 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
1f210 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1f220 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1f230 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f240 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f250 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f260 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f270 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1f280 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f290 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1f2a0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1f2b0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1f2c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f2d0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1f2e0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1f2f0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1f300 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
1f310 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ull);.      test
1f320 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f330 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1f340 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1f350 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1f360 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f370 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
1f380 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20  TK_ISNOT: {.    
1f390 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
1f3a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
1f3b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f3c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1f3d0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
1f3e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f3f0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f400 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1f410 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1f420 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f430 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f440 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1f450 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1f460 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d  op = (pExpr->op=
1f470 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20  =TK_IS) ? TK_NE 
1f480 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63  : TK_EQ;.      c
1f490 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1f4a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f4b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1f4c0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1f4d0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
1f4e0 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  st, SQLITE_NULLE
1f4f0 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  Q);.      testca
1f500 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f510 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f520 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1f530 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f540 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1f550 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
1f560 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
1f570 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f580 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
1f590 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f5a0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
1f5b0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1f5c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f5d0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f5e0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1f5f0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1f600 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
1f610 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
1f620 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f630 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1f640 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f650 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
1f660 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
1f670 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1f680 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
1f690 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
1f6a0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1f6b0 74 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  t, 0, jumpIfNull
1f6c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f6d0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1f6e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1f6f0 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  RY.    case TK_I
1f700 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a  N: {.      if( j
1f710 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  umpIfNull ){.   
1f720 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f730 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
1f740 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
1f750 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1f760 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74          int dest
1f770 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
1f780 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1f790 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f7a0 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
1f7b0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
1f7c0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
1f7d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f7e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1f7f0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
1f800 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1f810 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1f820 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1f830 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1f840 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f850 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
1f860 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
1f870 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1f880 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31  (v, OP_IfNot, r1
1f890 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1f8a0 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65  ll!=0);.      te
1f8b0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1f8c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1f8d0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1f8e0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  l==0 );.      br
1f8f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1f900 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1f910 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1f920 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
1f930 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1f940 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1f950 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  e2);.}../*.** Do
1f960 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
1f970 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
1f980 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
1f990 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
1f9a0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
1f9b0 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  are completely i
1f9c0 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72  dentical.  Retur
1f9d0 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66  n 1 if they diff
1f9e0 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20  er only.** by a 
1f9f0 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
1fa00 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65   at the top leve
1fa10 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20  l.  Return 2 if 
1fa20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
1fa30 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74  ences.** other t
1fa40 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  han the top-leve
1fa50 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  l COLLATE operat
1fa60 6f 72 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  or..**.** Someti
1fa70 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
1fa80 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65   will return 2 e
1fa90 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65  ven if the two e
1faa0 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65  xpressions.** re
1fab0 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c  ally are equival
1fac0 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e  ent.  If we cann
1fad0 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  ot prove that th
1fae0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
1faf0 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20  e.** identical, 
1fb00 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74  we return 2 just
1fb10 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f   to be safe.  So
1fb20 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
1fb30 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74  .** returns 2, t
1fb40 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
1fb50 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
1fb60 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
1fb70 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
1fb80 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
1fb90 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
1fba0 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20   0 or 1 return, 
1fbb0 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
1fbc0 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
1fbd0 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
1fbe0 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
1fbf0 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
1fc00 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1fc10 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
1fc20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
1fc30 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a  xtra 2 - that.**
1fc40 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75   just might resu
1fc50 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68  lt in some sligh
1fc60 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e  tly slower code.
1fc70 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a    But returning.
1fc80 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** an incorrect 
1fc90 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61  0 or 1 could lea
1fca0 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
1fcb0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1fcc0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
1fcd0 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
1fce0 29 7b 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c  ){.  if( pA==0||
1fcf0 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pB==0 ){.    ret
1fd00 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a  urn pB==pA ? 0 :
1fd10 20 32 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   2;.  }.  assert
1fd20 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
1fd30 70 65 72 74 79 28 70 41 2c 20 45 50 5f 54 6f 6b  perty(pA, EP_Tok
1fd40 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
1fd50 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
1fd60 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
1fd70 72 74 79 28 70 42 2c 20 45 50 5f 54 6f 6b 65 6e  rty(pB, EP_Token
1fd80 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
1fd90 20 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   );.  if( ExprHa
1fda0 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50  sProperty(pA, EP
1fdb0 5f 78 49 73 53 65 6c 65 63 74 29 20 7c 7c 20 45  _xIsSelect) || E
1fdc0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1fdd0 42 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  B, EP_xIsSelect)
1fde0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 32   ){.    return 2
1fdf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d  ;.  }.  if( (pA-
1fe00 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
1fe10 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67  inct)!=(pB->flag
1fe20 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
1fe30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
1fe40 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f  f( pA->op!=pB->o
1fe50 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  p ){.    if( pA-
1fe60 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
1fe70 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
1fe80 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
1fe90 20 70 42 29 3c 32 20 29 7b 0a 20 20 20 20 20 20   pB)<2 ){.      
1fea0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1feb0 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d      if( pB->op==
1fec0 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
1fed0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1fee0 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 29 3c  (pA, pB->pLeft)<
1fef0 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
1ff00 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 1;.    }.    r
1ff10 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
1ff20 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
1ff30 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
1ff40 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65   pB->pLeft) ) re
1ff50 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 73 71  turn 2;.  if( sq
1ff60 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1ff70 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d  (pA->pRight, pB-
1ff80 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72  >pRight) ) retur
1ff90 6e 20 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 2;.  if( sqlit
1ffa0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
1ffb0 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70  e(pA->x.pList, p
1ffc0 42 2d 3e 78 2e 70 4c 69 73 74 29 20 29 20 72 65  B->x.pList) ) re
1ffd0 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 70 41  turn 2;.  if( pA
1ffe0 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
1fff0 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c  able || pA->iCol
20000 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
20010 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
20020 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
20030 74 79 28 70 41 2c 20 45 50 5f 49 6e 74 56 61 6c  ty(pA, EP_IntVal
20040 75 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ue) ){.    if( !
20050 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20060 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pB, EP_IntValue)
20070 20 7c 7c 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65   || pA->u.iValue
20080 21 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29  !=pB->u.iValue )
20090 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  {.      return 2
200a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
200b0 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
200c0 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28  OLUMN && ALWAYS(
200d0 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43  pA->op!=TK_AGG_C
200e0 4f 4c 55 4d 4e 29 20 26 26 20 70 41 2d 3e 75 2e  OLUMN) && pA->u.
200f0 7a 54 6f 6b 65 6e 29 7b 0a 20 20 20 20 69 66 28  zToken){.    if(
20100 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
20110 28 70 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  (pB, EP_IntValue
20120 29 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 75  ) || NEVER(pB->u
20130 2e 7a 54 6f 6b 65 6e 3d 3d 30 29 20 29 20 72 65  .zToken==0) ) re
20140 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
20150 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  strcmp(pA->u.zTo
20160 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
20170 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
20180 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f  turn pA->op==TK_
20190 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b  COLLATE ? 1 : 2;
201a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
201b0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
201c0 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72  Compare two Expr
201d0 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52  List objects.  R
201e0 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20  eturn 0 if they 
201f0 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
20200 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  d .** non-zero i
20210 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
20220 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
20230 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
20240 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ht return non-ze
20250 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  ro for equivalen
20260 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68  t ExprLists.  Th
20270 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71  e.** only conseq
20280 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69  uence will be di
20290 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74  sabled optimizat
202a0 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20  ions.  But this 
202b0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
202c0 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69  never return 0 i
202d0 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69  f the two ExprLi
202e0 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64  st objects are d
202f0 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20  ifferent, or.** 
20300 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69  a malfunction wi
20310 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  ll result..**.**
20320 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   Two NULL pointe
20330 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
20340 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  d to be the same
20350 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f  .  But a NULL po
20360 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20  inter.** always 
20370 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
20380 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e  on-NULL pointer.
20390 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
203a0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45  xprListCompare(E
203b0 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70  xprList *pA, Exp
203c0 72 4c 69 73 74 20 2a 70 42 29 7b 0a 20 20 69 6e  rList *pB){.  in
203d0 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
203e0 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75   && pB==0 ) retu
203f0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d  rn 0;.  if( pA==
20400 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74  0 || pB==0 ) ret
20410 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d  urn 1;.  if( pA-
20420 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70  >nExpr!=pB->nExp
20430 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
20440 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e  for(i=0; i<pA->n
20450 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
20460 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70  Expr *pExprA = p
20470 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  A->a[i].pExpr;. 
20480 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20     Expr *pExprB 
20490 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pB->a[i].pExpr
204a0 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b  ;.    if( pA->a[
204b0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42  i].sortOrder!=pB
204c0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
204d0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
204e0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
204f0 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20  Compare(pExprA, 
20500 70 45 78 70 72 42 29 20 29 20 72 65 74 75 72 6e  pExprB) ) return
20510 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
20520 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
20530 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20 63  urn true if we c
20540 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70 45 32  an prove the pE2
20550 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
20560 74 72 75 65 20 69 66 20 70 45 31 20 69 73 0a 2a  true if pE1 is.*
20570 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20  * true.  Return 
20580 66 61 6c 73 65 20 69 66 20 77 65 20 63 61 6e 6e  false if we cann
20590 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  ot complete the 
205a0 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45 32 20  proof or if pE2 
205b0 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73  might.** be fals
205c0 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  e.  Examples:.**
205d0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 3d  .**     pE1: x==
205e0 35 20 20 20 20 20 20 70 45 32 3a 20 78 3e 30 20  5      pE2: x>0 
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
20600 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
20610 20 70 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20   pE1: x>0       
20620 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
20630 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61        Result: fa
20640 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
20650 78 21 3d 31 32 33 20 20 20 20 70 45 32 3a 20 78  x!=123    pE2: x
20660 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
20670 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 0a  Result: true.**.
20680 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e  ** When comparin
20690 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  g TK_COLUMN node
206a0 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e  s between pE1 an
206b0 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61  d pE2, if pE2 ha
206c0 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65  s.** Expr.iTable
206d0 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61  <0 then assume a
206e0 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69   table number gi
206f0 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a  ven by iTab..**.
20700 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  ** When in doubt
20710 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20  , return false. 
20720 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20   Returning true 
20730 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
20740 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72  formance.** impr
20750 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  ovement.  Return
20760 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20  ing false might 
20770 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61  cause a performa
20780 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62  nce reduction, b
20790 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c  ut.** it will al
207a0 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f  ways give the co
207b0 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64  rrect answer and
207c0 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73   is hence always
207d0 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   safe..*/.int sq
207e0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
207f0 45 78 70 72 28 45 78 70 72 20 2a 70 45 31 2c 20  Expr(Expr *pE1, 
20800 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69  Expr *pE2, int i
20810 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 30  Tab){.  return 0
20820 3b 20 20 2f 2a 20 46 49 58 4d 45 3a 20 74 68 69  ;  /* FIXME: thi
20830 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 6f  s needs to be wo
20840 72 6b 65 64 20 6f 75 74 20 2a 2f 0a 7d 0a 0a 2f  rked out */.}../
20850 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
20860 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
20870 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  g structure is u
20880 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20  sed by the tree 
20890 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75  walker.** to cou
208a0 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  nt references to
208b0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69   table columns i
208c0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  n the arguments 
208d0 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67  of an .** aggreg
208e0 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e  ate function, in
208f0 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
20900 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ent the.** sqlit
20910 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72  e3FunctionThisSr
20920 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  c() routine..*/.
20930 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
20940 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
20950 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74  c;   /* One part
20960 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75  icular FROM clau
20970 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71  se in a nested q
20980 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  uery */.  int nT
20990 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  his;       /* Nu
209a0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
209b0 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
209c0 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69   pSrcList */.  i
209d0 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20  nt nOther;      
209e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
209f0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
20a00 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d  ns in other FROM
20a10 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a   clauses */.};..
20a20 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
20a30 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
20a40 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e  nces to columns.
20a50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
20a60 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b  xprSrcCount(Walk
20a70 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
20a80 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20  r *pExpr){.  /* 
20a90 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74  The NEVER() on t
20aa0 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69  he second term i
20ab0 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74 65  s because sqlite
20ac0 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
20ad0 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61  sSrc().  ** is a
20ae0 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66  lways called bef
20af0 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  ore sqlite3ExprA
20b00 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
20b10 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20  () and so the.  
20b20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61  ** TK_COLUMNs ha
20b30 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
20b40 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54  converted into T
20b50 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49  K_AGG_COLUMN.  I
20b60 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75  f.  ** sqlite3Fu
20b70 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
20b80 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66 66  c() is used diff
20b90 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66  erently in the f
20ba0 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20  uture, the.  ** 
20bb0 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65  NEVER() will nee
20bc0 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e  d to be removed.
20bd0 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
20be0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
20bf0 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f  | NEVER(pExpr->o
20c00 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
20c10 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
20c20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43 6f      struct SrcCo
20c30 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  unt *p = pWalker
20c40 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20  ->u.pSrcCount;. 
20c50 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
20c60 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
20c70 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
20c80 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
20c90 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
20ca0 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d  able==pSrc->a[i]
20cb0 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  .iCursor ) break
20cc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20cd0 69 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a  i<pSrc->nSrc ){.
20ce0 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b        p->nThis++
20cf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20d00 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a     p->nOther++;.
20d10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20d20 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
20d30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
20d40 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ine if any of th
20d50 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
20d60 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f  he pExpr Functio
20d70 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70  n reference.** p
20d80 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e  SrcList.  Return
20d90 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f   true if they do
20da0 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74  .  Also return t
20db0 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74  rue if the funct
20dc0 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72  ion.** has no ar
20dd0 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f  guments or has o
20de0 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  nly constant arg
20df0 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
20e00 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a  false if pExpr.*
20e10 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c  * references col
20e20 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c  umns but not col
20e30 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66  umns of tables f
20e40 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74  ound in pSrcList
20e50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20e60 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
20e70 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c  Src(Expr *pExpr,
20e80 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
20e90 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  st){.  Walker w;
20ea0 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75  .  struct SrcCou
20eb0 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74  nt cnt;.  assert
20ec0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
20ed0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
20ee0 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
20ef0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
20f00 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
20f10 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20  exprSrcCount;.  
20f20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20  w.u.pSrcCount = 
20f30 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63  &cnt;.  cnt.pSrc
20f40 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63   = pSrcList;.  c
20f50 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20  nt.nThis = 0;.  
20f60 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a  cnt.nOther = 0;.
20f70 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
20f80 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d  rList(&w, pExpr-
20f90 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  >x.pList);.  ret
20fa0 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20  urn cnt.nThis>0 
20fb0 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30  || cnt.nOther==0
20fc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
20fd0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
20fe0 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  the pAggInfo->aC
20ff0 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  ol[] array.  Ret
21000 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
21010 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
21020 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
21030 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
21040 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
21050 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
21060 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73  dAggInfoColumn(s
21070 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
21080 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
21090 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
210a0 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72  Col = sqlite3Arr
210b0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
210c0 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49     db,.       pI
210d0 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20  nfo->aCol,.     
210e0 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
210f0 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20  aCol[0]),.      
21100 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
21110 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
21120 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
21130 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20    ../*.** Add a 
21140 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
21150 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  he pAggInfo->aFu
21160 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  nc[] array.  Ret
21170 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
21180 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
21190 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
211a0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
211b0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
211c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
211d0 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c  dAggInfoFunc(sql
211e0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
211f0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
21200 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75   i;.  pInfo->aFu
21210 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  nc = sqlite3Arra
21220 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
21230 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49    db, .       pI
21240 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20  nfo->aFunc,.    
21250 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
21260 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20  >aFunc[0]),.    
21270 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
21280 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
21290 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
212a0 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
212b0 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62  s the xExprCallb
212c0 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77  ack for a tree w
212d0 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73  alker.  It is us
212e0 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ed to.** impleme
212f0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
21300 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
21310 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  ).  See sqlite3E
21320 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
21330 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69  ates.** for addi
21340 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
21350 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
21360 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
21370 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  te(Walker *pWalk
21380 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
21390 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
213a0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
213b0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
213c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
213d0 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
213e0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
213f0 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
21400 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70  st;.  AggInfo *p
21410 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70  AggInfo = pNC->p
21420 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74  AggInfo;..  swit
21430 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
21440 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
21450 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
21460 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
21470 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21480 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
21490 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
214a0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
214b0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
214c0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  );.      /* Chec
214d0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
214e0 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65  column is in one
214f0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
21500 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20  n the FROM.     
21510 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
21520 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
21530 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  y */.      if( A
21540 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d  LWAYS(pSrcList!=
21550 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  0) ){.        st
21560 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
21570 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
21580 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
21590 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
215a0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
215b0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
215c0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
215d0 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
215e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
215f0 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
21600 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
21610 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
21620 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ed) );.         
21630 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
21640 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
21650 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
21660 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
21670 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
21680 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
21690 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
216a0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
216b0 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
216c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
216d0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
216e0 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
216f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
21700 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
21710 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
21720 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
21730 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
21740 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
21750 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
21760 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
21770 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
21780 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
21790 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
217a0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
217b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
217c0 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
217d0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
217e0 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
217f0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
21800 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
21810 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
21830 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
21840 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
21860 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
21870 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
21880 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
21890 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
218a0 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
218b0 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
218c0 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
218d0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
218e0 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
218f0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
21900 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
21910 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
21920 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
21930 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
21940 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
21950 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
21960 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
21970 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
21980 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
21990 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
219a0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
219b0 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
219c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
219e0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
219f0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
21a00 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
21a10 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
21a20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
21a30 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
21a40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21a50 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
21a70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
21a80 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
21a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21aa0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
21ab0 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
21ac0 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
21ad0 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
21ae0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
21af0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
21b00 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
21b10 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
21b20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
21b30 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
21b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b50 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
21b60 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
21b70 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
21b80 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
21b90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
21ba0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
21bb0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bd0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
21be0 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
21c00 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
21c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21c20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21c40 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
21c50 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
21c60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
21c70 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
21c80 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
21c90 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
21ca0 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
21cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21cc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
21cd0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
21ce0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
21cf0 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
21d00 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
21d10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
21d20 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
21d30 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
21d40 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
21d50 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
21d60 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
21d70 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
21d80 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
21d90 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
21da0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
21db0 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
21dc0 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
21dd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21de0 20 20 20 20 20 20 45 78 70 72 53 65 74 49 72 72        ExprSetIrr
21df0 65 64 75 63 69 62 6c 65 28 70 45 78 70 72 29 3b  educible(pExpr);
21e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
21e10 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
21e20 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
21e30 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
21e40 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a   TK_AGG_COLUMN;.
21e50 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
21e60 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b  r->iAgg = (i16)k
21e70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
21e80 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
21e90 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d   /* endif pExpr-
21ea0 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
21eb0 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20  iCursor */.     
21ec0 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70     } /* end loop
21ed0 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a   over pSrcList *
21ee0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
21ef0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
21f00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
21f10 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
21f20 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  : {.      if( (p
21f30 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
21f40 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20  _InAggFunc)==0. 
21f50 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72        && pWalker
21f60 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70  ->walkerDepth==p
21f70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20  Expr->op2.      
21f80 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
21f90 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
21fa0 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
21fb0 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
21fc0 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
21fd0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
21fe0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
21ff0 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
22000 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
22010 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
22020 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
22030 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
22040 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
22050 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
22060 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
22070 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
22080 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
22090 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
220a0 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29  m->pExpr, pExpr)
220b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
220c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
220d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
220e0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
220f0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
22100 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
22110 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
22120 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
22130 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
22140 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
22150 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
22160 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
22170 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
22180 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
22190 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64  foFunc(pParse->d
221a0 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  b, pAggInfo);.  
221b0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
221c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
221d0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
221e0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
221f0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
22200 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
22210 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
22220 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
22230 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
22240 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
22250 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
22260 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
22270 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
22280 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
22290 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
222a0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
222b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
222c0 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
222d0 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
222e0 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
22310 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
22320 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
22330 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
22340 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70        pExpr->x.p
22350 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e  List ? pExpr->x.
22360 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
22370 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
22380 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
22390 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
223a0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20  tinct ){.       
223b0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
223c0 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
223d0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
223e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
223f0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
22400 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
22410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
22420 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
22440 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e   Make pExpr poin
22450 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  t to the appropr
22460 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61  iate pAggInfo->a
22470 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20  Func[] entry.   
22480 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22490 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
224a0 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
224b0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
224c0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
224d0 20 20 20 20 20 20 20 45 78 70 72 53 65 74 49 72         ExprSetIr
224e0 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72 29  reducible(pExpr)
224f0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
22500 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a  >iAgg = (i16)i;.
22510 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
22520 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
22530 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  fo;.        retu
22540 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
22550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22560 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
22570 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
22580 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22590 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
225a0 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  .}.static int an
225b0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
225c0 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a  nSelect(Walker *
225d0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
225e0 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55  *pSelect){.  UNU
225f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 57  SED_PARAMETER(pW
22600 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45 44  alker);.  UNUSED
22610 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
22620 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  ct);.  return WR
22630 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
22640 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
22650 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f   pExpr expressio
22660 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
22670 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
22680 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
22690 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
226a0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
226b0 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74  AggInfo object t
226c0 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66  hat pNC->pAggInf
226d0 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20  o.** points to. 
226e0 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   Additional entr
226f0 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20  ies are made on 
22700 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65  the AggInfo obje
22710 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61  ct as.** necessa
22720 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
22730 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
22740 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
22750 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
22760 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
22770 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
22780 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
22790 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
227a0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
227b0 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f  ggregates(NameCo
227c0 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
227d0 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b   *pExpr){.  Walk
227e0 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er w;.  memset(&
227f0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
22800 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
22810 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ack = analyzeAgg
22820 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c  regate;.  w.xSel
22830 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e  ectCallback = an
22840 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
22850 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70  nSelect;.  w.u.p
22860 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65  NC = pNC;.  asse
22870 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  rt( pNC->pSrcLis
22880 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  t!=0 );.  sqlite
22890 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
228a0 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  xpr);.}../*.** C
228b0 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41  all sqlite3ExprA
228c0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
228d0 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
228e0 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a  ression in an.**
228f0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
22900 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
22910 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
22920 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
22930 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20  r is found, the 
22940 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20  analysis is cut 
22950 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  short..*/.void s
22960 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
22970 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e  eAggList(NameCon
22980 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c  text *pNC, ExprL
22990 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
229a0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
229b0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
229c0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
229d0 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
229e0 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
229f0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
22a00 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
22a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22a20 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
22a30 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70  es(pNC, pItem->p
22a40 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
22a50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
22a60 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  te a single new 
22a70 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73 65  register for use
22a80 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e   to hold some in
22a90 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
22aa0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
22ab0 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73  3GetTempReg(Pars
22ac0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66  e *pParse){.  if
22ad0 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
22ae0 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  eg==0 ){.    ret
22af0 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  urn ++pParse->nM
22b00 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  em;.  }.  return
22b10 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
22b20 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d  g[--pParse->nTem
22b30 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pReg];.}../*.** 
22b40 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67  Deallocate a reg
22b50 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76  ister, making av
22b60 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73  ailable for reus
22b70 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
22b80 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a  .** purpose..**.
22b90 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
22ba0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65   is currently be
22bb0 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 65 20  ing used by the 
22bc0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68  column cache, th
22bd0 65 6e 0a 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63  en.** the dalloc
22be0 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65  ation is deferre
22bf0 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75  d until the colu
22c00 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68  mn cache line th
22c10 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72  at uses.** the r
22c20 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20  egister becomes 
22c30 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  stale..*/.void s
22c40 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
22c50 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
22c60 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  se, int iReg){. 
22c70 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61   if( iReg && pPa
22c80 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
22c90 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
22ca0 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20  aTempReg) ){.   
22cb0 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
22cc0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
22cd0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  .    for(i=0, p=
22ce0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
22cf0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
22d00 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
22d10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
22d20 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
22d30 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
22d40 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
22d50 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
22d60 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
22d70 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
22d80 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69  >nTempReg++] = i
22d90 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
22da0 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65  * Allocate or de
22db0 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b  allocate a block
22dc0 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75   of nReg consecu
22dd0 74 69 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a  tive registers.*
22de0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
22df0 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
22e00 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65  *pParse, int nRe
22e10 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  g){.  int i, n;.
22e20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52    i = pParse->iR
22e30 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70  angeReg;.  n = p
22e40 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
22e50 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20  ;.  if( nReg<=n 
22e60 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
22e70 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
22e80 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e  e(pParse, i, i+n
22e90 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73  -1) );.    pPars
22ea0 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20  e->iRangeReg += 
22eb0 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
22ec0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e  ->nRangeReg -= n
22ed0 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Reg;.  }else{.  
22ee0 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d    i = pParse->nM
22ef0 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
22f00 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
22f10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
22f20 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  }.void sqlite3Re
22f30 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50  leaseTempRange(P
22f40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
22f50 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
22f60 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
22f70 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
22f80 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b  se, iReg, nReg);
22f90 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72  .  if( nReg>pPar
22fa0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b  se->nRangeReg ){
22fb0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
22fc0 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20  ngeReg = nReg;. 
22fd0 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
22fe0 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d  eReg = iReg;.  }
22ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
23000 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  ll temporary reg
23010 69 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20  isters as being 
23020 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  unavailable for 
23030 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reuse..*/.void s
23040 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
23050 65 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  egCache(Parse *p
23060 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
23070 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a  ->nTempReg = 0;.
23080 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
23090 52 65 67 20 3d 20 30 3b 0a 7d 0a                 Reg = 0;.}.