/ Hex Artifact Content
Login

Artifact 4dff0b04eaaf133789279c6b8cd69175dfbb1691:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0470: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0480: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0490: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
04a0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
04b0: 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
04c0: 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  t( pExpr->flags&
04d0: 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a  EP_xIsSelect );.
04e0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
04f0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0500: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
0510: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
0520: 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  xpr);.  }.#ifnde
0530: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
0540: 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  ST.  if( op==TK_
0550: 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73 65  CAST ){.    asse
0560: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0570: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
0580: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
0590: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 66  return sqlite3Af
05a0: 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
05b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7d  ->u.zToken);.  }
05c0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f  .#endif.  if( (o
05d0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
05e0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   || op==TK_COLUM
05f0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49  N || op==TK_REGI
0600: 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45 78  STER) .   && pEx
0610: 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b  pr->pTab!=0.  ){
0620: 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52  .    /* op==TK_R
0630: 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72  EGISTER && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
0650: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
0660: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
0670: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0680: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0690: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
06a0: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
06b0: 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ster */.    int 
06c0: 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  j = pExpr->iColu
06d0: 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20  mn;.    if( j<0 
06e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
06f0: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
0700: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0710: 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d  pTab && j<pExpr-
0720: 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  >pTab->nCol );. 
0730: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
0740: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61  >pTab->aCol[j].a
0750: 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72  ffinity;.  }.  r
0760: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66  eturn pExpr->aff
0770: 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inity;.}../*.** 
0780: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  Set the collatin
0790: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
07a0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
07b0: 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74  to be the collat
07c0: 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
07d0: 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e  named by pToken.
07e0: 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e     Return a poin
07f0: 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70  ter to a new Exp
0800: 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69  r node that.** i
0810: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f  mplements the CO
0820: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a  LLATE operator..
0830: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
0840: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
0850: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20  or occurs, that 
0860: 66 61 63 74 20 69 73 20 72 65 63 6f 72 64 65 64  fact is recorded
0870: 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a   in pParse->db.*
0880: 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70 72 20  * and the pExpr 
0890: 70 61 72 61 6d 65 74 65 72 20 69 73 20 72 65 74  parameter is ret
08a0: 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e  urned unchanged.
08b0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
08c0: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
08d0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
08e0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
08f0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d   Token *pCollNam
0900: 65 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e  e){.  if( pCollN
0910: 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  ame->n>0 ){.    
0920: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
0930: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
0940: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c  arse->db, TK_COL
0950: 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c  LATE, pCollName,
0960: 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65   1);.    if( pNe
0970: 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  w ){.      pNew-
0980: 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a  >pLeft = pExpr;.
0990: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
09a0: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b  s |= EP_Collate;
09b0: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
09c0: 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  New;.    }.  }. 
09d0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
09e0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
09f0: 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
0a00: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
0a10: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  , Expr *pExpr, c
0a20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a  onst char *zC){.
0a30: 20 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73    Token s;.  ass
0a40: 65 72 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20  ert( zC!=0 );.  
0a50: 73 2e 7a 20 3d 20 7a 43 3b 0a 20 20 73 2e 6e 20  s.z = zC;.  s.n 
0a60: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
0a70: 30 28 73 2e 7a 29 3b 0a 20 20 72 65 74 75 72 6e  0(s.z);.  return
0a80: 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
0a90: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72  ollateToken(pPar
0aa0: 73 65 2c 20 70 45 78 70 72 2c 20 26 73 29 3b 0a  se, pExpr, &s);.
0ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20 6f 76  }../*.** Skip ov
0ac0: 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c 41 54  er any TK_COLLAT
0ad0: 45 20 61 6e 64 2f 6f 72 20 54 4b 5f 41 53 20 6f  E and/or TK_AS o
0ae0: 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20  perators at the 
0af0: 72 6f 6f 74 20 6f 66 0a 2a 2a 20 61 6e 20 65 78  root of.** an ex
0b00: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70  pression..*/.Exp
0b10: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53 6b  r *sqlite3ExprSk
0b20: 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20 2a  ipCollate(Expr *
0b30: 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65 28  pExpr){.  while(
0b40: 20 70 45 78 70 72 20 26 26 20 28 70 45 78 70 72   pExpr && (pExpr
0b50: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0b60: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0b70: 4b 5f 41 53 29 20 29 7b 0a 20 20 20 20 70 45 78  K_AS) ){.    pEx
0b80: 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pr = pExpr->pLef
0b90: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
0ba0: 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pExpr;.}../*.** 
0bb0: 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 6c 61  Return the colla
0bc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
0bd0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
0be0: 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a 20 74 68   pExpr. If.** th
0bf0: 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65  ere is no define
0c00: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
0c10: 65 6e 63 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ence, return NUL
0c20: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  L..**.** The col
0c30: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
0c40: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
0c50: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
0c60: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
0c70: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
0c80: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
0c90: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
0ca0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
0cb0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
0cc0: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
0cd0: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
0ce0: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
0cf0: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
0d00: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
0d10: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
0d20: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
0d30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0d40: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
0d50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
0d60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
0d70: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
0d80: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
0d90: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
0da0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
0db0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  >op;.    if( op=
0dc0: 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d  =TK_CAST || op==
0dd0: 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20  TK_UPLUS ){.    
0de0: 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a    p = p->pLeft;.
0df0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
0e00: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
0e10: 28 20 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ( op!=TK_REGISTE
0e20: 52 20 7c 7c 20 70 2d 3e 6f 70 32 21 3d 54 4b 5f  R || p->op2!=TK_
0e30: 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 69  COLLATE );.    i
0e40: 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  f( op==TK_COLLAT
0e50: 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  E ){.      if( d
0e60: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
0e70: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
0e80: 74 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20  t report errors 
0e90: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 77 68 69  when parsing whi
0ea0: 6c 65 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f  le the schema */
0eb0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
0ec0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
0ed0: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
0ee0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29   p->u.zToken, 0)
0ef0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
0f00: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
0f10: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
0f20: 28 70 50 61 72 73 65 2c 20 45 4e 43 28 64 62 29  (pParse, ENC(db)
0f30: 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  , 0, p->u.zToken
0f40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
0f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0f60: 20 20 69 66 28 20 70 2d 3e 70 54 61 62 21 3d 30    if( p->pTab!=0
0f70: 0a 20 20 20 20 20 26 26 20 28 6f 70 3d 3d 54 4b  .     && (op==TK
0f80: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  _AGG_COLUMN || o
0f90: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
0fa0: 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b         || op==TK
0fb0: 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d  _REGISTER || op=
0fc0: 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20 20 20  =TK_TRIGGER).   
0fd0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d   ){.      /* op=
0fe0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
0ff0: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
1000: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
1010: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
1020: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1030: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1040: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1050: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1060: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1070: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1080: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1090: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
10a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
10b0: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
10c0: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
10d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
10e0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
10f0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
1100: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1120: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
1130: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
1140: 7b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  {.      if( ALWA
1150: 59 53 28 70 2d 3e 70 4c 65 66 74 29 20 26 26 20  YS(p->pLeft) && 
1160: 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  (p->pLeft->flags
1170: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d   & EP_Collate)!=
1180: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20 3d  0 ){.        p =
1190: 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20   p->pLeft;.     
11a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11b0: 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20  p = p->pRight;. 
11c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
11d0: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
11e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
11f0: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
1200: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
1210: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
1220: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1230: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
1240: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
1250: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
1260: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
1270: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
1280: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
1290: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
12a0: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
12b0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
12c0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
12d0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
12e0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
12f0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
1300: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
1310: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
1320: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1330: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
1340: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
1350: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
1360: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
1370: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
1380: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
1390: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
13a0: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
13b0: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
13c0: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
13d0: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
13e0: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
13f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1400: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1410: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
1420: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
1430: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1440: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1450: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1460: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1470: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1480: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1490: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
14a0: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
14b0: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
14c0: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
14d0: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
14e0: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
14f0: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1500: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
1510: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1520: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1540: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
1550: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
1560: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1570: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1580: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1590: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
15a0: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
15b0: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
15c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
15d0: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
15e0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
15f0: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
1600: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1610: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
1620: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
1630: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
1640: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
1650: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1660: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1670: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1680: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
1690: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
16a0: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
16b0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
16c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
16d0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
16e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
16f0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
1700: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
1710: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
1720: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
1730: 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _NE || pExpr->op
1740: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
1750: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
1760: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1770: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
1780: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
1790: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
17a0: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
17b0: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
17c0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
17d0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
17e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
17f0: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
1800: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1810: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1820: 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66 66 20  ect) ){.    aff 
1830: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
1840: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
1850: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
1860: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
1870: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
1880: 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61 66 66   !aff ){.    aff
1890: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
18a0: 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  NE;.  }.  return
18b0: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70   aff;.}../*.** p
18c0: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
18d0: 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  ison expression,
18e0: 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49   eg. '=', '<', I
18f0: 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69  N(...) etc..** i
1900: 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74  dx_affinity is t
1910: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61  he affinity of a
1920: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
1930: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a  . Return true.**
1940: 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69   if the index wi
1950: 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f  th affinity idx_
1960: 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20  affinity may be 
1970: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1980: 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  t.** the compari
1990: 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f  son in pExpr..*/
19a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
19b0: 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72  xAffinityOk(Expr
19c0: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64   *pExpr, char id
19d0: 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63  x_affinity){.  c
19e0: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
19f0: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
1a00: 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61  pr);.  switch( a
1a10: 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ff ){.    case S
1a20: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a  QLITE_AFF_NONE:.
1a30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1a40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a50: 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
1a60: 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e  return idx_affin
1a70: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
1a80: 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75 6c  TEXT;.    defaul
1a90: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
1aa0: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
1ab0: 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66  Affinity(idx_aff
1ac0: 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  inity);.  }.}../
1ad0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1ae0: 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73 68  P5 value that sh
1af0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
1b00: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
1b10: 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28  ison.** opcode (
1b20: 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63  OP_Eq, OP_Ge etc
1b30: 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  .) used to compa
1b40: 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70 45  re pExpr1 and pE
1b50: 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xpr2..*/.static 
1b60: 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65  u8 binaryCompare
1b70: 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c  P5(Expr *pExpr1,
1b80: 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69   Expr *pExpr2, i
1b90: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
1ba0: 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61 72    u8 aff = (char
1bb0: 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69  )sqlite3ExprAffi
1bc0: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
1bd0: 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69 74 65  aff = (u8)sqlite
1be0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1bf0: 28 70 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20  (pExpr1, aff) | 
1c00: 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a  (u8)jumpIfNull;.
1c10: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
1c20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1c30: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
1c40: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1c50: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
1c60: 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69   used by.** a bi
1c70: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  nary comparison 
1c80: 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69  operator compari
1c90: 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  ng pLeft and pRi
1ca0: 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ght..**.** If th
1cb0: 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72  e left hand expr
1cc0: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
1cd0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1ce0: 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73  type, then it is
1cf0: 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77  .** used. Otherw
1d00: 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ise the collatio
1d10: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
1d20: 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 65 78  he right hand ex
1d30: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75  pression.** is u
1d40: 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61  sed, or the defa
1d50: 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66 20  ult (BINARY) if 
1d60: 6e 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69  neither expressi
1d70: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
1d80: 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a  ng.** type..**.*
1d90: 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69 67 68  * Argument pRigh
1da0: 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65 66 74  t (but not pLeft
1db0: 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c 20  ) may be a null 
1dc0: 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68 69 73  pointer. In this
1dd0: 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20   case,.** it is 
1de0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  not considered..
1df0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
1e00: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
1e10: 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65  CollSeq(.  Parse
1e20: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70   *pParse, .  Exp
1e30: 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70  r *pLeft, .  Exp
1e40: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43  r *pRight.){.  C
1e50: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
1e60: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
1e70: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66  ;.  if( pLeft->f
1e80: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1e90: 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  e ){.    pColl =
1ea0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1eb0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
1ec0: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
1ed0: 70 52 69 67 68 74 20 26 26 20 28 70 52 69 67 68  pRight && (pRigh
1ee0: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1ef0: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
1f00: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1f10: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1f20: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  se, pRight);.  }
1f30: 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  else{.    pColl 
1f40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1f50: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
1f60: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  ft);.    if( !pC
1f70: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
1f80: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1f90: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1fa0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
1fb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
1fc0: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  l;.}../*.** Gene
1fd0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1fe0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1ff0: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
2000: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
2010: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2020: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
2030: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
2040: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
2050: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2060: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
2070: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2080: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2090: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
20a0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
20b0: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
20c0: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
20d0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
20e0: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
20f0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
2100: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
2110: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
2120: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
2130: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
2140: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
2150: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
2160: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
2170: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
2180: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
2190: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
21a0: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
21b0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
21c0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
21d0: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
21e0: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
21f0: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
2200: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
2210: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
2220: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2230: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2240: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
2250: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
2280: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
2290: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
22a0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
22b0: 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74 75 72  (u8)p5);.  retur
22c0: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66 20 53  n addr;.}..#if S
22d0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
22e0: 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65  EPTH>0./*.** Che
22f0: 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  ck that argument
2300: 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73   nHeight is less
2310: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
2320: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a  o the maximum.**
2330: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
2340: 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74  h allowed. If it
2350: 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61   is not, leave a
2360: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2370: 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f  in.** pParse..*/
2380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2390: 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73  CheckHeight(Pars
23a0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
23b0: 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72  Height){.  int r
23c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23d0: 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20   int mxHeight = 
23e0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
23f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
2400: 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69  EXPR_DEPTH];.  i
2410: 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69  f( nHeight>mxHei
2420: 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
2430: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2440: 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72  e, .       "Expr
2450: 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74  ession tree is t
2460: 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75  oo large (maximu
2470: 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78  m depth %d)", mx
2480: 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20  Height.    );.  
2490: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
24a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
24b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  n rc;.}../* The 
24c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
24d0: 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68  functions, heigh
24e0: 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68  tOfExpr(), heigh
24f0: 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  tOfExprList().**
2500: 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c   and heightOfSel
2510: 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20  ect(), are used 
2520: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2530: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a   maximum height.
2540: 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ** of any expres
2550: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
2560: 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75  nced by the stru
2570: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
2580: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
2590: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
25a0: 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69  this maximum hei
25b0: 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ght is greater t
25c0: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
25d0: 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a  value pointed.**
25e0: 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c   to by pnHeight,
25f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
2600: 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20  meter, then set 
2610: 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61  *pnHeight to tha
2620: 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  t.** value..*/.s
2630: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
2640: 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c  tOfExpr(Expr *p,
2650: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
2660: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
2670: 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a  if( p->nHeight>*
2680: 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  pnHeight ){.    
2690: 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d    *pnHeight = p-
26a0: 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a  >nHeight;.    }.
26b0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
26c0: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  d heightOfExprLi
26d0: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
26e0: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
26f0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
2700: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
2710: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
2720: 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68  ++){.      heigh
2730: 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e  tOfExpr(p->a[i].
2740: 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29  pExpr, pnHeight)
2750: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
2760: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
2770: 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  OfSelect(Select 
2780: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
2790: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
27a0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
27b0: 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69  p->pWhere, pnHei
27c0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
27d0: 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  OfExpr(p->pHavin
27e0: 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  g, pnHeight);.  
27f0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2800: 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67  ->pLimit, pnHeig
2810: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2820: 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74  fExpr(p->pOffset
2830: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2840: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2850: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48  t(p->pEList, pnH
2860: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
2870: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
2880: 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67  pGroupBy, pnHeig
2890: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
28a0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  fExprList(p->pOr
28b0: 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29  derBy, pnHeight)
28c0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65  ;.    heightOfSe
28d0: 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20  lect(p->pPrior, 
28e0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
28f0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2900: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
2910: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
2920: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
2930: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
2940: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
2950: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
2960: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
2970: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
2980: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
2990: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
29a0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
29b0: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
29c0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
29d0: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
29e0: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
29f0: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
2a00: 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  s one..*/.static
2a10: 20 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69   void exprSetHei
2a20: 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ght(Expr *p){.  
2a30: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
2a40: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
2a50: 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67  p->pLeft, &nHeig
2a60: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  ht);.  heightOfE
2a70: 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26  xpr(p->pRight, &
2a80: 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20  nHeight);.  if( 
2a90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2aa0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
2ab0: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
2ac0: 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c  Select(p->x.pSel
2ad0: 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ect, &nHeight);.
2ae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 65 69    }else{.    hei
2af0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
2b00: 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67  >x.pList, &nHeig
2b10: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48  ht);.  }.  p->nH
2b20: 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20  eight = nHeight 
2b30: 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  + 1;.}../*.** Se
2b40: 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67  t the Expr.nHeig
2b50: 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e  ht variable usin
2b60: 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69  g the exprSetHei
2b70: 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ght() function. 
2b80: 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74  If.** the height
2b90: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2ba0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   the maximum all
2bb0: 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  owed expression 
2bc0: 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20  depth,.** leave 
2bd0: 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
2be0: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
2bf0: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
2c00: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2c10: 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78 70 72  Expr *p){.  expr
2c20: 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20  SetHeight(p);.  
2c30: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
2c40: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
2c50: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f  ->nHeight);.}../
2c60: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2c70: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
2c80: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
2c90: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
2ca0: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
2cb0: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
2cc0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
2cd0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2ce0: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
2cf0: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
2d00: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
2d10: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
2d20: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
2d30: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
2d40: 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66  ;.}.#else.  #def
2d50: 69 6e 65 20 65 78 70 72 53 65 74 48 65 69 67 68  ine exprSetHeigh
2d60: 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t(y).#endif /* S
2d70: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
2d80: 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  EPTH>0 */../*.**
2d90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2da0: 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61   the core alloca
2db0: 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e 6f 64  tor for Expr nod
2dc0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72  es..**.** Constr
2dd0: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
2de0: 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65  sion node and re
2df0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
2e00: 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a  o it.  Memory.**
2e10: 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 61   for this node a
2e20: 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f 6b 65  nd for the pToke
2e30: 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  n argument is a 
2e40: 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
2e50: 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  n.** obtained fr
2e60: 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
2e70: 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
2e80: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
2e90: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2ea0: 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  r making sure th
2eb0: 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c  e node eventuall
2ec0: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a  y gets freed..**
2ed0: 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69  .** If dequote i
2ee0: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
2ef0: 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20 65 78   token (if it ex
2f00: 69 73 74 73 29 20 69 73 20 64 65 71 75 6f 74 65  ists) is dequote
2f10: 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  d..** If dequote
2f20: 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65   is false, no de
2f30: 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72 66 6f  quoting is perfo
2f40: 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64 65 51  rmance.  The deQ
2f50: 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uote.** paramete
2f60: 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  r is ignored if 
2f70: 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f  pToken is NULL o
2f80: 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20 64  r if the token d
2f90: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61  oes not.** appea
2fa0: 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  r to be quoted. 
2fb0: 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20 77   If the quotes w
2fc0: 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ere of the form 
2fd0: 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75  "..." (double-qu
2fe0: 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68  otes).** then th
2ff0: 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20 66  e EP_DblQuoted f
3000: 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
3010: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  e expression nod
3020: 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c  e..**.** Special
3030: 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54   case:  If op==T
3040: 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70 54  K_INTEGER and pT
3050: 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61  oken points to a
3060: 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20   string that.** 
3070: 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74 65  can be translate
3080: 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74 20  d into a 32-bit 
3090: 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68  integer, then th
30a0: 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a  e token is not.*
30b0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54  * stored in u.zT
30c0: 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20  oken.  Instead, 
30d0: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
30e0: 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  es is written.**
30f0: 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20 61   into u.iValue a
3100: 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  nd the EP_IntVal
3110: 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ue flag is set. 
3120: 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61 67   No extra storag
3130: 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65  e.** is allocate
3140: 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e  d to hold the in
3150: 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20 74  teger text and t
3160: 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67 20  he dequote flag 
3170: 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45  is ignored..*/.E
3180: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
3190: 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65 33  Alloc(.  sqlite3
31a0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
31b0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73   /* Handle for s
31c0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
31d0: 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c  ro() (may be nul
31e0: 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  l) */.  int op, 
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
3210: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
3220: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20  Token *pToken,  
3230: 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d    /* Token argum
3240: 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e  ent.  Might be N
3250: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71  ULL */.  int deq
3260: 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20  uote            
3270: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75   /* True to dequ
3280: 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ote */.){.  Expr
3290: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45   *pNew;.  int nE
32a0: 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20  xtra = 0;.  int 
32b0: 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 69  iValue = 0;..  i
32c0: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
32d0: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45   if( op!=TK_INTE
32e0: 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a  GER || pToken->z
32f0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
3300: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
3310: 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61  (pToken->z, &iVa
3320: 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lue)==0 ){.     
3330: 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e   nExtra = pToken
3340: 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  ->n+1;.      ass
3350: 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29  ert( iValue>=0 )
3360: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
3370: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
3380: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
3390: 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61  eof(Expr)+nExtra
33a0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
33b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  .    pNew->op = 
33c0: 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77  (u8)op;.    pNew
33d0: 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20  ->iAgg = -1;.   
33e0: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
33f0: 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d       if( nExtra=
3400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  =0 ){.        pN
3410: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
3420: 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  IntValue;.      
3430: 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
3440: 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20   = iValue;.     
3450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3460: 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 70  int c;.        p
3470: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
3480: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
3490: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34a0: 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c   pToken->z!=0 ||
34b0: 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b   pToken->n==0 );
34c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f  .        if( pTo
34d0: 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28  ken->n ) memcpy(
34e0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  pNew->u.zToken, 
34f0: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
3500: 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  n->n);.        p
3510: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54  New->u.zToken[pT
3520: 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  oken->n] = 0;.  
3530: 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74        if( dequot
3540: 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33 20 0a  e && nExtra>=3 .
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
3560: 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  ((c = pToken->z[
3570: 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d  0])=='\'' || c==
3580: 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c  '"' || c=='[' ||
3590: 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20 20 20   c=='`') ){.    
35a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
35b0: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
35c0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ken);.          
35d0: 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70 4e 65  if( c=='"' ) pNe
35e0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44  w->flags |= EP_D
35f0: 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20  blQuoted;.      
3600: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3610: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
3620: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
3630: 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20    pNew->nHeight 
3640: 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20  = 1;.#endif  .  
3650: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
3660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
3670: 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  te a new express
3680: 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20  ion node from a 
3690: 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20  zero-terminated 
36a0: 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a  token that has.*
36b0: 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64  * already been d
36c0: 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72  equoted..*/.Expr
36d0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20   *sqlite3Expr(. 
36e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
36f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
3700: 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62  le for sqlite3Db
3710: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61  MallocZero() (ma
3720: 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20  y be null) */.  
3730: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
3740: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
3750: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
3760: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
3770: 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b  oken      /* Tok
3780: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69  en argument.  Mi
3790: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
37a0: 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78  {.  Token x;.  x
37b0: 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78  .z = zToken;.  x
37c0: 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71  .n = zToken ? sq
37d0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
37e0: 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74  oken) : 0;.  ret
37f0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
3800: 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c  lloc(db, op, &x,
3810: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   0);.}../*.** At
3820: 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c  tach subtrees pL
3830: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74  eft and pRight t
3840: 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20  o the Expr node 
3850: 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pRoot..**.** If 
3860: 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74  pRoot==NULL that
3870: 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65   means that a me
3880: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3890: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
38a0: 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  ed..** In that c
38b0: 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ase, delete the 
38c0: 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61  subtrees pLeft a
38d0: 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f  nd pRight..*/.vo
38e0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74  id sqlite3ExprAt
38f0: 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20  tachSubtrees(.  
3900: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45  sqlite3 *db,.  E
3910: 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78  xpr *pRoot,.  Ex
3920: 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70  pr *pLeft,.  Exp
3930: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69  r *pRight.){.  i
3940: 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  f( pRoot==0 ){. 
3950: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
3960: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
3970: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3980: 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b  lete(db, pLeft);
3990: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
39a0: 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68  Delete(db, pRigh
39b0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
39c0: 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20   if( pRight ){. 
39d0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67       pRoot->pRig
39e0: 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  ht = pRight;.   
39f0: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
3a00: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26 20  |= EP_Collate & 
3a10: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20  pRight->flags;. 
3a20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
3a30: 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ft ){.      pRoo
3a40: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  t->pLeft = pLeft
3a50: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66  ;.      pRoot->f
3a60: 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61  lags |= EP_Colla
3a70: 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67  te & pLeft->flag
3a80: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70  s;.    }.    exp
3a90: 72 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74  rSetHeight(pRoot
3aa0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3ab0: 41 6c 6c 6f 63 61 74 65 20 61 20 45 78 70 72 20  Allocate a Expr 
3ac0: 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73  node which joins
3ad0: 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20   as many as two 
3ae0: 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20  subtrees..**.** 
3af0: 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  One or both of t
3b00: 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20  he subtrees can 
3b10: 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e  be NULL.  Return
3b20: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3b30: 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f  e new.** Expr no
3b40: 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f  de.  Or, if an O
3b50: 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
3b60: 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d   set pParse->db-
3b70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a  >mallocFailed,.*
3b80: 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72  * free the subtr
3b90: 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ees and return N
3ba0: 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ULL..*/.Expr *sq
3bb0: 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61  lite3PExpr(.  Pa
3bc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3bd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
3be0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
3bf0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
3c00: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
3c10: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
3c20: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
3c30: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20          /* Left 
3c40: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
3c50: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20  r *pRight,      
3c60: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70       /* Right op
3c70: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
3c80: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20   Token *pToken  
3c90: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
3ca0: 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  oken */.){.  Exp
3cb0: 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r *p;.  if( op==
3cc0: 54 4b 5f 41 4e 44 20 26 26 20 70 4c 65 66 74 20  TK_AND && pLeft 
3cd0: 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  && pRight ){.   
3ce0: 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61   /* Take advanta
3cf0: 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63  ge of short-circ
3d00: 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69  uit false optimi
3d10: 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a  zation for AND *
3d20: 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  /.    p = sqlite
3d30: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3d40: 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  >db, pLeft, pRig
3d50: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
3d60: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
3d70: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
3d80: 62 2c 20 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31  b, op, pToken, 1
3d90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3da0: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
3db0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20  (pParse->db, p, 
3dc0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
3dd0: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a    }.  if( p ) {.
3de0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
3df0: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
3e00: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
3e10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
3e20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3e30: 31 20 69 66 20 61 6e 20 65 78 70 72 65 73 73 69  1 if an expressi
3e40: 6f 6e 20 6d 75 73 74 20 62 65 20 46 41 4c 53 45  on must be FALSE
3e50: 20 69 6e 20 61 6c 6c 20 63 61 73 65 73 20 61 6e   in all cases an
3e60: 64 20 30 20 69 66 20 74 68 65 0a 2a 2a 20 65 78  d 0 if the.** ex
3e70: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
3e80: 65 20 74 72 75 65 2e 20 20 54 68 69 73 20 69 73  e true.  This is
3e90: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
3ea0: 2e 20 20 49 66 20 69 73 20 4f 4b 20 74 6f 0a 2a  .  If is OK to.*
3eb0: 2a 20 72 65 74 75 72 6e 20 30 20 68 65 72 65 20  * return 0 here 
3ec0: 65 76 65 6e 20 69 66 20 74 68 65 20 65 78 70 72  even if the expr
3ed0: 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73  ession really is
3ee0: 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 28 61   always false (a
3ef0: 20 0a 2a 2a 20 66 61 6c 73 65 20 6e 65 67 61 74   .** false negat
3f00: 69 76 65 29 2e 20 20 42 75 74 20 69 74 20 69 73  ive).  But it is
3f10: 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e   a bug to return
3f20: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
3f30: 73 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 62 65  sion.** might be
3f40: 20 74 72 75 65 20 69 6e 20 73 6f 6d 65 20 72 61   true in some ra
3f50: 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  re circumstances
3f60: 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69   (a false positi
3f70: 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ve.).**.** Note 
3f80: 74 68 61 74 20 69 66 20 74 68 65 20 65 78 70 72  that if the expr
3f90: 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  ession is part o
3fa0: 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f  f conditional fo
3fb0: 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e  r a.** LEFT JOIN
3fc0: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74  , then we cannot
3fd0: 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f   determine at co
3fe0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
3ff0: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20  er or not.** is 
4000: 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  it true or false
4010: 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75  , so always retu
4020: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
4030: 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 46 61  int exprAlwaysFa
4040: 6c 73 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  lse(Expr *p){.  
4050: 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28  int v = 0;.  if(
4060: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4070: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
4080: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4090: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
40a0: 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20  sInteger(p, &v) 
40b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
40c0: 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  turn v==0;.}../*
40d0: 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70  .** Join two exp
40e0: 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61  ressions using a
40f0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20  n AND operator. 
4100: 20 49 66 20 65 69 74 68 65 72 20 65 78 70 72 65   If either expre
4110: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c  ssion is.** NULL
4120: 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
4130: 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  rn the other exp
4140: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ression..**.** I
4150: 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  f one side or th
4160: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41  e other of the A
4170: 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62  ND is known to b
4180: 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  e false, then in
4190: 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75  stead.** of retu
41a0: 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70  rning an AND exp
41b0: 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65  ression, just re
41c0: 74 75 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20  turn a constant 
41d0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a  expression with.
41e0: 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61  ** a value of fa
41f0: 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  lse..*/.Expr *sq
4200: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c  lite3ExprAnd(sql
4210: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
4220: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
4230: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66  ght){.  if( pLef
4240: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
4250: 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c  rn pRight;.  }el
4260: 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30  se if( pRight==0
4270: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
4280: 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Left;.  }else if
4290: 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  ( exprAlwaysFals
42a0: 65 28 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72  e(pLeft) || expr
42b0: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52 69 67  AlwaysFalse(pRig
42c0: 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ht) ){.    sqlit
42d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
42e0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c   pLeft);.    sql
42f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
4300: 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  b, pRight);.    
4310: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
4320: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
4330: 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33  NTEGER, &sqlite3
4340: 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29  IntTokens[0], 0)
4350: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45  ;.  }else{.    E
4360: 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
4370: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
4380: 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a   TK_AND, 0, 0);.
4390: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
43a0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 64 62  ttachSubtrees(db
43b0: 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70  , pNew, pLeft, p
43c0: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
43d0: 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a  rn pNew;.  }.}..
43e0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
43f0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
4400: 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63   node for a func
4410: 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70  tion with multip
4420: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  le.** arguments.
4430: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
4440: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61  3ExprFunction(Pa
4450: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
4460: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  rList *pList, To
4470: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
4480: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71  Expr *pNew;.  sq
4490: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
44a0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
44b0: 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e  ( pToken );.  pN
44c0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
44d0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e  Alloc(db, TK_FUN
44e0: 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31  CTION, pToken, 1
44f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
4500: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4510: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
4520: 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f  , pList); /* Avo
4530: 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77  id memory leak w
4540: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
4550: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
4560: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e  ;.  }.  pNew->x.
4570: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
4580: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
4590: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
45a0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
45b0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  .  sqlite3ExprSe
45c0: 74 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  tHeight(pParse, 
45d0: 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
45e0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pNew;.}../*.** A
45f0: 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65  ssign a variable
4600: 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78   number to an ex
4610: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e  pression that en
4620: 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64  codes a wildcard
4630: 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69  .** in the origi
4640: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
4650: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  t.  .**.** Wildc
4660: 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20  ards consisting 
4670: 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20  of a single "?" 
4680: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
4690: 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c   next sequential
46a0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  .** variable num
46b0: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  ber..**.** Wildc
46c0: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
46d0: 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69   "?nnn" are assi
46e0: 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20  gned the number 
46f0: 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a  "nnn".  We make.
4700: 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73  ** sure "nnn" is
4710: 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61   not too be to a
4720: 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66  void a denial of
4730: 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20   service attack 
4740: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  when.** the SQL 
4750: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20  statement comes 
4760: 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
4770: 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57   source..**.** W
4780: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
4790: 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61  form ":aaa", "@a
47a0: 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61  aa", or "$aaa" a
47b0: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
47c0: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
47d0: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
47e0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
47f0: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
4800: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
4810: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
4820: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
4830: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
4840: 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20  uenial variable 
4850: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
4860: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
4870: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
4880: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
4890: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
48a0: 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Expr){.  sqlite3
48b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
48c0: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
48d0: 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  *z;..  if( pExpr
48e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
48f0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
4900: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
4910: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
4920: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
4930: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
4940: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
4950: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
4960: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
4970: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  0]!=0 );.  if( z
4980: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
4990: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
49a0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
49b0: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
49c0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
49d0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
49e0: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70  ='?' );.    pExp
49f0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
4a00: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
4a10: 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Var);.  }else{. 
4a20: 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a     ynVar x = 0;.
4a30: 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69      u32 n = sqli
4a40: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
4a50: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
4a60: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
4a70: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
4a80: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
4a90: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
4aa0: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
4ab0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
4ac0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
4ad0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
4ae0: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
4af0: 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f   = 0==sqlite3Ato
4b00: 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e  i64(&z[1], &i, n
4b10: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  -1, SQLITE_UTF8)
4b20: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
4b30: 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e  Column = x = (yn
4b40: 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73  Var)i;.      tes
4b50: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
4b60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4b70: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
4b80: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
4b90: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
4ba0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
4bb0: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  R]-1 );.      te
4bc0: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
4bd0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
4be0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
4bf0: 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ER] );.      if(
4c00: 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c   bOk==0 || i<1 |
4c10: 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  | i>db->aLimit[S
4c20: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
4c30: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
4c40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
4c50: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4c60: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
4c70: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
4c80: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
4c90: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c            db->aL
4ca0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
4cb0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
4cc0: 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  R]);.        x =
4cd0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
4ce0: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
4cf0: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nVar ){.        
4d00: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28  pParse->nVar = (
4d10: 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  int)i;.      }. 
4d20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4d30: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b  /* Wildcards lik
4d40: 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22  e ":aaa", "$aaa"
4d50: 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75   or "@aaa".  Reu
4d60: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
4d70: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75  able.      ** nu
4d80: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
4d90: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
4da0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
4db0: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
4dc0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72      ** has never
4dd0: 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65   appeared before
4de0: 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  , reuse the same
4df0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4e00: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4e10: 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66  ynVar i;.      f
4e20: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
4e30: 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  ->nzVar; i++){. 
4e40: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
4e50: 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 6d  e->azVar[i] && m
4e60: 65 6d 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a  emcmp(pParse->az
4e70: 56 61 72 5b 69 5d 2c 7a 2c 6e 2b 31 29 3d 3d 30  Var[i],z,n+1)==0
4e80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
4e90: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78  xpr->iColumn = x
4ea0: 20 3d 20 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20   = (ynVar)i+1;. 
4eb0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4ec0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4ed0: 7d 0a 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30  }.      if( x==0
4ee0: 20 29 20 78 20 3d 20 70 45 78 70 72 2d 3e 69 43   ) x = pExpr->iC
4ef0: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28  olumn = (ynVar)(
4f00: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
4f10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78  .    }.    if( x
4f20: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
4f30: 78 3e 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20  x>pParse->nzVar 
4f40: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
4f50: 2a 2a 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d  **a;.        a =
4f60: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
4f70: 63 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a  c(db, pParse->az
4f80: 56 61 72 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b  Var, x*sizeof(a[
4f90: 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  0]));.        if
4fa0: 28 20 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( a==0 ) return;
4fb0: 20 20 2f 2a 20 45 72 72 6f 72 20 72 65 70 6f 72    /* Error repor
4fc0: 74 65 64 20 74 68 72 6f 75 67 68 20 64 62 2d 3e  ted through db->
4fd0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a  mallocFailed */.
4fe0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4ff0: 61 7a 56 61 72 20 3d 20 61 3b 0a 20 20 20 20 20  azVar = a;.     
5000: 20 20 20 6d 65 6d 73 65 74 28 26 61 5b 70 50 61     memset(&a[pPa
5010: 72 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20  rse->nzVar], 0, 
5020: 28 78 2d 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72  (x-pParse->nzVar
5030: 29 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b  )*sizeof(a[0]));
5040: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
5050: 3e 6e 7a 56 61 72 20 3d 20 78 3b 0a 20 20 20 20  >nzVar = x;.    
5060: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b    }.      if( z[
5070: 30 5d 21 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73  0]!='?' || pPars
5080: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30  e->azVar[x-1]==0
5090: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
50a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 50  te3DbFree(db, pP
50b0: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d  arse->azVar[x-1]
50c0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
50d0: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20  e->azVar[x-1] = 
50e0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
50f0: 28 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  (db, z, n);.    
5100: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20    }.    }.  } . 
5110: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45   if( !pParse->nE
5120: 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56  rr && pParse->nV
5130: 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  ar>db->aLimit[SQ
5140: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
5150: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20  BLE_NUMBER] ){. 
5160: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5170: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
5180: 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c  many SQL variabl
5190: 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  es");.  }.}../*.
51a0: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64  ** Recursively d
51b0: 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73  elete an express
51c0: 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  ion tree..*/.voi
51d0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
51e0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
51f0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5200: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
5210: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
5220: 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  k: Assert that t
5230: 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e  he IntValue is n
5240: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69  on-negative if i
5250: 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73  t exists */.  as
5260: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5270: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
5280: 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69  Value) || p->u.i
5290: 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66  Value>=0 );.  if
52a0: 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
52b0: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
52c0: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 73 71  nOnly) ){.    sq
52d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
52e0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
52f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5300: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67  lete(db, p->pRig
5310: 68 74 29 3b 0a 20 20 20 20 69 66 28 20 21 45 78  ht);.    if( !Ex
5320: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5330: 20 45 50 5f 52 65 64 75 63 65 64 29 20 26 26 20   EP_Reduced) && 
5340: 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32  (p->flags2 & EP2
5350: 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 21  _MallocedToken)!
5360: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
5370: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
5380: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
5390: 7d 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  }.    if( ExprHa
53a0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
53b0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
53c0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
53d0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
53e0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  .pSelect);.    }
53f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
5400: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
5410: 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  e(db, p->x.pList
5420: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
5430: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
5440: 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63  rty(p, EP_Static
5450: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
5460: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
5470: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
5480: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
5490: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
54a0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
54b0: 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a  ion structure .*
54c0: 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
54d0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
54e0: 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f  This is always o
54f0: 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53  ne of EXPR_FULLS
5500: 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44  IZE,.** EXPR_RED
5510: 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52  UCEDSIZE or EXPR
5520: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a  _TOKENONLYSIZE..
5530: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
5540: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
5550: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70  r *p){.  if( Exp
5560: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5570: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20  EP_TokenOnly) ) 
5580: 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45  return EXPR_TOKE
5590: 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28  NONLYSIZE;.  if(
55a0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
55b0: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20  (p, EP_Reduced) 
55c0: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45  ) return EXPR_RE
55d0: 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74  DUCEDSIZE;.  ret
55e0: 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  urn EXPR_FULLSIZ
55f0: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E;.}../*.** The 
5600: 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29  dupedExpr*Size()
5610: 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72   routines each r
5620: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5630: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
5640: 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61  ed.** to store a
5650: 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72   copy of an expr
5660: 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73  ession or expres
5670: 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79  sion tree.  They
5680: 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f   differ in.** ho
5690: 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72  w much of the tr
56a0: 65 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a  ee is measured..
56b0: 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  **.**     dupedE
56c0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
56d0: 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79      Size of only
56e0: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
56f0: 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65  ure .**     dupe
5700: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20  dExprNodeSize() 
5710: 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78        Size of Ex
5720: 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74  pr + space for t
5730: 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65  oken.**     dupe
5740: 64 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20  dExprSize()     
5750: 20 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b        Expr + tok
5760: 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d  en + subtree com
5770: 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a  ponents.**.*****
5780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
57c0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
57d0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
57e0: 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Size() function 
57f0: 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75  returns two valu
5800: 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65  es OR-ed togethe
5810: 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20  r:  .** (1) the 
5820: 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
5830: 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  or a copy of the
5840: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
5850: 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29  only and .** (2)
5860: 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67   the EP_xxx flag
5870: 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20  s that indicate 
5880: 77 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75  what the structu
5890: 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62  re size should b
58a0: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
58b0: 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79   values is alway
58c0: 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  s one of:.**.** 
58d0: 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49       EXPR_FULLSI
58e0: 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ZE.**      EXPR_
58f0: 52 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20  REDUCEDSIZE   | 
5900: 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20  EP_Reduced.**   
5910: 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c     EXPR_TOKENONL
5920: 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e  YSIZE | EP_Token
5930: 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  Only.**.** The s
5940: 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63  ize of the struc
5950: 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  ture can be foun
5960: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
5970: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
5980: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
5990: 20 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68   with 0xfff.  Th
59a0: 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66  e flags can be f
59b0: 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20  ound by masking 
59c0: 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  the.** return va
59d0: 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75  lue with EP_Redu
59e0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
59f0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
5a00: 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58  t with flags==EX
5a10: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68  PRDUP_REDUCE, th
5a20: 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b  is routines work
5a30: 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a  s on full-size.*
5a40: 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78  * (unreduced) Ex
5a50: 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68  pr objects as th
5a60: 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79  ey or originally
5a70: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
5a80: 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44  the parser..** D
5a90: 75 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  uring expression
5aa0: 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61   analysis, extra
5ab0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
5ac0: 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76  computed and mov
5ad0: 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72  ed into.** later
5ae0: 20 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78   parts of teh Ex
5af0: 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  pr object and th
5b00: 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  at extra informa
5b10: 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63  tion might get c
5b20: 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66  hopped.** off if
5b30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5b40: 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74  is reduced.  Not
5b50: 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64  e also that it d
5b60: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a  oes not work to.
5b70: 2a 2a 20 6d 61 6b 65 20 61 20 45 58 50 52 44 55  ** make a EXPRDU
5b80: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
5b90: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
5ba0: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
5bb0: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
5bc0: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
5bd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5be0: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
5bf0: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
5c00: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
5c10: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
5c20: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
5c30: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
5c40: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
5c50: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
5c60: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
5c70: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5c80: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5c90: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
5ca0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
5cb0: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
5cc0: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
5cd0: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
5ce0: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
5cf0: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
5d00: 6f 77 65 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d  owed */.  if( 0=
5d10: 3d 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f  =(flags&EXPRDUP_
5d20: 52 45 44 55 43 45 29 20 29 7b 0a 20 20 20 20 6e  REDUCE) ){.    n
5d30: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
5d40: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
5d50: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
5d60: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
5d70: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
5d80: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
5d90: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
5da0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5db0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20  _FromJoin) ); . 
5dc0: 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66     assert( (p->f
5dd0: 6c 61 67 73 32 20 26 20 45 50 32 5f 4d 61 6c 6c  lags2 & EP2_Mall
5de0: 6f 63 65 64 54 6f 6b 65 6e 29 3d 3d 30 20 29 3b  ocedToken)==0 );
5df0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d  .    assert( (p-
5e00: 3e 66 6c 61 67 73 32 20 26 20 45 50 32 5f 49 72  >flags2 & EP2_Ir
5e10: 72 65 64 75 63 69 62 6c 65 29 3d 3d 30 20 29 3b  reducible)==0 );
5e20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66  .    if( p->pLef
5e30: 74 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 20 7c  t || p->pRight |
5e40: 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  | p->x.pList ){.
5e50: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
5e60: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c  PR_REDUCEDSIZE |
5e70: 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20   EP_Reduced;.   
5e80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
5e90: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
5ea0: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
5eb0: 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20  kenOnly;.    }. 
5ec0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a   }.  return nSiz
5ed0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
5ee0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
5ef0: 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62  s the space in b
5f00: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
5f10: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
5f20: 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20  .** of the Expr 
5f30: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
5f40: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
5f50: 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  .u.zToken string
5f60: 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72   (if that.** str
5f70: 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29  ing is defined.)
5f80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
5f90: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
5fa0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
5fb0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
5fc0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
5fd0: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
5fe0: 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28  ) & 0xfff;.  if(
5ff0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
6000: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
6010: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
6020: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
6030: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6040: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b  (p->u.zToken)+1;
6050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f  .  }.  return RO
6060: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a  UND8(nByte);.}..
6070: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6080: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
6090: 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65   required to cre
60a0: 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ate a duplicate 
60b0: 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  of the .** expre
60c0: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
60d0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
60e0: 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  nt. The second a
60f0: 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
6100: 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mask containing 
6110: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
6120: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  s..**.** The val
6130: 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  ue returned incl
6140: 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72  udes space to cr
6150: 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
6160: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a  he Expr struct.*
6170: 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65  * itself and the
6180: 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64   buffer referred
6190: 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54   to by Expr.u.zT
61a0: 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a  oken, if any..**
61b0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
61c0: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
61d0: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
61e0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63  return value inc
61f0: 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20  ludes .** space 
6200: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c  to duplicate all
6210: 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74   Expr nodes in t
6220: 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62  he tree formed b
6230: 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a  y Expr.pLeft .**
6240: 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74   and Expr.pRight
6250: 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20   variables (but 
6260: 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75  not for any stru
6270: 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74  ctures pointed t
6280: 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64  o or .** descend
6290: 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  ed from the Expr
62a0: 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72  .x.pList or Expr
62b0: 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61  .x.pSelect varia
62c0: 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  bles)..*/.static
62d0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69   int dupedExprSi
62e0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
62f0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
6300: 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  yte = 0;.  if( p
6310: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
6320: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
6330: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
6340: 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44   if( flags&EXPRD
6350: 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20  UP_REDUCE ){.   
6360: 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65     nByte += dupe
6370: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65  dExprSize(p->pLe
6380: 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70  ft, flags) + dup
6390: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52  edExprSize(p->pR
63a0: 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ight, flags);.  
63b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
63c0: 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nByte;.}../*.**
63d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
63e0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
63f0: 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65  ite3ExprDup(), e
6400: 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a  xcept that if pz
6410: 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f  Buffer .** is no
6420: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42  t NULL then *pzB
6430: 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64  uffer is assumed
6440: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
6450: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
6460: 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  gh .** to store 
6470: 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72  the copy of expr
6480: 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f  ession p, the co
6490: 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f  pies of p->u.zTo
64a0: 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69  ken.** (if appli
64b0: 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20  cable), and the 
64c0: 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d  copies of the p-
64d0: 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52  >pLeft and p->pR
64e0: 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ight expressions
64f0: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66  ,.** if any. Bef
6500: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
6510: 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20  pzBuffer is set 
6520: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
6530: 65 20 70 61 73 73 65 64 20 74 68 65 0a 2a 2a 20  e passed the.** 
6540: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  portion of the b
6550: 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74  uffer copied int
6560: 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  o by this functi
6570: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  on..*/.static Ex
6580: 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69  pr *exprDup(sqli
6590: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
65a0: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 75 38 20  , int flags, u8 
65b0: 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45  **pzBuffer){.  E
65c0: 78 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20  xpr *pNew = 0;  
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
65f0: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20  return */.  if( 
6600: 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  p ){.    const i
6610: 6e 74 20 69 73 52 65 64 75 63 65 64 20 3d 20 28  nt isReduced = (
6620: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
6630: 44 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a  DUCE);.    u8 *z
6640: 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20 73  Alloc;.    u32 s
6650: 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a  taticFlag = 0;..
6660: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42 75      assert( pzBu
6670: 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64  ffer==0 || isRed
6680: 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  uced );..    /* 
6690: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
66a0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
66b0: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
66c0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a 42  . */.    if( pzB
66d0: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 7a  uffer ){.      z
66e0: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
66f0: 72 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 46  r;.      staticF
6700: 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b  lag = EP_Static;
6710: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6720: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
6730: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
6740: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
6750: 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20 20 20  p, flags));.    
6760: 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 45 78  }.    pNew = (Ex
6770: 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20  pr *)zAlloc;..  
6780: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
6790: 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53      /* Set nNewS
67a0: 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
67b0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
67c0: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
67d0: 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ted to.      ** 
67e0: 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73  by pNew. This is
67f0: 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c   either EXPR_FUL
6800: 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55  LSIZE, EXPR_REDU
6810: 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 20  CEDSIZE or.     
6820: 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   ** EXPR_TOKENON
6830: 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69  LYSIZE. nToken i
6840: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
6850: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e  ber of bytes con
6860: 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  sumed.      ** b
6870: 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  y the copy of th
6880: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
6890: 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20  ring (if any).. 
68a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
68b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74  nst unsigned nSt
68c0: 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64  ructSize = duped
68d0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
68e0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  , flags);.      
68f0: 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69  const int nNewSi
6900: 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  ze = nStructSize
6910: 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 20 20   & 0xfff;.      
6920: 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  int nToken;.    
6930: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
6940: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
6950: 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
6960: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  Token ){.       
6970: 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65   nToken = sqlite
6980: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
6990: 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20  Token) + 1;.    
69a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
69b0: 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20   nToken = 0;.   
69c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
69d0: 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20 20  sReduced ){.    
69e0: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
69f0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6a00: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
6a10: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
6a20: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53  zAlloc, p, nNewS
6a30: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
6a40: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
6a50: 53 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75 63  Size = exprStruc
6a60: 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20  tSize(p);.      
6a70: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
6a80: 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20   p, nSize);.    
6a90: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c      memset(&zAll
6aa0: 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58  oc[nSize], 0, EX
6ab0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a  PR_FULLSIZE-nSiz
6ac0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
6ad0: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50     /* Set the EP
6ae0: 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b  _Reduced, EP_Tok
6af0: 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53  enOnly, and EP_S
6b00: 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72  tatic flags appr
6b10: 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  opriately. */.  
6b20: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
6b30: 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c  &= ~(EP_Reduced|
6b40: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
6b50: 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20 70  Static);.      p
6b60: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53  New->flags |= nS
6b70: 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f  tructSize & (EP_
6b80: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
6b90: 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70 4e 65  Only);.      pNe
6ba0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74  w->flags |= stat
6bb0: 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20 2f  icFlag;..      /
6bc0: 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e  * Copy the p->u.
6bd0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69  zToken string, i
6be0: 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20 20  f any. */.      
6bf0: 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( nToken ){.  
6c00: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b        char *zTok
6c10: 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f  en = pNew->u.zTo
6c20: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41  ken = (char*)&zA
6c30: 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a  lloc[nNewSize];.
6c40: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
6c50: 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  Token, p->u.zTok
6c60: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
6c70: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
6c80: 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e  0==((p->flags|pN
6c90: 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50 5f  ew->flags) & EP_
6ca0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
6cb0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
6cc0: 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65   the pNew->x.pSe
6cd0: 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e  lect or pNew->x.
6ce0: 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f  pList member. */
6cf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
6d00: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6d10: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
6d20: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6d30: 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  >x.pSelect = sql
6d40: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
6d50: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  , p->x.pSelect, 
6d60: 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20  isReduced);.    
6d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6d80: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
6d90: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
6da0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78  ListDup(db, p->x
6db0: 2e 70 4c 69 73 74 2c 20 69 73 52 65 64 75 63 65  .pList, isReduce
6dc0: 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d);.        }.  
6dd0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
6de0: 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c  Fill in pNew->pL
6df0: 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52  eft and pNew->pR
6e00: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ight. */.      i
6e10: 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f  f( ExprHasAnyPro
6e20: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
6e30: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
6e40: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
6e50: 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45  zAlloc += dupedE
6e60: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
6e70: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69  lags);.        i
6e80: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
6e90: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
6ea0: 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ced) ){.        
6eb0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
6ec0: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
6ed0: 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45  Left, EXPRDUP_RE
6ee0: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
6ef0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6f00: 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70  pRight = exprDup
6f10: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
6f20: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
6f30: 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  &zAlloc);.      
6f40: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
6f50: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
6f60: 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20        *pzBuffer 
6f70: 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  = zAlloc;.      
6f80: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
6f90: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
6fa0: 6c 61 67 73 32 20 3d 20 30 3b 0a 20 20 20 20 20  lags2 = 0;.     
6fb0: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41     if( !ExprHasA
6fc0: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
6fd0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
6fe0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
6ff0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
7000: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
7010: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ft, 0);.        
7020: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
7030: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7040: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30  db, p->pRight, 0
7050: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7060: 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d 0a     }..    }.  }.
7070: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7080: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
7090: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
70a0: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
70b0: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
70c0: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
70d0: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
70e0: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
70f0: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
7100: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
7110: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
7120: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
7130: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
7140: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
7150: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
7160: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
7170: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
7180: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
7190: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
71a0: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
71b0: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
71c0: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
71d0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
71e0: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
71f0: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
7200: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
7210: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
7220: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
7230: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
7240: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
7250: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
7260: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
7270: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
7280: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
7290: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ted..**.** The f
72a0: 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63  lags parameter c
72b0: 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e  ontains a combin
72c0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50  ation of the EXP
72d0: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
72e0: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
72f0: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
7300: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73   set, then the s
7310: 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
7320: 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61  d is a.** trunca
7330: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ted version of t
7340: 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74  he usual Expr st
7350: 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
7360: 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a  l be stored as.*
7370: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  * part of the in
7380: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
7390: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
73a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
73b0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
73c0: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
73d0: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
73e0: 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75 72   flags){.  retur
73f0: 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c  n exprDup(db, p,
7400: 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45 78   flags, 0);.}.Ex
7410: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
7420: 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74  xprListDup(sqlit
7430: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
7440: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7450: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65  .  ExprList *pNe
7460: 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  w;.  struct Expr
7470: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
7480: 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69  , *pOldItem;.  i
7490: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt i;.  if( p==0
74a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
74b0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
74c0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
74d0: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
74e0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
74f0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
7500: 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  iECursor = 0;.  
7510: 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69 20  pNew->nExpr = i 
7520: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  = p->nExpr;.  if
7530: 28 20 28 66 6c 61 67 73 20 26 20 45 58 50 52 44  ( (flags & EXPRD
7540: 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20 29 20  UP_REDUCE)==0 ) 
7550: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45  for(i=1; i<p->nE
7560: 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20 70  xpr; i+=i){}.  p
7570: 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d  New->a = pItem =
7580: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7590: 52 61 77 28 64 62 2c 20 20 69 2a 73 69 7a 65 6f  Raw(db,  i*sizeo
75a0: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
75b0: 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a  if( pItem==0 ){.
75c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
75d0: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
75e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a   return 0;.  } .
75f0: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
7600: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
7610: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
7620: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
7630: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
7640: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
7650: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 70  em->pExpr;.    p
7660: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Item->pExpr = sq
7670: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7680: 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73   pOldExpr, flags
7690: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
76a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
76b0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
76c0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
76d0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
76e0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
76f0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70  b, pOldItem->zSp
7700: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
7710: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
7720: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
7730: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
7740: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d   = 0;.    pItem-
7750: 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 70  >iOrderByCol = p
7760: 4f 6c 64 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42  OldItem->iOrderB
7770: 79 43 6f 6c 3b 0a 20 20 20 20 70 49 74 65 6d 2d  yCol;.    pItem-
7780: 3e 69 41 6c 69 61 73 20 3d 20 70 4f 6c 64 49 74  >iAlias = pOldIt
7790: 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a 20 20 7d 0a  em->iAlias;.  }.
77a0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
77b0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ../*.** If curso
77c0: 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69  rs, triggers, vi
77d0: 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
77e0: 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74  es are all omitt
77f0: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62  ed from.** the b
7800: 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20  uild, then none 
7810: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
7820: 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70   routines, excep
7830: 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65  t for .** sqlite
7840: 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61  3SelectDup(), ca
7850: 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c  n be called. sql
7860: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20  ite3SelectDup() 
7870: 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  is sometimes.** 
7880: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55  called with a NU
7890: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
78a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
78b0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
78c0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
78d0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
78e0: 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  \. || !defined(S
78f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7900: 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71  ERY).SrcList *sq
7910: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
7920: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
7930: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
7940: 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  gs){.  SrcList *
7950: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
7960: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
7970: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7980: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
7990: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
79a0: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
79b0: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
79c0: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
79d0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
79e0: 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65  locRaw(db, nByte
79f0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7a00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7a10: 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65  pNew->nSrc = pNe
7a20: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
7a30: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
7a40: 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  i<p->nSrc; i++){
7a50: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
7a60: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
7a70: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
7a80: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
7a90: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
7aa0: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
7ab0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
7ac0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
7ad0: 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65  Schema = pOldIte
7ae0: 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  m->pSchema;.    
7af0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
7b00: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
7b10: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7b20: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
7b30: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
7b40: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7b50: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7b60: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7b70: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
7b80: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7b90: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7ba0: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
7bb0: 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ewItem->jointype
7bc0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69   = pOldItem->joi
7bd0: 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49  ntype;.    pNewI
7be0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
7bf0: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
7c00: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7c10: 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f  addrFillSub = pO
7c20: 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ldItem->addrFill
7c30: 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Sub;.    pNewIte
7c40: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70  m->regReturn = p
7c50: 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  OldItem->regRetu
7c60: 72 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  rn;.    pNewItem
7c70: 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d  ->isCorrelated =
7c80: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72   pOldItem->isCor
7c90: 72 65 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65  related;.    pNe
7ca0: 77 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  wItem->viaCorout
7cb0: 69 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ine = pOldItem->
7cc0: 76 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a 20 20  viaCoroutine;.  
7cd0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64    pNewItem->zInd
7ce0: 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ex = sqlite3DbSt
7cf0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7d00: 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20  m->zIndex);.    
7d10: 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64  pNewItem->notInd
7d20: 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  exed = pOldItem-
7d30: 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20  >notIndexed;.   
7d40: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65   pNewItem->pInde
7d50: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49  x = pOldItem->pI
7d60: 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d  ndex;.    pTab =
7d70: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
7d80: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
7d90: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
7da0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
7db0: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
7dc0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
7dd0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
7de0: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
7df0: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
7e00: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
7e10: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
7e20: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
7e30: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
7e40: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7e50: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
7e60: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
7e70: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
7e80: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
7e90: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
7ea0: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
7eb0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7ec0: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
7ed0: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
7ee0: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
7ef0: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
7f00: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  w;.  int i;.  if
7f10: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7f20: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
7f30: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7f40: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
7f50: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7f60: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7f70: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
7f80: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
7f90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7fa0: 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69  aw(db, p->nId*si
7fb0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
7fc0: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
7fd0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7fe0: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
7ff0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
8000: 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68    }.  /* Note th
8010: 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73  at because the s
8020: 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  ize of the alloc
8030: 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d  ation for p->a[]
8040: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63   is not.  ** nec
8050: 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72  essarily a power
8060: 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33   of two, sqlite3
8070: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d  IdListAppend() m
8080: 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ay not be called
8090: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70  .  ** on the dup
80a0: 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62  licate created b
80b0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
80c0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
80d0: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
80e0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
80f0: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
8100: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
8110: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
8120: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
8130: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
8140: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
8150: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
8160: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8170: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
8180: 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64  Item->idx = pOld
8190: 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20  Item->idx;.  }. 
81a0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
81b0: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
81c0: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
81d0: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c   *db, Select *p,
81e0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
81f0: 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50  elect *pNew, *pP
8200: 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30  rior;.  if( p==0
8210: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8220: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
8230: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
8240: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
8250: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
8260: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  n 0;.  pNew->pEL
8270: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
8280: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
8290: 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a  pEList, flags);.
82a0: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
82b0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
82c0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c  (db, p->pSrc, fl
82d0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  ags);.  pNew->pW
82e0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
82f0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
8300: 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ere, flags);.  p
8310: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
8320: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8330: 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  up(db, p->pGroup
8340: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  By, flags);.  pN
8350: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
8360: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
8370: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
8380: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  gs);.  pNew->pOr
8390: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
83a0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
83b0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67  ->pOrderBy, flag
83c0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  s);.  pNew->op =
83d0: 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e   p->op;.  pNew->
83e0: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20  pPrior = pPrior 
83f0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
8400: 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  up(db, p->pPrior
8410: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
8420: 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d  pPrior ) pPrior-
8430: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
8440: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
8450: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
8460: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8470: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  p(db, p->pLimit,
8480: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
8490: 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74  >pOffset = sqlit
84a0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
84b0: 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29  >pOffset, flags)
84c0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
84d0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f   = 0;.  pNew->iO
84e0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65  ffset = 0;.  pNe
84f0: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  w->selFlags = p-
8500: 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f  >selFlags & ~SF_
8510: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
8520: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
8530: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61  t = 0;.  pNew->a
8540: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
8550: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
8560: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
8570: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
8580: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
8590: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
85a0: 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a  }.#else.Select *
85b0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
85c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
85d0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  lect *p, int fla
85e0: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  gs){.  assert( p
85f0: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
8600: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  0;.}.#endif.../*
8610: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
8620: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
8630: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
8640: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
8650: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
8660: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
8670: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
8680: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
8690: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
86a0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
86b0: 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65  curs, the entire
86c0: 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20 61   list is freed a
86d0: 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  nd.** NULL is re
86e0: 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d  turned.  If non-
86f0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
8700: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
8710: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20  ranteed.** that 
8720: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61  the new entry wa
8730: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  s successfully a
8740: 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72  ppended..*/.Expr
8750: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
8760: 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  rListAppend(.  P
8770: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8780: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
8790: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
87a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
87b0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
87c0: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
87d0: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
87e0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
87f0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r             /*
8800: 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   Expression to b
8810: 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68  e appended. Migh
8820: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
8830: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8840: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
8850: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
8860: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
8870: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
8880: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  , sizeof(ExprLis
8890: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
88a0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
88b0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
88c0: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
88d0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
88e0: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
88f0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
8900: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d     if( pList->a=
8910: 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
8920: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
8930: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70  List->nExpr & (p
8940: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d  List->nExpr-1))=
8950: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
8960: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8970: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
8980: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
8990: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33  .    a = sqlite3
89a0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
89b0: 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
89c0: 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c  Expr*2*sizeof(pL
89d0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
89e0: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
89f0: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
8a00: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
8a10: 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73  >a = a;.  }.  as
8a20: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
8a30: 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a  0 );.  if( 1 ){.
8a40: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
8a50: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
8a60: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
8a70: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
8a80: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
8a90: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
8aa0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
8ab0: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
8ac0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
8ad0: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
8ae0: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
8af0: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
8b00: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
8b10: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
8b20: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
8b30: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
8b40: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
8b50: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
8b60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
8b70: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
8b80: 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66  zName element of
8b90: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8ba0: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
8bb0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
8bc0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
8bd0: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
8be0: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
8bf0: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
8c00: 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76  pName should nev
8c10: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
8c20: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
8c30: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
8c40: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
8c50: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
8c60: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
8c70: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
8c80: 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72  stSetName(.  Par
8c90: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8ca0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
8cb0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8cc0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
8cd0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
8ce0: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
8cf0: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   span. */.  Toke
8d00: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
8d10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62      /* Name to b
8d20: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
8d30: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
8d40: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
8d50: 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74  cause the name t
8d60: 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f  o be dequoted */
8d70: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  .){.  assert( pL
8d80: 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ist!=0 || pParse
8d90: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8da0: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
8db0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
8dc0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
8dd0: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
8de0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
8df0: 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  r>0 );.    pItem
8e00: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
8e10: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
8e20: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
8e30: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20  >zName==0 );.   
8e40: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
8e50: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
8e60: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
8e70: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
8e80: 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74  ;.    if( dequot
8e90: 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  e && pItem->zNam
8ea0: 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f  e ) sqlite3Dequo
8eb0: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
8ec0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
8ed0: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
8ee0: 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e  a[].zSpan elemen
8ef0: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
8f00: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
8f10: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
8f20: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
8f30: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
8f40: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
8f50: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
8f60: 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64  But pSpan should
8f70: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
8f80: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
8f90: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
8fa0: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
8fb0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
8fc0: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
8fd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
8fe0: 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20  prListSetSpan(. 
8ff0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9000: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9010: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9020: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9030: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
9040: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
9050: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
9060: 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20  ExprSpan *pSpan 
9070: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
9080: 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20  pan to be added 
9090: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
90a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
90b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
90c0: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
90d0: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
90e0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
90f0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9100: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
9110: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
9120: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
9130: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
9140: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  xpr>0 );.    ass
9150: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
9160: 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e  ailed || pItem->
9170: 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45  pExpr==pSpan->pE
9180: 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  xpr );.    sqlit
9190: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
91a0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
91b0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
91c0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
91d0: 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e  db, (char*)pSpan
91e0: 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20  ->zStart,.      
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
9210: 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20  nt)(pSpan->zEnd 
9220: 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29  - pSpan->zStart)
9230: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9240: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9250: 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f  n list pEList co
9260: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
9270: 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73   iLimit elements
9280: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
9290: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
92a0: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
92b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
92c0: 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72  eckLength(.  Par
92d0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
92e0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a  prList *pEList,.
92f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
9300: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d  bject.){.  int m
9310: 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  x = pParse->db->
9320: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
9330: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74  MIT_COLUMN];.  t
9340: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
9350: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
9360: 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61  ==mx );.  testca
9370: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
9380: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b  List->nExpr==mx+
9390: 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  1 );.  if( pELis
93a0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
93b0: 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c  pr>mx ){.    sql
93c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
93d0: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
93e0: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
93f0: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
9400: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
9410: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
9420: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  n list..*/.void 
9430: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
9440: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
9450: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
9460: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
9470: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9480: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
9490: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
94a0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
94b0: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70  pList->a!=0 || p
94c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29  List->nExpr==0 )
94d0: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
94e0: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
94f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
9500: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
9510: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9520: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78  e(db, pItem->pEx
9530: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
9540: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
9550: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
9560: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9570: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
9580: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
9590: 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
95a0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
95b0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
95c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  ./*.** These rou
95d0: 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72  tines are Walker
95e0: 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61 6c   callbacks.  Wal
95f0: 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70 6f  ker.u.pi is a po
9600: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69  inter.** to an i
9610: 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65 20 72  nteger.  These r
9620: 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68 65 63  outines are chec
9630: 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  king an expressi
9640: 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20  on to see.** if 
9650: 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  it is a constant
9660: 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e 75  .  Set *Walker.u
9670: 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68 65 20  .pi to 0 if the 
9680: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
9690: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a   not constant..*
96a0: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
96b0: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
96c0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
96d0: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
96e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
96f0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9700: 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  t().**     sqlit
9710: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
9720: 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20 20  NotJoin().**    
9730: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9740: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
9750: 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  ().**.*/.static 
9760: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
9770: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
9780: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
9790: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
97a0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20 33  Walker->u.i is 3
97b0: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
97c0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
97d0: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
97e0: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
97f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
9800: 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69   a join disquali
9810: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
9820: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
9830: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
9840: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
9850: 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  ( pWalker->u.i==
9860: 33 20 26 26 20 45 78 70 72 48 61 73 41 6e 79 50  3 && ExprHasAnyP
9870: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
9880: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
9890: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20     pWalker->u.i 
98a0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
98b0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
98c0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
98d0: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
98e0: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
98f0: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
9900: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
9910: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
9920: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70  ant.    ** and p
9930: 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 2a  Walker->u.i==2 *
9940: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
9950: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
9960: 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  ( pWalker->u.i==
9970: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
9980: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
9990: 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
99a0: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
99b0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
99c0: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
99d0: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
99e0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
99f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9a00: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
9a10: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9a20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
9a30: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
9a40: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
9a50: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
9a60: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
9a70: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
9a80: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
9a90: 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72  );.      pWalker
9aa0: 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20  ->u.i = 0;.     
9ab0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
9ac0: 74 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  t;.    default:.
9ad0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9ae0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
9af0: 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63  LECT ); /* selec
9b00: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20  tNodeIsConstant 
9b10: 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f  will disallow */
9b20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9b30: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
9b40: 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65  XISTS ); /* sele
9b50: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
9b60: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
9b70: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  /.      return W
9b80: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
9b90: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  .}.static int se
9ba0: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
9bb0: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
9bc0: 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  er, Select *NotU
9bd0: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
9be0: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
9bf0: 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  );.  pWalker->u.
9c00: 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  i = 0;.  return 
9c10: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61  WRC_Abort;.}.sta
9c20: 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f  tic int exprIsCo
9c30: 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  nst(Expr *p, int
9c40: 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57 61   initFlag){.  Wa
9c50: 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 75 2e 69 20  lker w;.  w.u.i 
9c60: 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e  = initFlag;.  w.
9c70: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
9c80: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
9c90: 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  nt;.  w.xSelectC
9ca0: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
9cb0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
9cc0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
9cd0: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
9ce0: 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a  rn w.u.i;.}../*.
9cf0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
9d00: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
9d10: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
9d20: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
9d30: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
9d40: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
9d50: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
9d60: 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
9d70: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
9d80: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
9d90: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
9da0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
9db0: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
9dc0: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
9dd0: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
9de0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
9df0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
9e00: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
9e10: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9e20: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
9e30: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
9e40: 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a  Const(p, 1);.}..
9e50: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
9e60: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
9e70: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
9e80: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
9e90: 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64  nstant.** that d
9ea0: 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65  oes no originate
9eb0: 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20   from the ON or 
9ec0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
9ed0: 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75   a join..** Retu
9ee0: 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  rn 0 if it invol
9ef0: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
9f00: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   function calls 
9f10: 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a  or terms from.**
9f20: 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   an ON or USING 
9f30: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  clause..*/.int s
9f40: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
9f50: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72  tantNotJoin(Expr
9f60: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
9f70: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 29  xprIsConst(p, 3)
9f80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
9f90: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
9fa0: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
9fb0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9fc0: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
9fd0: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
9fe0: 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
9ff0: 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
a000: 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
a010: 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
a020: 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
a030: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
a040: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
a050: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
a060: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
a070: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
a080: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
a090: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
a0a0: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
a0b0: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
a0c0: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
a0d0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
a0e0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
a0f0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
a100: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
a110: 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , 2);.}../*.** I
a120: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a130: 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74   p codes a const
a140: 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74  ant integer that
a150: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
a160: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
a170: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
a180: 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74  return 1 and put
a190: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
a1a0: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20  e integer.** in 
a1b0: 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65  *pValue.  If the
a1c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
a1d0: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  ot an integer or
a1e0: 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69   if it is too bi
a1f0: 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  g.** to fit in a
a200: 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69   signed 32-bit i
a210: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30  nteger, return 0
a220: 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c   and leave *pVal
a230: 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ue unchanged..*/
a240: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
a250: 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a  IsInteger(Expr *
a260: 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b  p, int *pValue){
a270: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a  .  int rc = 0;..
a280: 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65    /* If an expre
a290: 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
a2a0: 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ger literal that
a2b0: 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65   fits in a signe
a2c0: 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e  d 32-bit.  ** in
a2d0: 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
a2e0: 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67  EP_IntValue flag
a2f0: 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
a300: 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20  dy been set */. 
a310: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
a320: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70  TK_INTEGER || (p
a330: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
a340: 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20  Value)!=0.      
a350: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
a360: 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f  etInt32(p->u.zTo
a370: 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a  ken, &rc)==0 );.
a380: 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
a390: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
a3a0: 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70  .    *pValue = p
a3b0: 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
a3c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
a3d0: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
a3e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
a3f0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
a400: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
a410: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
a420: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
a430: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a440: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
a450: 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
a460: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a470: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
a480: 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
a490: 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d         *pValue =
a4a0: 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20   -v;.        rc 
a4b0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
a4c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a4d0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
a4e0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
a4f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
a500: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
a510: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
a520: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
a530: 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c  sion can be NULL
a540: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
a550: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
a560: 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68  be NULL or if th
a570: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a580: 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74  too complex.** t
a590: 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52  o tell return TR
a5a0: 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  UE.  .**.** This
a5b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
a5c0: 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   as an optimizat
a5d0: 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f  ion, to skip OP_
a5e0: 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  IsNull opcodes.*
a5f0: 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74  * when we know t
a600: 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e  hat a value cann
a610: 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e  ot be NULL.  Hen
a620: 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69  ce, a false posi
a630: 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69  tive.** (returni
a640: 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20  ng TRUE when in 
a650: 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73  fact the express
a660: 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65  ion can never be
a670: 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20   NULL) might.** 
a680: 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f  be a small perfo
a690: 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69  rmance hit but i
a6a0: 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d  s otherwise harm
a6b0: 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74  less.  On the ot
a6c0: 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66  her.** hand, a f
a6d0: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72  alse negative (r
a6e0: 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77  eturning FALSE w
a6f0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
a700: 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a  ould be NULL).**
a710: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73   will likely res
a720: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72  ult in an incorr
a730: 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20  ect answer.  So 
a740: 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  when in doubt, r
a750: 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a  eturn.** TRUE..*
a760: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
a770: 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74  rCanBeNull(const
a780: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20   Expr *p){.  u8 
a790: 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  op;.  while( p->
a7a0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
a7b0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
a7c0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
a7d0: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
a7e0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
a7f0: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
a800: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
a810: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
a820: 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
a830: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
a840: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
a850: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  T:.    case TK_B
a860: 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72  LOB:.      retur
a870: 6e 20 30 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  n 0;.    default
a880: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
a890: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
a8a0: 65 6e 65 72 61 74 65 20 61 6e 20 4f 50 5f 49 73  enerate an OP_Is
a8b0: 4e 75 6c 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  Null instruction
a8c0: 20 74 68 61 74 20 74 65 73 74 73 20 72 65 67 69   that tests regi
a8d0: 73 74 65 72 20 69 52 65 67 20 61 6e 64 20 6a 75  ster iReg and ju
a8e0: 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 69  mps.** to locati
a8f0: 6f 6e 20 69 44 65 73 74 20 69 66 20 74 68 65 20  on iDest if the 
a900: 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20 69 73  value in iReg is
a910: 20 4e 55 4c 4c 2e 20 20 54 68 65 20 76 61 6c 75   NULL.  The valu
a920: 65 20 69 6e 20 69 52 65 67 20 0a 2a 2a 20 77 61  e in iReg .** wa
a930: 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 70 45  s computed by pE
a940: 78 70 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20  xpr.  If we can 
a950: 6c 6f 6f 6b 20 61 74 20 70 45 78 70 72 20 61 74  look at pExpr at
a960: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e   compile-time an
a970: 64 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 74  d.** determine t
a980: 68 61 74 20 69 74 20 63 61 6e 20 6e 65 76 65 72  hat it can never
a990: 20 67 65 6e 65 72 61 74 65 20 61 20 4e 55 4c 4c   generate a NULL
a9a0: 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 49 73  , then the OP_Is
a9b0: 4e 75 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  Null operation.*
a9c0: 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  * can be omitted
a9d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a9e0: 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
a9f0: 75 6d 70 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ump(.  Vdbe *v, 
aa00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
aa10: 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
aa20: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 63  struction */.  c
aa30: 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72  onst Expr *pExpr
aa40: 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67 65 6e 65 72  ,  /* Only gener
aa50: 61 74 65 20 4f 50 5f 49 73 4e 75 6c 6c 20 69 66  ate OP_IsNull if
aa60: 20 74 68 69 73 20 65 78 70 72 20 63 61 6e 20 62   this expr can b
aa70: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
aa80: 69 52 65 67 2c 20 20 20 20 20 20 20 20 20 20 20  iReg,           
aa90: 2f 2a 20 54 65 73 74 20 74 68 65 20 76 61 6c 75  /* Test the valu
aaa0: 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  e in this regist
aab0: 65 72 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  er for NULL */. 
aac0: 20 69 6e 74 20 69 44 65 73 74 20 20 20 20 20 20   int iDest      
aad0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
aae0: 65 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  e if the value i
aaf0: 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69  s null */.){.  i
ab00: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  f( sqlite3ExprCa
ab10: 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 29 20 29  nBeNull(pExpr) )
ab20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
ab30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
ab40: 4e 75 6c 6c 2c 20 69 52 65 67 2c 20 69 44 65 73  Null, iReg, iDes
ab50: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
ab60: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
ab70: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
ab80: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61  sion is a consta
ab90: 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  nt which would b
aba0: 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62  e.** unchanged b
abb0: 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69  y OP_Affinity wi
abc0: 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  th the affinity 
abd0: 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
abe0: 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ond.** argument.
abf0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ac00: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
ac10: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
ac20: 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72  OP_Affinity oper
ac30: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
ac40: 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69  omitted.  When i
ac50: 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46  n doubt return F
ac60: 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e  ALSE.  A false n
ac70: 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61  egative.** is ha
ac80: 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65  rmless.  A false
ac90: 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76   positive, howev
aca0: 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69  er, can result i
acb0: 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61  n the wrong.** a
acc0: 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nswer..*/.int sq
acd0: 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
ace0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63  AffinityChange(c
acf0: 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68  onst Expr *p, ch
ad00: 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70  ar aff){.  u8 op
ad10: 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c  ;.  if( aff==SQL
ad20: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72  ITE_AFF_NONE ) r
ad30: 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65  eturn 1;.  while
ad40: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
ad50: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
ad60: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
ad70: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
ad80: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
ad90: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
ada0: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
adb0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
adc0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
add0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
ade0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
adf0: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
ae00: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
ae10: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
ae20: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
ae30: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
ae40: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
ae50: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
ae60: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
ae70: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
ae80: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72  TRING: {.      r
ae90: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
aea0: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
aeb0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  }.    case TK_BL
aec0: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  OB: {.      retu
aed0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
aee0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
aef0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
af00: 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20  p->iTable>=0 ); 
af10: 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20   /* p cannot be 
af20: 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20  part of a CHECK 
af30: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
af40: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
af50: 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20  olumn<0.        
af60: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
af70: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
af80: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
af90: 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d  _NUMERIC);.    }
afa0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
afb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
afc0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
afd0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
afe0: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
aff0: 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
b000: 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69  olumn name..*/.i
b010: 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
b020: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  d(const char *z)
b030: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  {.  if( sqlite3S
b040: 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49  trICmp(z, "_ROWI
b050: 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  D_")==0 ) return
b060: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
b070: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57  3StrICmp(z, "ROW
b080: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
b090: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
b0a0: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44  3StrICmp(z, "OID
b0b0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
b0c0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
b0d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
b0e0: 75 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  ue if we are abl
b0f0: 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72  e to the IN oper
b100: 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ator optimizatio
b110: 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20  n on a.** query 
b120: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
b130: 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  *       x IN (SE
b140: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
b150: 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54  Where the SELECT
b160: 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73  ... clause is as
b170: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
b180: 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  e parameter to t
b190: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a  his.** routine..
b1a0: 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74  **.** The Select
b1b0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 69   object passed i
b1c0: 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
b1d0: 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64 20  en preprocessed 
b1e0: 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73  and no.** errors
b1f0: 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64   have been found
b200: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
b210: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b220: 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 43  Y.static int isC
b230: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
b240: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53  (Select *p){.  S
b250: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
b260: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
b270: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
b280: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
b290: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
b2a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67            /* rig
b2b0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
b2c0: 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a  IN is SELECT */.
b2d0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
b2e0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b2f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
b300: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
b310: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65  T */.  if( p->se
b320: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
b330: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
b340: 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63  te) ){.    testc
b350: 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
b360: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
b370: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
b380: 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
b390: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
b3a0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
b3b0: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
b3c0: 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
b3d0: 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65  regate );.    re
b3e0: 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49  turn 0; /* No DI
b3f0: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61  STINCT keyword a
b400: 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  nd no aggregate 
b410: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d  functions */.  }
b420: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47  .  assert( p->pG
b430: 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20  roupBy==0 );    
b440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
b450: 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
b460: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
b470: 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
b480: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b490: 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20  /* Has no LIMIT 
b4a0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65  clause */.  asse
b4b0: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
b4c0: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
b4d0: 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d     /* No LIMIT m
b4e0: 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a  eans no OFFSET *
b4f0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  /.  if( p->pWher
b500: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
b510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
b520: 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
b530: 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d  e */.  pSrc = p-
b540: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
b550: 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66   pSrc!=0 );.  if
b560: 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
b570: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b580: 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74       /* Single t
b590: 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  erm in FROM clau
b5a0: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  se */.  if( pSrc
b5b0: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
b5c0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f   return 0;     /
b5d0: 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20  * FROM is not a 
b5e0: 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77  subquery or view
b5f0: 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72   */.  pTab = pSr
b600: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
b610: 69 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d  if( NEVER(pTab==
b620: 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
b630: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
b640: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20  Select==0 );    
b650: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
b660: 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
b670: 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73  view */.  if( Is
b680: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
b690: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
b6a0: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
b6b0: 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
b6c0: 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ble */.  pEList 
b6d0: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
b6e0: 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  f( pEList->nExpr
b6f0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
b700: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c        /* One col
b710: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
b720: 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70  t set */.  if( p
b730: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
b740: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
b750: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
b760: 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75  Result is a colu
b770: 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31  mn */.  return 1
b780: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b790: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b7a0: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  RY */../*.** Cod
b7b0: 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73  e an OP_Once ins
b7c0: 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c  truction and all
b7d0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
b7e0: 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e  its flag. Return
b7f0: 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73   the .** address
b800: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
b810: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ruction..*/.int 
b820: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
b830: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
b840: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
b850: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
b860: 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74  e);      /* Virt
b870: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
b880: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74  g coded */.  ret
b890: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
b8a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp1(v, OP_Once
b8b0: 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b  , pParse->nOnce+
b8c0: 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  +);.}../*.** Thi
b8d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
b8e0: 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
b8f0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b900: 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f  IN (...) operato
b910: 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72  r..** The pX par
b920: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78  ameter is the ex
b930: 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20  pression on the 
b940: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
b950: 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a  erator, which.**
b960: 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
b970: 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
b980: 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71  ssions or a subq
b990: 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
b9a0: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
b9b0: 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  ine is to find o
b9c0: 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
b9d0: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61  e object that ca
b9e0: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74  n.** be used eit
b9f0: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
ba00: 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68  membership in th
ba10: 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20  e RHS set or to 
ba20: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
ba30: 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  ** all members o
ba40: 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73  f the RHS set, s
ba50: 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74  kipping duplicat
ba60: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73  es..**.** A curs
ba70: 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  or is opened on 
ba80: 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
ba90: 74 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6f  t that the RHS o
baa0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
bab0: 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61  r.** and pX->iTa
bac0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ble is set to th
bad0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
bae0: 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
baf0: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
bb00: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
bb10: 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  n indicates the 
bb20: 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20  b-tree type, as 
bb30: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
bb40: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20   IN_INDEX_ROWID 
bb50: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
bb60: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
bb70: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
bb80: 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
bb90: 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
bba0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61  s opened on a da
bbb0: 74 61 62 61 73 65 20 69 6e 64 65 78 2e 0a 2a 2a  tabase index..**
bbc0: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20     IN_INDEX_EPH 
bbd0: 2d 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 77  -   The cursor w
bbe0: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73  as opened on a s
bbf0: 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64  pecially created
bc00: 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
bc10: 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
bc20: 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
bc30: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  able..**.** An e
bc40: 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d  xisting b-tree m
bc50: 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20  ight be used if 
bc60: 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69  the RHS expressi
bc70: 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c  on pX is a simpl
bc80: 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75  e.** subquery su
bc90: 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ch as:.**.**    
bca0: 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e   SELECT <column>
bcb0: 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a   FROM <table>.**
bcc0: 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f  .** If the RHS o
bcd0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
bce0: 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61  r is a list or a
bcf0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75   more complex su
bd00: 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20  bquery, then.** 
bd10: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
bd20: 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  le might need to
bd30: 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72   be generated fr
bd40: 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74  om the RHS and t
bd50: 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c  hen.** pX->iTabl
bd60: 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
bd70: 74 6f 20 74 68 65 20 65 70 68 65 72 6d 65 72 61  to the ephermera
bd80: 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  l table instead 
bd90: 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  of an.** existin
bda0: 67 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a  g table.  .**.**
bdb0: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
bdc0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
bdd0: 30 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  0, then the b-tr
bde0: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
bdf0: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
be00: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
be10: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
be20: 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20  any duplicates. 
be30: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a  In this case an.
be40: 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ** epheremal tab
be50: 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
be60: 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
be70: 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20  ted <column> is 
be80: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
be90: 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
bea0: 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
beb0: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
bec0: 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a  MARY KEY or it.*
bed0: 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 63  * has a UNIQUE c
bee0: 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49  onstraint or UNI
bef0: 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  QUE index..**.**
bf00: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
bf10: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
bf20: 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20  not 0, then the 
bf30: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
bf40: 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
bf50: 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
bf60: 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63  tests. In this c
bf70: 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  ase an epheremal
bf80: 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20   table must .** 
bf90: 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c  be used unless <
bfa0: 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e  column> is an IN
bfb0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
bfc0: 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61  Y or an index ca
bfd0: 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77  n .** be found w
bfe0: 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20  ith <column> as 
bff0: 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  its left-most co
c000: 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lumn..**.** When
c010: 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
c020: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
c030: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
c040: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
c050: 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  tion.** needs to
c060: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
c070: 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74 75   not the structu
c080: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53  re contains an S
c090: 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75  QL NULL .** valu
c0a0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  e in order to co
c0b0: 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65  rrectly evaluate
c0c0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b   expressions lik
c0d0: 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e  e "X IN (Y, Z)".
c0e0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
c0f0: 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20  any chance that 
c100: 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20  the (...) might 
c110: 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76  contain a NULL v
c120: 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69  alue at.** runti
c130: 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73  me, then a regis
c140: 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
c150: 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65   and the registe
c160: 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e  r number written
c170: 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75  .** to *prNotFou
c180: 6e 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  nd. If there is 
c190: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
c1a0: 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e  he (...) contain
c1b0: 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
c1c0: 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f  e, then *prNotFo
c1d0: 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68  und is left unch
c1e0: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
c1f0: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
c200: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20  located and its 
c210: 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  location stored 
c220: 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20  in *prNotFound, 
c230: 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74  then.** its init
c240: 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  ial value is NUL
c250: 4c 2e 20 20 49 66 20 74 68 65 20 28 2e 2e 2e 29  L.  If the (...)
c260: 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e   does not remain
c270: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
c280: 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66   the duration of
c290: 20 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e   the query (i.e.
c2a0: 20 74 68 65 20 53 45 4c 45 43 54 20 77 69 74 68   the SELECT with
c2b0: 69 6e 20 74 68 65 20 28 2e 2e 2e 29 0a 2a 2a 20  in the (...).** 
c2c0: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
c2d0: 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74  subquery) then t
c2e0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
c2f0: 61 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74  allocated regist
c300: 65 72 20 69 73 0a 2a 2a 20 72 65 73 65 74 20 74  er is.** reset t
c310: 6f 20 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d 65  o NULL each time
c320: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
c330: 20 72 65 72 75 6e 2e 20 54 68 69 73 20 61 6c 6c   rerun. This all
c340: 6f 77 73 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65  ows the.** calle
c350: 72 20 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f  r to use vdbe co
c360: 64 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  de equivalent to
c370: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
c380: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67 69  **.**   if( regi
c390: 73 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a  ster==NULL ){.**
c3a0: 20 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20       has_null = 
c3b0: 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74  <test if data st
c3c0: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
c3d0: 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65   null>.**     re
c3e0: 67 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20  gister = 1.**   
c3f0: 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  }.**.** in order
c400: 20 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e   to avoid runnin
c410: 67 20 74 68 65 20 3c 74 65 73 74 20 69 66 20 64  g the <test if d
c420: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
c430: 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20  ntains null>.** 
c440: 74 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20  test more often 
c450: 74 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61 72  than is necessar
c460: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
c470: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
c480: 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  RY.int sqlite3Fi
c490: 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20  ndInIndex(Parse 
c4a0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
c4b0: 58 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75  X, int *prNotFou
c4c0: 6e 64 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  nd){.  Select *p
c4d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c4f0: 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69  SELECT to the ri
c500: 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ght of IN operat
c510: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  or */.  int eTyp
c520: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c540: 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62   Type of RHS tab
c550: 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a  le. IN_INDEX_* *
c560: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
c570: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
c580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
c590: 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74  sor of the RHS t
c5a0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
c5b0: 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 70 72  stBeUnique = (pr
c5c0: 4e 6f 74 46 6f 75 6e 64 3d 3d 30 29 3b 20 20 20  NotFound==0);   
c5d0: 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d  /* True if RHS m
c5e0: 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f  ust be unique */
c5f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
c600: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
c610: 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74  se);     /* Virt
c620: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
c630: 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73  g coded */..  as
c640: 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
c650: 5f 49 4e 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  _IN );..  /* Che
c660: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20  ck to see if an 
c670: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
c680: 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  r index can be u
c690: 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69  sed to.  ** sati
c6a0: 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20  sfy the query.  
c6b0: 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62  This is preferab
c6c0: 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67  le to generating
c6d0: 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68   a new .  ** eph
c6e0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20  emeral table..  
c6f0: 2a 2f 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61  */.  p = (ExprHa
c700: 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
c710: 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58  _xIsSelect) ? pX
c720: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29  ->x.pSelect : 0)
c730: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
c740: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20  Parse->nErr==0) 
c750: 26 26 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  && isCandidateFo
c760: 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20  rInOpt(p) ){.   
c770: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c780: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
c790: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
c7a0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
c7b0: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
c7c0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c7e0: 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a  Table <table>. *
c7f0: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  /.    Expr *pExp
c800: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c820: 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75  Expression <colu
c830: 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  mn> */.    int i
c840: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c860: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
c870: 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f  lumn <column> */
c880: 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c8b0: 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20  atabase idx for 
c8c0: 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73  pTab */..    ass
c8d0: 65 72 74 28 20 70 20 29 3b 20 20 20 20 20 20 20  ert( p );       
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c900: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c910: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
c920: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d  ert( p->pEList!=
c930: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
c940: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c950: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c960: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
c970: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
c980: 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
c990: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c9a0: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c9b0: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
c9c0: 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20  ert( p->pSrc!=0 
c9d0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
c9e0: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
c9f0: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
ca00: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61  pt(p) */.    pTa
ca10: 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
ca20: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70  ].pTab;.    pExp
ca30: 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
ca40: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [0].pExpr;.    i
ca50: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
ca60: 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20 2f 2a  lumn;.   .    /*
ca70: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 56 65 72 69   Code an OP_Veri
ca80: 66 79 43 6f 6f 6b 69 65 20 61 6e 64 20 4f 50 5f  fyCookie and OP_
ca90: 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74  TableLock for <t
caa0: 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44  able>. */.    iD
cab0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cac0: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
cad0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
cae0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
caf0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
cb00: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
cb10: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
cb20: 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
cb30: 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
cb40: 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ame);..    /* Th
cb50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
cb60: 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
cb70: 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62  two places. In b
cb80: 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64  oth cases the vd
cb90: 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c  be.    ** has al
cba0: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
cbb0: 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20  ated. So assume 
cbc0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29  sqlite3GetVdbe()
cbd0: 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a   is always.    *
cbe0: 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72  * successful her
cbf0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
cc00: 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28  sert(v);.    if(
cc10: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
cc20: 20 69 6e 74 20 69 41 64 64 72 3b 0a 0a 20 20 20   int iAddr;..   
cc30: 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74     iAddr = sqlit
cc40: 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
cc50: 65 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  e);..      sqlit
cc60: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
cc70: 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
cc80: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
cc90: 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
cca0: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
ccb0: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
ccc0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
ccd0: 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Addr);.    }else
cce0: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
ccf0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd10: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
cd20: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  e */..      /* T
cd30: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
cd40: 75 65 6e 63 65 20 75 73 65 64 20 62 79 20 74 68  uence used by th
cd50: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66  e comparison. If
cd60: 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 0a   an index is to.
cd70: 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64        ** be used
cd80: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74   in place of a t
cd90: 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75  emp-table, it mu
cda0: 73 74 20 62 65 20 6f 72 64 65 72 65 64 20 61 63  st be ordered ac
cdb0: 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a  cording.      **
cdc0: 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69   to this collati
cdd0: 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f  on sequence.  */
cde0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
cdf0: 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69  pReq = sqlite3Bi
ce00: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
ce10: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
ce20: 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20  Left, pExpr);.. 
ce30: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
ce40: 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
ce50: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
ce60: 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  d to perform the
ce70: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61   .      ** compa
ce80: 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  rison is the sam
ce90: 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74  e as the affinit
cea0: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  y of the column.
ceb0: 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   If.      ** it 
cec0: 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f  is not, it is no
ced0: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
cee0: 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20  e any index..   
cef0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
cf00: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71  affinity_ok = sq
cf10: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
cf20: 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d 3e 61  tyOk(pX, pTab->a
cf30: 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
cf40: 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  ty);..      for(
cf50: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
cf60: 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65  x; pIdx && eType
cf70: 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f  ==0 && affinity_
cf80: 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  ok; pIdx=pIdx->p
cf90: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
cfa0: 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  f( (pIdx->aiColu
cfb0: 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20  mn[0]==iCol).   
cfc0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
cfd0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
cfe0: 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e 61  ENC(db), pIdx->a
cff0: 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52  zColl[0], 0)==pR
d000: 65 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  eq.         && (
d010: 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c  !mustBeUnique ||
d020: 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d   (pIdx->nColumn=
d030: 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72  =1 && pIdx->onEr
d040: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20  ror!=OE_None)). 
d050: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
d060: 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20      int iAddr;. 
d070: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
d080: 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Key;.  .        
d090: 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a    pKey = (char *
d0a0: 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  )sqlite3IndexKey
d0b0: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
d0c0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 41  x);.          iA
d0d0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
d0e0: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20  eOnce(pParse);. 
d0f0: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
d100: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
d110: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
d120: 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ab, pIdx->tnum, 
d130: 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
d140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d150: 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59 49      pKey,P4_KEYI
d160: 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
d170: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
d180: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
d190: 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
d1a0: 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
d1b0: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a 0a  N_INDEX_INDEX;..
d1c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d1d0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
d1e0: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20   iAddr);.       
d1f0: 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e     if( prNotFoun
d200: 64 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c  d && !pTab->aCol
d210: 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29  [iCol].notNull )
d220: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
d230: 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50  rNotFound = ++pP
d240: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
d250: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d260: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d270: 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74 46  Null, 0, *prNotF
d280: 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ound);.         
d290: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
d2a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
d2b0: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29    if( eType==0 )
d2c0: 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e  {.    /* Could n
d2d0: 6f 74 20 66 6f 75 6e 64 20 61 6e 20 65 78 69 73  ot found an exis
d2e0: 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
d2f0: 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68  dex to use as th
d300: 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20  e RHS b-tree..  
d310: 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76    ** We will hav
d320: 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
d330: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
d340: 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a   to do the job..
d350: 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c      */.    doubl
d360: 65 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  e savedNQueryLoo
d370: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
d380: 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  ryLoop;.    int 
d390: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
d3a0: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
d3b0: 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20  _INDEX_EPH;.    
d3c0: 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29  if( prNotFound )
d3d0: 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f  {.      *prNotFo
d3e0: 75 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e 75  und = rMayHaveNu
d3f0: 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
d400: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
d410: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d420: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72 4e  OP_Null, 0, *prN
d430: 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 7d 65  otFound);.    }e
d440: 6c 73 65 7b 0a 20 20 20 20 20 20 74 65 73 74 63  lse{.      testc
d450: 61 73 65 28 20 70 50 61 72 73 65 2d 3e 6e 51 75  ase( pParse->nQu
d460: 65 72 79 4c 6f 6f 70 3e 28 64 6f 75 62 6c 65 29  eryLoop>(double)
d470: 31 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  1 );.      pPars
d480: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
d490: 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 20 20 20  (double)1;.     
d4a0: 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
d4b0: 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
d4c0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
d4d0: 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
d4e0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54  t) ){.        eT
d4f0: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
d500: 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OWID;.      }.  
d510: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
d520: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
d530: 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
d540: 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
d550: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
d560: 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
d570: 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75  yLoop = savedNQu
d580: 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  eryLoop;.  }else
d590: 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65  {.    pX->iTable
d5a0: 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72   = iTab;.  }.  r
d5b0: 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23  eturn eType;.}.#
d5c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
d5d0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73  erate code for s
d5e0: 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73  calar subqueries
d5f0: 20 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75   used as a subqu
d600: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ery expression, 
d610: 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e  EXISTS,.** or IN
d620: 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61   operators.  Exa
d630: 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
d640: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
d650: 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73  b)          -- s
d660: 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45  ubquery.**     E
d670: 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20  XISTS (SELECT a 
d680: 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49  FROM b)   -- EXI
d690: 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20  STS subquery.** 
d6a0: 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31      x IN (4,5,11
d6b0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  )              -
d6c0: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
d6d0: 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74  th list on right
d6e0: 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20  -hand side.**   
d6f0: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61    x IN (SELECT a
d700: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20   FROM b)     -- 
d710: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
d720: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
d730: 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65   right.**.** The
d740: 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
d750: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65   describes the e
d760: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
d770: 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a  ontains the IN.*
d780: 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75  * operator or su
d790: 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  bquery..**.** If
d7a0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77   parameter isRow
d7b0: 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  id is non-zero, 
d7c0: 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
d7d0: 70 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74  pExpr is guarant
d7e0: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20  eed.** to be of 
d7f0: 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64  the form "<rowid
d800: 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c  > IN (?, ?, ?)",
d810: 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69   where <rowid> i
d820: 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  s a reference.**
d830: 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72   to some integer
d840: 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61   key column of a
d850: 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49   table B-Tree. I
d860: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65  n this case, use
d870: 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d   an.** intkey B-
d880: 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68  Tree to store th
d890: 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29  e set of IN(...)
d8a0: 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20   values instead 
d8b0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
d8c0: 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c  (slower) variabl
d8d0: 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d  e length keys B-
d8e0: 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  Tree..**.** If r
d8f0: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e  MayHaveNull is n
d900: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65  on-zero, that me
d910: 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65  ans that the ope
d920: 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a  ration is an IN.
d930: 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54  ** (not a SELECT
d940: 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20   or EXISTS) and 
d950: 74 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67  that the RHS mig
d960: 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  ht contains NULL
d970: 73 2e 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72  s..** Furthermor
d980: 65 2c 20 74 68 65 20 49 4e 20 69 73 20 69 6e 20  e, the IN is in 
d990: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  a WHERE clause a
d9a0: 6e 64 20 74 68 61 74 20 77 65 20 72 65 61 6c 6c  nd that we reall
d9b0: 79 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 69 74 65  y want.** to ite
d9c0: 72 61 74 65 20 6f 76 65 72 20 74 68 65 20 52 48  rate over the RH
d9d0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
d9e0: 61 74 6f 72 20 69 6e 20 6f 72 64 65 72 20 74 6f  ator in order to
d9f0: 20 71 75 69 63 6b 6c 79 20 6c 6f 63 61 74 65 0a   quickly locate.
da00: 2a 2a 20 61 6c 6c 20 63 6f 72 72 65 73 70 6f 6e  ** all correspon
da10: 64 69 6e 67 20 4c 48 53 20 65 6c 65 6d 65 6e 74  ding LHS element
da20: 73 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  s.  All this rou
da30: 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69  tine does is ini
da40: 74 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20 72  tialize.** the r
da50: 65 67 69 73 74 65 72 20 67 69 76 65 6e 20 62 79  egister given by
da60: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 74 6f   rMayHaveNull to
da70: 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20   NULL.  Calling 
da80: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61  routines will ta
da90: 6b 65 0a 2a 2a 20 63 61 72 65 20 6f 66 20 63 68  ke.** care of ch
daa0: 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67 69  anging this regi
dab0: 73 74 65 72 20 76 61 6c 75 65 20 74 6f 20 6e 6f  ster value to no
dac0: 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48  n-NULL if the RH
dad0: 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a  S is NULL-free..
dae0: 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76  **.** If rMayHav
daf0: 65 4e 75 6c 6c 20 69 73 20 7a 65 72 6f 2c 20 74  eNull is zero, t
db00: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
db10: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 62  he subquery is b
db20: 65 69 6e 67 20 75 73 65 64 0a 2a 2a 20 66 6f 72  eing used.** for
db30: 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
db40: 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 72 65  ing only.  There
db50: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69   is no need to i
db60: 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 0a 2a 2a  nitialize any.**
db70: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 69 6e   registers to in
db80: 64 69 63 61 74 65 20 74 68 65 20 70 72 65 73 65  dicate the prese
db90: 6e 73 65 20 6f 72 20 61 62 73 65 6e 63 65 20 6f  nse or absence o
dba0: 66 20 4e 55 4c 4c 73 20 6f 6e 20 74 68 65 20 52  f NULLs on the R
dbb0: 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  HS..**.** For a 
dbc0: 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
dbd0: 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72   operator, retur
dbe0: 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74  n the register t
dbf0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a  hat holds the.**
dc00: 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e   result.  For IN
dc10: 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66   operators or if
dc20: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
dc30: 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  , the return val
dc40: 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e  ue is 0..*/.#ifn
dc50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dc60: 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
dc70: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
dc80: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
dc90: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
dca0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
dcb0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
dcc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
dcd0: 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20  The IN, SELECT, 
dce0: 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
dcf0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d 61 79  or */.  int rMay
dd00: 48 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20 20 20  HaveNull,       
dd10: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
dd20: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
dd30: 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20   NULLs exist in 
dd40: 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  RHS */.  int isR
dd50: 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
dd60: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53   /* If true, LHS
dd70: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
dd80: 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b  is a rowid */.){
dd90: 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20  .  int testAddr 
dda0: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
ddb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
ddc0: 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
ddd0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65  ess */.  int rRe
dde0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
de10: 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
de20: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
de30: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
de40: 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  rse);.  if( NEVE
de50: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
de60: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
de70: 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
de80: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  e);..  /* This c
de90: 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20  ode must be run 
dea0: 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20  in its entirety 
deb0: 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73  every time it is
dec0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
ded0: 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * if any of the 
dee0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
def0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
df00: 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
df10: 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72  d side is a corr
df20: 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a  elated subquery.
df30: 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
df40: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
df50: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
df60: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
df70: 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20  variables.  **  
df80: 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69    *  We are insi
df90: 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a  de a trigger.  *
dfa0: 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  *.  ** If all of
dfb0: 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66   the above are f
dfc0: 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61  alse, then we ca
dfd0: 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  n run this code 
dfe0: 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73  just once.  ** s
dff0: 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c  ave the results,
e000: 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73   and reuse the s
e010: 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75  ame result on su
e020: 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
e030: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
e040: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
e050: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
e060: 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  arSelect) ){.   
e070: 20 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69   testAddr = sqli
e080: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
e090: 73 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  se);.  }..#ifnde
e0a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
e0b0: 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72  PLAIN.  if( pPar
e0c0: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
e0d0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  {.    char *zMsg
e0e0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
e0f0: 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  f(.        pPars
e100: 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20  e->db, "EXECUTE 
e110: 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64  %s%s SUBQUERY %d
e120: 22 2c 20 74 65 73 74 41 64 64 72 3e 3d 30 3f 22  ", testAddr>=0?"
e130: 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c  ":"CORRELATED ",
e140: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
e150: 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22  op==TK_IN?"LIST"
e160: 3a 22 53 43 41 4c 41 52 22 2c 20 70 50 61 72 73  :"SCALAR", pPars
e170: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
e180: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
e190: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
e1a0: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
e1b0: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
e1c0: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
e1d0: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e  YNAMIC);.  }.#en
e1e0: 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70  dif..  switch( p
e1f0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
e200: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
e210: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
e220: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
e230: 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  /* Affinity of t
e240: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
e250: 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   */.      KeyInf
e260: 6f 20 6b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  o keyInfo;      
e270: 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f        /* Keyinfo
e280: 20 66 6f 72 20 74 68 65 20 67 65 6e 65 72 61 74   for the generat
e290: 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ed table */.    
e2a0: 20 20 73 74 61 74 69 63 20 75 38 20 73 6f 72 74    static u8 sort
e2b0: 4f 72 64 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a  Order = 0;    /*
e2c0: 20 46 61 6b 65 20 61 53 6f 72 74 4f 72 64 65 72   Fake aSortOrder
e2d0: 20 66 6f 72 20 6b 65 79 49 6e 66 6f 20 2a 2f 0a   for keyInfo */.
e2e0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20        int addr; 
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
e310: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
e320: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
e330: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
e340: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
e350: 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20  ; /* the LHS of 
e360: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
e370: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d  */..      if( rM
e380: 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20  ayHaveNull ){.  
e390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e3a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
e3b0: 6c 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e  ll, 0, rMayHaveN
e3c0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ull);.      }.. 
e3d0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
e3e0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
e3f0: 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20  ity(pLeft);..   
e400: 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68     /* Whether th
e410: 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53  is is an 'x IN(S
e420: 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e  ELECT...)' or an
e430: 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74   'x IN(<exprlist
e440: 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  >)'.      ** exp
e450: 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61  ression it is ha
e460: 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77  ndled the same w
e470: 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61  ay.  An ephemera
e480: 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20  l table is .    
e490: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
e4a0: 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e   single-field in
e4b0: 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
e4c0: 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
e4d0: 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
e4e0: 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68  the SELECT or th
e4f0: 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
e500: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
e510: 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
e520: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
e530: 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
e540: 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
e550: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
e560: 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
e570: 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
e580: 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
e590: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
e5a0: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
e5b0: 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
e5c0: 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
e5d0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
e5e0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
e5f0: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
e600: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
e610: 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
e620: 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
e630: 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
e640: 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
e650: 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
e660: 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
e670: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
e680: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
e690: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
e6a0: 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
e6b0: 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
e6c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
e6d0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
e6e0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
e6f0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
e700: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e710: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
e720: 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  l, pExpr->iTable
e730: 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20  , !isRowid);.   
e740: 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e     if( rMayHaveN
e750: 75 6c 6c 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  ull==0 ) sqlite3
e760: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
e770: 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
e780: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
e790: 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  keyInfo, 0, size
e7a0: 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20  of(keyInfo));.  
e7b0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65      keyInfo.nFie
e7c0: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 6b 65  ld = 1;.      ke
e7d0: 79 49 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72  yInfo.aSortOrder
e7e0: 20 3d 20 26 73 6f 72 74 4f 72 64 65 72 3b 0a 0a   = &sortOrder;..
e7f0: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
e800: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
e810: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
e820: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
e830: 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
e840: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
e850: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
e860: 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
e870: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
e880: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
e890: 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
e8a0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
e8b0: 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
e8c0: 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
e8d0: 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
e8e0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
e8f0: 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
e900: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
e910: 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  t;..        asse
e920: 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
e930: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
e940: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
e950: 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
e960: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
e970: 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 53 64        dest.affSd
e980: 73 74 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74  st = (u8)affinit
e990: 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  y;.        asser
e9a0: 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c  t( (pExpr->iTabl
e9b0: 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70  e&0x0000FFFF)==p
e9c0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
e9d0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
e9e0: 2e 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74  .pSelect->iLimit
e9f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
ea00: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
ea10: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78  pParse, pExpr->x
ea20: 2e 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29  .pSelect, &dest)
ea30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
ea40: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
ea50: 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  }.        pEList
ea60: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
ea70: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
ea80: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
ea90: 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 4c  pEList!=0 && pEL
eaa0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 20 29 7b  ist->nExpr>0) ){
eab0: 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49   .          keyI
eac0: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  nfo.aColl[0] = s
ead0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
eae0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
eaf0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
eb00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
eb10: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
eb20: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
eb30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
eb40: 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
eb50: 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
eb60: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
eb70: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
eb80: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
eb90: 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65          ** For e
eba0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
ebb0: 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
ebc0: 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
ebd0: 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
ebe0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
ebf0: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
ec00: 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
ec10: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
ec20: 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
ec30: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
ec40: 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
ec50: 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
ec60: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
ec70: 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
ec80: 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
ec90: 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
eca0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
ecb0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
ecc0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
ecd0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
ece0: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
ecf0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
ed00: 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  pItem;.        i
ed10: 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a  nt r1, r2, r3;..
ed20: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66          if( !aff
ed30: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
ed40: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51     affinity = SQ
ed50: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
ed60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ed70: 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30   keyInfo.aColl[0
ed80: 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
ed90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
eda0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
edb0: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 53        keyInfo.aS
edc0: 6f 72 74 4f 72 64 65 72 20 3d 20 26 73 6f 72 74  ortOrder = &sort
edd0: 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20 20 20 20  Order;..        
ede0: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
edf0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
ee00: 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
ee10: 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  /.        r1 = s
ee20: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
ee30: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
ee40: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
ee50: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ee60: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ee70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ee80: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a  P_Null, 0, r2);.
ee90: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c          for(i=pL
eea0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
eeb0: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  m=pList->a; i>0;
eec0: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
eed0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
eee0: 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
eef0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  pr;.          in
ef00: 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20  t iValToIns;..  
ef10: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
ef20: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ef30: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
ef40: 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
ef50: 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
ef60: 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
ef70: 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
ef80: 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
ef90: 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
efa0: 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
efb0: 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
efc0: 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
efd0: 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
efe0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
eff0: 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
f000: 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
f010: 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
f020: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f030: 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64       if( testAdd
f040: 72 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  r>=0 && !sqlite3
f050: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
f060: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
f070: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f080: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65  angeToNoop(v, te
f090: 73 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20  stAddr);.       
f0a0: 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20       testAddr = 
f0b0: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -1;.          }.
f0c0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
f0d0: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
f0e0: 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
f0f0: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
f100: 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
f110: 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
f120: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
f130: 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69  sInteger(pE2, &i
f140: 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20  ValToIns) ){.   
f150: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f160: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f170: 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70  _InsertInt, pExp
f180: 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69  r->iTable, r2, i
f190: 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20  ValToIns);.     
f1a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f1b0: 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c          r3 = sql
f1c0: 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
f1d0: 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20  et(pParse, pE2, 
f1e0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
f1f0: 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a   if( isRowid ){.
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f220: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
f230: 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f260: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
f270: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f290: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
f2a0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
f2b0: 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  r2, r3);.       
f2c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f2d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f2e0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
f2f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
f300: 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
f310: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
f320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f330: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
f340: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c  ange(pParse, r3,
f350: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
f360: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f370: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
f380: 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
f390: 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  ble, r2);.      
f3a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f3b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
f3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
f3d0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
f3e0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
f3f0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f400: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f410: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
f420: 20 20 69 66 28 20 21 69 73 52 6f 77 69 64 20 29    if( !isRowid )
f430: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f440: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
f450: 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26   addr, (void *)&
f460: 6b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  keyInfo, P4_KEYI
f470: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
f480: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f490: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
f4a0: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
f4b0: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65  K_SELECT:.    de
f4c0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
f4d0: 2a 20 49 66 20 74 68 69 73 20 68 61 73 20 74 6f  * If this has to
f4e0: 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
f4f0: 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
f500: 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
f510: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
f520: 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
f530: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
f540: 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
f550: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
f560: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
f570: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20  in iColumn.  If 
f580: 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54  this is an EXIST
f590: 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  S, write.      *
f5a0: 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28  * an integer 0 (
f5b0: 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31  not exists) or 1
f5c0: 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61   (exists) into a
f5d0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20   memory cell.   
f5e0: 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64     ** and record
f5f0: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
f600: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20  l in iColumn..  
f610: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c      */.      Sel
f620: 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
f650: 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
f660: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
f670: 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77  /* How to deal w
f6a0: 69 74 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c  ith SELECt resul
f6b0: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  t */..      test
f6c0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
f6d0: 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
f6e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
f6f0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
f700: 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
f710: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
f720: 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
f730: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
f740: 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72   );..      asser
f750: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
f760: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
f770: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
f780: 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
f790: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
f7a0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
f7b0: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20  tInit(&dest, 0, 
f7c0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b  ++pParse->nMem);
f7d0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
f7e0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
f7f0: 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  ){.        dest.
f800: 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b  eDest = SRT_Mem;
f810: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f820: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f830: 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
f840: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  SDParm);.       
f850: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
f860: 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
f870: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
f880: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f890: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
f8a0: 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
f8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f8c0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
f8d0: 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
f8e0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
f8f0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
f900: 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
f910: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
f920: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
f930: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
f940: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  pSel->pLimit);. 
f950: 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
f960: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
f970: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45  (pParse, TK_INTE
f980: 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  GER, 0, 0,.     
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 71               &sq
f9b0: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
f9c0: 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  ]);.      pSel->
f9d0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
f9e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
f9f0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
fa00: 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
fa10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
fa20: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67      }.      rReg
fa30: 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
fa40: 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 49 72  .      ExprSetIr
fa50: 72 65 64 75 63 69 62 6c 65 28 70 45 78 70 72 29  reducible(pExpr)
fa60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fa70: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
fa80: 74 65 73 74 41 64 64 72 3e 3d 30 20 29 7b 0a 20  testAddr>=0 ){. 
fa90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
faa0: 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41 64  mpHere(v, testAd
fab0: 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  dr);.  }.  sqlit
fac0: 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
fad0: 50 61 72 73 65 2c 20 31 29 3b 0a 0a 20 20 72 65  Parse, 1);..  re
fae0: 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
faf0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
fb00: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
fb10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fb20: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
fb30: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
fb40: 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65   for an IN expre
fb50: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
fb60: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
fb70: 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  ..).**      x IN
fb80: 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
fb90: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ...).**.** The l
fba0: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c  eft-hand side (L
fbb0: 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20  HS) is a scalar 
fbc0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
fbd0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
fbe0: 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20   (RHS).** is an 
fbf0: 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72  array of zero or
fc00: 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54   more values.  T
fc10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
fc20: 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53   true if the LHS
fc30: 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64   is.** contained
fc40: 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
fc50: 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74    The value of t
fc60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
fc70: 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a   unknown (NULL).
fc80: 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ** if the LHS is
fc90: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
fca0: 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
fcb0: 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
fcc0: 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52  RHS and the.** R
fcd0: 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  HS contains one 
fce0: 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
fcf0: 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ues..**.** This 
fd00: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
fd10: 73 20 63 6f 64 65 20 77 69 6c 6c 20 6a 75 6d 70  s code will jump
fd20: 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20   to destIfFalse 
fd30: 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
fd40: 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20  t .** contained 
fd50: 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
fd60: 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73   If due to NULLs
fd70: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
fd80: 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a  mine if the LHS.
fd90: 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ** is contained 
fda0: 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
fdb0: 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75  jump to destIfNu
fdc0: 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20  ll.  If the LHS 
fdd0: 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  is contained.** 
fde0: 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74  within the RHS t
fdf0: 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
fe00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fe10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
fe20: 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  IN(.  Parse *pPa
fe30: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
fe40: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
fe50: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
fe60: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
fe70: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
fe80: 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69   The IN expressi
fe90: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
fea0: 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a  IfFalse,      /*
feb0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48   Jump here if LH
fec0: 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
fed0: 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f  ed in the RHS */
fee0: 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c  .  int destIfNul
fef0: 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  l        /* Jump
ff00: 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73   here if the res
ff10: 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e  ults are unknown
ff20: 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f   due to NULLs */
ff30: 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61  .){.  int rRhsHa
ff40: 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52  sNull = 0;  /* R
ff50: 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20  egister that is 
ff60: 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74  true if RHS cont
ff70: 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
ff80: 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e   */.  char affin
ff90: 69 74 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  ity;        /* C
ffa0: 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69  omparison affini
ffb0: 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69  ty to use */.  i
ffc0: 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  nt eType;       
ffd0: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
ffe0: 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
fff0: 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
10000 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
10010 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
10020 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
10030 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
10040 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
10050 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  ruction */..  /*
10060 20 43 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   Compute the RHS
10070 2e 20 20 20 41 66 74 65 72 20 74 68 69 73 20 73  .   After this s
10080 74 65 70 2c 20 74 68 65 20 74 61 62 6c 65 20 77  tep, the table w
10090 69 74 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  ith cursor.  ** 
100a0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 77 69  pExpr->iTable wi
100b0 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ll contains the 
100c0 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
100d0 20 75 70 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   up the RHS..  *
100e0 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
100f0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
10100 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
10110 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
10120 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
10130 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
10140 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
10150 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
10160 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
10170 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
10180 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 52  arse, pExpr, &rR
10190 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f  hsHasNull);..  /
101a0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
101b0 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   affinity to use
101c0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79   to create a key
101d0 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74   from the result
101e0 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78  s.  ** of the ex
101f0 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69  pression. affini
10200 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73  tyStr stores a s
10210 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69  tatic string sui
10220 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50  table for.  ** P
10230 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4 of OP_MakeReco
10240 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e  rd..  */.  affin
10250 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  ity = comparison
10260 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
10270 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20  ..  /* Code the 
10280 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20  LHS, the <expr> 
10290 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20  from "<expr> IN 
102a0 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73  (...)"..  */.  s
102b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
102c0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72  ush(pParse);.  r
102d0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
102e0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
102f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10300 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10310 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20 2f  pLeft, r1);..  /
10320 2a 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20  * If the LHS is 
10330 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72  NULL, then the r
10340 65 73 75 6c 74 20 69 73 20 65 69 74 68 65 72 20  esult is either 
10350 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65  false or NULL de
10360 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20  pending.  ** on 
10370 77 68 65 74 68 65 72 20 74 68 65 20 52 48 53 20  whether the RHS 
10380 69 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c  is empty or not,
10390 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
103a0 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66   */.  if( destIf
103b0 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
103c0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 72  e ){.    /* Shor
103d0 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 6f 6d  tcut for the com
103e0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
103f0 68 65 20 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c  he false and NUL
10400 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a 20  L outcomes are. 
10410 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20     ** the same. 
10420 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
10430 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10440 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49  sNull, r1, destI
10450 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  fNull);.  }else{
10460 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d  .    int addr1 =
10470 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10480 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
10490 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , r1);.    sqlit
104a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
104b0 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72  OP_Rewind, pExpr
104c0 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
104d0 46 61 6c 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  False);.    sqli
104e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
104f0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
10500 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  tIfNull);.    sq
10510 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10520 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 7d  e(v, addr1);.  }
10530 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49  ..  if( eType==I
10540 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
10550 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
10560 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73  case, the RHS is
10570 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61   the ROWID of ta
10580 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20 2a  ble b-tree.    *
10590 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
105a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
105b0 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64 65 73  stBeInt, r1, des
105c0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 73  tIfFalse);.    s
105d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
105e0 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
105f0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10600 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
10610 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10620 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
10630 20 74 68 65 20 52 48 53 20 69 73 20 61 6e 20 69   the RHS is an i
10640 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20 20 20  ndex b-tree..   
10650 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
10660 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10670 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c  Affinity, r1, 1,
10680 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
10690 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
106a0 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  e set membership
106b0 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65   test fails, the
106c0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
106d0 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 78 20 49  the .    ** "x I
106e0 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73  N (...)" express
106f0 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68  ion must be eith
10700 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66  er 0 or NULL. If
10710 20 74 68 65 20 73 65 74 0a 20 20 20 20 2a 2a 20   the set.    ** 
10720 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
10730 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68   values, then th
10740 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49  e result is 0. I
10750 66 20 74 68 65 20 73 65 74 20 0a 20 20 20 20 2a  f the set .    *
10760 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  * contains one o
10770 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
10780 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
10790 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ult of the.    *
107a0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  * expression is 
107b0 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  also NULL..    *
107c0 2f 0a 20 20 20 20 69 66 28 20 72 52 68 73 48 61  /.    if( rRhsHa
107d0 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20 64 65 73 74  sNull==0 || dest
107e0 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
107f0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ull ){.      /* 
10800 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
10810 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20   if it is known 
10820 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  at compile time 
10830 74 68 61 74 20 74 68 65 20 52 48 53 0a 20 20 20  that the RHS.   
10840 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e     ** cannot con
10850 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73  tain NULL values
10860 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 61  . This happens a
10870 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  s the result.   
10880 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20     ** of a "NOT 
10890 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
108a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
108b0 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 20 20 2a   schema..      *
108c0 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20  *.      ** Also 
108d0 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20  run this branch 
108e0 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76  if NULL is equiv
108f0 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20  alent to FALSE. 
10900 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73       ** for this
10910 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f   particular IN o
10920 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20 20 2a  perator..      *
10930 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
10940 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
10950 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78  OP_NotFound, pEx
10960 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
10970 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b  IfFalse, r1, 1);
10980 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ..    }else{.   
10990 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72     /* In this br
109a0 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66  anch, the RHS of
109b0 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f   the IN might co
109c0 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64  ntain a NULL and
109d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
109e0 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c  esence of a NULL
109f0 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65   on the RHS make
10a00 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 20 69  s a difference i
10a10 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f  n the.      ** o
10a20 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 2a 2f  utcome..      */
10a30 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  .      int j1, j
10a40 32 2c 20 6a 33 3b 0a 0a 20 20 20 20 20 20 2f 2a  2, j3;..      /*
10a50 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
10a60 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  see if the LHS i
10a70 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
10a80 68 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a  he RHS.  If so,.
10a90 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
10aa0 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55  e presence of NU
10ab0 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 64  LLs in the RHS d
10ac0 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2c 20  oes not matter, 
10ad0 73 6f 20 6a 75 6d 70 0a 20 20 20 20 20 20 2a 2a  so jump.      **
10ae0 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
10af0 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f   code that follo
10b00 77 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ws..      */.   
10b10 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
10b20 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
10b30 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
10b40 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20  >iTable, 0, r1, 
10b50 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 48 65  1);..      /* He
10b60 72 65 20 77 65 20 62 65 67 69 6e 20 67 65 6e 65  re we begin gene
10b70 72 61 74 69 6e 67 20 63 6f 64 65 20 74 68 61 74  rating code that
10b80 20 72 75 6e 73 20 69 66 20 74 68 65 20 4c 48 53   runs if the LHS
10b90 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   is not.      **
10ba0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
10bb0 6e 20 74 68 65 20 52 48 53 2e 20 20 47 65 6e 65  n the RHS.  Gene
10bc0 72 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  rate additional 
10bd0 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 20 20  code that.      
10be0 2a 2a 20 74 65 73 74 73 20 74 68 65 20 52 48 53  ** tests the RHS
10bf0 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20 49 66 20   for NULLs.  If 
10c00 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  the RHS contains
10c10 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a 20 20 20   a NULL then.   
10c20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65     ** jump to de
10c30 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
10c40 65 72 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 73  ere are no NULLs
10c50 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
10c60 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74  .      ** jump t
10c70 6f 20 64 65 73 74 49 66 46 61 6c 73 65 2e 0a 20  o destIfFalse.. 
10c80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 32       */.      j2
10c90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10ca0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp1(v, OP_NotNu
10cb0 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 29  ll, rRhsHasNull)
10cc0 3b 0a 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c  ;.      j3 = sql
10cd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
10ce0 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  t(v, OP_Found, p
10cf0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
10d00 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 31 29   rRhsHasNull, 1)
10d10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10d20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10d30 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 52 68  Integer, -1, rRh
10d40 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
10d50 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10d60 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20  Here(v, j3);.   
10d70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10d80 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
10d90 6d 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  m, rRhsHasNull, 
10da0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
10db0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10dc0 20 6a 32 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   j2);..      /* 
10dd0 4a 75 6d 70 20 74 6f 20 74 68 65 20 61 70 70 72  Jump to the appr
10de0 6f 70 72 69 61 74 65 20 74 61 72 67 65 74 20 64  opriate target d
10df0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
10e00 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 20  her or not.     
10e10 20 2a 2a 20 74 68 65 20 52 48 53 20 63 6f 6e 74   ** the RHS cont
10e20 61 69 6e 73 20 61 20 4e 55 4c 4c 0a 20 20 20 20  ains a NULL.    
10e30 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
10e40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10e50 4f 50 5f 49 66 2c 20 72 52 68 73 48 61 73 4e 75  OP_If, rRhsHasNu
10e60 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  ll, destIfNull);
10e70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10e80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
10e90 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61  oto, 0, destIfFa
10ea0 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  lse);..      /* 
10eb0 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20 61 74 20  The OP_Found at 
10ec0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20  the top of this 
10ed0 62 72 61 6e 63 68 20 6a 75 6d 70 73 20 68 65 72  branch jumps her
10ee0 65 20 77 68 65 6e 20 74 72 75 65 2c 20 0a 20 20  e when true, .  
10ef0 20 20 20 20 2a 2a 20 63 61 75 73 69 6e 67 20 74      ** causing t
10f00 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e 20 65 78  he overall IN ex
10f10 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
10f20 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f  ion to fall thro
10f30 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ugh..      */.  
10f40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
10f50 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
10f60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
10f70 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
10f80 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
10f90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
10fa0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
10fb0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
10fc0 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22  v, "end IN expr"
10fd0 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
10fe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
10ff0 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  UERY */../*.** D
11000 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79  uplicate an 8-by
11010 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74  te value.*/.stat
11020 69 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74  ic char *dup8byt
11030 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  es(Vdbe *v, cons
11040 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63  t char *in){.  c
11050 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74  har *out = sqlit
11060 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71  e3DbMallocRaw(sq
11070 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
11080 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b  8);.  if( out ){
11090 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c  .    memcpy(out,
110a0 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72   in, 8);.  }.  r
110b0 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69  eturn out;.}..#i
110c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
110d0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
110e0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
110f0 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
11100 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
11110 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
11120 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
11130 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
11140 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
11150 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
11160 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
11170 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
11180 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
11190 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
111a0 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
111b0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
111c0 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
111d0 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
111e0 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
111f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
11200 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
11210 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
11220 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
11230 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c  *z, int negateFl
11240 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
11250 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30   if( ALWAYS(z!=0
11260 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
11270 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20  value;.    char 
11280 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  *zV;.    sqlite3
11290 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20  AtoF(z, &value, 
112a0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
112b0 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
112c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73  ;.    assert( !s
112d0 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
112e0 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77  e) ); /* The new
112f0 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75   AtoF never retu
11300 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69  rns NaN */.    i
11310 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
11320 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
11330 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
11340 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
11350 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lue);.    sqlite
11360 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11370 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
11380 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29   0, zV, P4_REAL)
11390 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
113a0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
113b0 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
113c0 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
113d0 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
113e0 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
113f0 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
11400 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
11410 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69   Expr.u.zToken i
11420 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e  s always UTF8 an
11430 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  d zero-terminate
11440 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
11450 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61  d codeInteger(Pa
11460 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
11470 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65  r *pExpr, int ne
11480 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  gFlag, int iMem)
11490 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
114a0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
114b0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
114c0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
114d0 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78  .    int i = pEx
114e0 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20  pr->u.iValue;.  
114f0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29    assert( i>=0 )
11500 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61  ;.    if( negFla
11510 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20  g ) i = -i;.    
11520 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11530 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
11540 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c   i, iMem);.  }el
11550 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20  se{.    int c;. 
11560 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
11570 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
11580 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
11590 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  n;.    assert( z
115a0 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73  !=0 );.    c = s
115b0 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20  qlite3Atoi64(z, 
115c0 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53  &value, sqlite3S
115d0 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
115e0 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 69 66  TE_UTF8);.    if
115f0 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20  ( c==0 || (c==2 
11600 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20  && negFlag) ){. 
11610 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20       char *zV;. 
11620 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
11630 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32   ){ value = c==2
11640 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
11650 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
11660 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
11670 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
11680 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lue);.      sqli
11690 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
116a0 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
116b0 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e  em, 0, zV, P4_IN
116c0 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  T64);.    }else{
116d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
116e0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
116f0 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  NT.      sqlite3
11700 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11710 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65   "oversized inte
11720 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  ger: %s%s", negF
11730 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  lag ? "-" : "", 
11740 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  z);.#else.      
11750 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e  codeReal(v, z, n
11760 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 23  egFlag, iMem);.#
11770 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
11780 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
11790 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f   cache entry..*/
117a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
117b0 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72  heEntryClear(Par
117c0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
117d0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29  ct yColCache *p)
117e0 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52  {.  if( p->tempR
117f0 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  eg ){.    if( pP
11800 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
11810 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
11820 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
11830 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
11840 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
11850 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52  mpReg++] = p->iR
11860 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  eg;.    }.    p-
11870 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
11880 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
11890 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
118a0 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
118b0 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
118c0 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
118d0 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
118e0 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
118f0 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
11900 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
11910 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
11920 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
11930 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
11940 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
11950 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
11960 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
11970 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
11980 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74  he *p;..  assert
11990 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a 20  ( iReg>0 );  /* 
119a0 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  Register numbers
119b0 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69   are always posi
119c0 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  tive */.  assert
119d0 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43  ( iCol>=-1 && iC
119e0 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20  ol<32768 );  /* 
119f0 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75  Finite column nu
11a00 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54  mbers */..  /* T
11a10 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  he SQLITE_Column
11a20 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61 62  Cache flag disab
11a30 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  les the column c
11a40 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20 75  ache.  This is u
11a50 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73  sed.  ** for tes
11a60 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76  ting only - to v
11a70 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69 74  erify that SQLit
11a80 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74 68  e always gets th
11a90 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
11aa0 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74 68  ** with and with
11ab0 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  out the column c
11ac0 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ache..  */.  if(
11ad0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
11ae0 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
11af0 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43  , SQLITE_ColumnC
11b00 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a  ache) ) return;.
11b10 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c  .  /* First repl
11b20 61 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ace any existing
11b30 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   entry..  **.  *
11b40 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
11b50 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  way the column c
11b60 61 63 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c  ache is currentl
11b70 79 20 75 73 65 64 2c 20 77 65 20 61 72 65 20 67  y used, we are g
11b80 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74  uaranteed.  ** t
11b90 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77  hat the object w
11ba0 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64  ill never alread
11bb0 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20  y be in cache.  
11bc0 56 65 72 69 66 79 20 74 68 69 73 20 67 75 61 72  Verify this guar
11bd0 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e  antee..  */.#ifn
11be0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72  def NDEBUG.  for
11bf0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
11c00 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
11c10 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
11c20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61  i++, p++){.    a
11c30 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d  ssert( p->iReg==
11c40 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d  0 || p->iTable!=
11c50 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75  iTab || p->iColu
11c60 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a  mn!=iCol );.  }.
11c70 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e  #endif..  /* Fin
11c80 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20  d an empty slot 
11c90 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a  and replace it *
11ca0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  /.  for(i=0, p=p
11cb0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11cc0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
11cd0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
11ce0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
11cf0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  g==0 ){.      p-
11d00 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  >iLevel = pParse
11d10 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20  ->iCacheLevel;. 
11d20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d       p->iTable =
11d30 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e   iTab;.      p->
11d40 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a  iColumn = iCol;.
11d50 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
11d60 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74  iReg;.      p->t
11d70 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
11d80 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
11d90 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
11da0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
11db0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
11dc0 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72  place the last r
11dd0 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a  ecently used */.
11de0 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66    minLru = 0x7ff
11df0 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20  fffff;.  idxLru 
11e00 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  = -1;.  for(i=0,
11e10 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
11e20 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
11e30 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
11e40 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
11e50 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20  >lru<minLru ){. 
11e60 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b       idxLru = i;
11e70 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20  .      minLru = 
11e80 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20  p->lru;.    }.  
11e90 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69  }.  if( ALWAYS(i
11ea0 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20  dxLru>=0) ){.   
11eb0 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
11ec0 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b  olCache[idxLru];
11ed0 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d  .    p->iLevel =
11ee0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
11ef0 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61  evel;.    p->iTa
11f00 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
11f10 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
11f20 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  l;.    p->iReg =
11f30 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65   iReg;.    p->te
11f40 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70  mpReg = 0;.    p
11f50 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
11f60 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
11f70 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a   return;.  }.}..
11f80 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
11f90 68 61 74 20 72 65 67 69 73 74 65 72 73 20 62 65  hat registers be
11fa0 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67  tween iReg..iReg
11fb0 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e  +nReg-1 are bein
11fc0 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a  g overwritten..*
11fd0 2a 20 50 75 72 67 65 20 74 68 65 20 72 61 6e 67  * Purge the rang
11fe0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66  e of registers f
11ff0 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
12000 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ache..*/.void sq
12010 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
12020 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  move(Parse *pPar
12030 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
12040 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
12050 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20  ;.  int iLast = 
12060 69 52 65 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b  iReg + nReg - 1;
12070 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
12080 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
12090 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
120a0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
120b0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
120c0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
120d0 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
120e0 20 69 66 28 20 72 3e 3d 69 52 65 67 20 26 26 20   if( r>=iReg && 
120f0 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  r<=iLast ){.    
12100 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
12110 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
12120 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b      p->iReg = 0;
12130 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12140 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65  .** Remember the
12150 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20   current column 
12160 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20  cache context.  
12170 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20  Any new entries 
12180 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74  added.** added t
12190 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  o the column cac
121a0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61  he after this ca
121b0 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77  ll are removed w
121c0 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  hen the.** corre
121d0 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63  sponding pop occ
121e0 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
121f0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
12200 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  h(Parse *pParse)
12210 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  {.  pParse->iCac
12220 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  heLevel++;.}../*
12230 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20  .** Remove from 
12240 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
12250 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61   any entries tha
12260 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69 6e  t were added sin
12270 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72  ce the.** the pr
12280 65 76 69 6f 75 73 20 4e 20 50 75 73 68 20 6f 70  evious N Push op
12290 65 72 61 74 69 6f 6e 73 2e 20 20 49 6e 20 6f 74  erations.  In ot
122a0 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f  her words, resto
122b0 72 65 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  re the cache.** 
122c0 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20  to the state it 
122d0 77 61 73 20 69 6e 20 4e 20 50 75 73 68 65 73 20  was in N Pushes 
122e0 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ago..*/.void sql
122f0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
12300 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12310 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b  int N){.  int i;
12320 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
12330 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  che *p;.  assert
12340 28 20 4e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ( N>0 );.  asser
12350 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  t( pParse->iCach
12360 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a 20 20 70  eLevel>=N );.  p
12370 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
12380 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66 6f 72 28 69  el -= N;.  for(i
12390 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
123a0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
123b0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
123c0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
123d0 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69   p->iReg && p->i
123e0 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43  Level>pParse->iC
123f0 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20  acheLevel ){.   
12400 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
12410 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
12420 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
12430 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12440 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68  *.** When a cach
12450 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75  ed column is reu
12460 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  sed, make sure t
12470 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72  hat its register
12480 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
12490 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20   available as a 
124a0 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20  temp register.  
124b0 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74  ticket #3879:  t
124c0 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69  hat same.** regi
124d0 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e  ster might be in
124e0 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75   the cache in mu
124f0 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73  ltiple places, s
12500 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20  o be sure to.** 
12510 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f  get them all..*/
12520 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
12530 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
12540 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a  Register(Parse *
12550 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
12560 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
12570 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
12580 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
12590 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
125a0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
125b0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
125c0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
125d0 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
125e0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
125f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12600 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12610 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
12620 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
12630 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
12640 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
12650 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
12660 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
12670 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  e(.  Vdbe *v,   
12680 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
12690 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
126a0 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ion */.  Table *
126b0 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20  pTab,    /* The 
126c0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
126d0 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20   the value */.  
126e0 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
126f0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 66 6f  /* The cursor fo
12700 72 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  r this table */.
12710 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
12720 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
12730 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72  e column to extr
12740 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  act */.  int reg
12750 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72  Out      /* Extr
12760 61 63 74 20 74 68 65 20 76 61 6c 75 64 20 69 6e  act the valud in
12770 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72  to this register
12780 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f   */.){.  if( iCo
12790 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61  l<0 || iCol==pTa
127a0 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
127b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
127c0 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
127d0 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b  TabCur, regOut);
127e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
127f0 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c  t op = IsVirtual
12800 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c  (pTab) ? OP_VCol
12810 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b  umn : OP_Column;
12820 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12830 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54  AddOp3(v, op, iT
12840 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67  abCur, iCol, reg
12850 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Out);.  }.  if( 
12860 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  iCol>=0 ){.    s
12870 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
12880 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
12890 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
128a0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
128b0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
128c0 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
128d0 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
128e0 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
128f0 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
12900 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
12910 61 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20  a register.  An 
12920 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64  effort.** is mad
12930 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
12940 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
12950 65 67 69 73 74 65 72 20 69 52 65 67 2c 20 62 75  egister iReg, bu
12960 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74  t this is.** not
12970 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68   guaranteed.  Th
12980 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
12990 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
129a0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
129b0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
129c0 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
129d0 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65  o pTab in iTable
129e0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
129f0 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  ne.** is called.
12a00 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74    If iColumn<0 t
12a10 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65  hen code is gene
12a20 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
12a30 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
12a40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
12a50 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a  rCodeGetColumn(.
12a60 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12a70 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
12a80 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
12a90 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
12aa0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
12ab0 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
12ac0 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
12ad0 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
12ae0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
12af0 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
12b00 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
12b10 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
12b20 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
12b30 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
12b40 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
12b50 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20    int iReg,     
12b60 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
12b70 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38  lts here */.  u8
12b80 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f   p5            /
12b90 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f  * P5 value for O
12ba0 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  P_Column */.){. 
12bb0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
12bc0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
12bd0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
12be0 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72  Cache *p;..  for
12bf0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
12c00 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
12c10 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
12c20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
12c30 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20  f( p->iReg>0 && 
12c40 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  p->iTable==iTabl
12c50 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d  e && p->iColumn=
12c60 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
12c70 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
12c80 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
12c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12ca0 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
12cb0 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65  r(pParse, p->iRe
12cc0 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
12cd0 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
12ce0 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20    }  .  assert( 
12cf0 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
12d00 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
12d10 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61  mnOfTable(v, pTa
12d20 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  b, iTable, iColu
12d30 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28  mn, iReg);.  if(
12d40 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   p5 ){.    sqlit
12d50 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
12d60 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20  , p5);.  }else{ 
12d70 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78    .    sqlite3Ex
12d80 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
12d90 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  rse, iTable, iCo
12da0 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d  lumn, iReg);.  }
12db0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
12dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
12dd0 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  ll column cache 
12de0 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64  entries..*/.void
12df0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12e00 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  eClear(Parse *pP
12e10 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
12e20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
12e30 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  he *p;..  for(i=
12e40 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
12e50 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
12e60 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
12e70 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
12e80 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20  p->iReg ){.     
12e90 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
12ea0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
12eb0 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
12ec0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12ed0 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61  ** Record the fa
12ee0 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e  ct that an affin
12ef0 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f  ity change has o
12f00 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e  ccurred on iCoun
12f10 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73  t.** registers s
12f20 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74  tarting with iSt
12f30 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  art..*/.void sql
12f40 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
12f50 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73  inityChange(Pars
12f60 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
12f70 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e  Start, int iCoun
12f80 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t){.  sqlite3Exp
12f90 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
12fa0 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f  rse, iStart, iCo
12fb0 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  unt);.}../*.** G
12fc0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12fd0 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  move content fro
12fe0 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f  m registers iFro
12ff0 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31  m...iFrom+nReg-1
13000 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e  .** over to iTo.
13010 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65  .iTo+nReg-1. Kee
13020 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  p the column cac
13030 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a  he up-to-date..*
13040 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
13050 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65  prCodeMove(Parse
13060 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
13070 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e  rom, int iTo, in
13080 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
13090 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
130a0 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72  ache *p;.  asser
130b0 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52  t( iFrom>=iTo+nR
130c0 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67  eg || iFrom+nReg
130d0 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74  <=iTo );.  sqlit
130e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61  e3VdbeAddOp3(pPa
130f0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d  rse->pVdbe, OP_M
13100 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c  ove, iFrom, iTo,
13110 20 6e 52 65 67 2d 31 29 3b 0a 20 20 66 6f 72 28   nReg-1);.  for(
13120 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
13130 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
13140 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
13150 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
13160 74 20 78 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t x = p->iReg;. 
13170 20 20 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20     if( x>=iFrom 
13180 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20  && x<iFrom+nReg 
13190 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  ){.      p->iReg
131a0 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20   += iTo-iFrom;. 
131b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20     }.  }.}..#if 
131c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
131d0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
131e0 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45  (SQLITE_COVERAGE
131f0 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
13200 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
13210 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
13220 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f  range iFrom..iTo
13230 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20   (inclusive).** 
13240 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
13250 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  of the column ca
13260 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
13270 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
13280 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
13290 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d  and testcase() m
132a0 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e  acros only.** an
132b0 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  d does not appea
132c0 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75  r in a normal bu
132d0 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ild..*/.static i
132e0 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  nt usedAsColumnC
132f0 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
13300 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
13310 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69  nt iTo){.  int i
13320 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
13330 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
13340 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
13350 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
13360 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
13370 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
13380 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   r = p->iReg;.  
13390 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26    if( r>=iFrom &
133a0 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72  & r<=iTo ) retur
133b0 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53  n 1;    /*NO_TES
133c0 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  T*/.  }.  return
133d0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
133e0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20  SQLITE_DEBUG || 
133f0 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
13400 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  TEST */../*.** G
13410 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
13420 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
13430 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
13440 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
13450 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
13460 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
13470 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
13480 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
13490 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
134a0 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
134b0 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
134c0 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
134d0 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
134e0 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
134f0 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
13500 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
13510 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
13520 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
13530 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
13540 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
13550 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
13560 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
13570 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
13580 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
13590 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
135a0 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
135b0 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
135c0 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
135d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
135e0 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
135f0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
13600 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
13610 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
13620 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
13630 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
13640 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
13650 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
13660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13670 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
13680 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
13690 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
136a0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
136b0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
136c0 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
136d0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
136e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
136f0 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
13700 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
13710 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
13720 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
13730 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
13740 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
13750 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
13760 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c  */.  int r1, r2,
13770 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f   r3, r4;       /
13780 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
13790 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
137a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
137b0 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
137c0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
137d0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tion */..  asser
137e0 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
137f0 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
13800 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  Mem );.  if( v==
13810 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
13820 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
13830 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
13840 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
13850 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
13860 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
13870 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
13880 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
13890 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
138a0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
138b0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
138c0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
138d0 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
138e0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
138f0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
13900 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
13910 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
13920 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
13930 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
13940 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
13950 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
13960 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
13970 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c      inReg = pCol
13980 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->iMem;.        
13990 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
139a0 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
139b0 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
139c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
139d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
139e0 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
139f0 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54  fo->sortingIdxPT
13a00 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
13a30 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
13a40 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
13a60 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
13a70 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
13a80 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a  _COLUMN case */.
13a90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13aa0 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
13ab0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
13ac0 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ble<0 ){.       
13ad0 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
13ae0 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e  ppens when codin
13af0 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69  g check constrai
13b00 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
13b10 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63  ssert( pParse->c
13b20 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20 20  kBase>0 );.     
13b30 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
13b40 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72  ->iColumn + pPar
13b50 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20  se->ckBase;.    
13b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13b70 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
13b80 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
13b90 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  n(pParse, pExpr-
13ba0 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  >pTab,.         
13bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bc0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
13bd0 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69  Column, pExpr->i
13be0 54 61 62 6c 65 2c 20 74 61 72 67 65 74 2c 0a 20  Table, target,. 
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c10 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20  pExpr->op2);.   
13c20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13c40 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
13c50 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
13c60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
13c70 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
13c80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
13c90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13ca0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
13cb0 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
13cc0 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
13cd0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
13ce0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13cf0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
13d00 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
13d10 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
13d20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
13d30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
13d40 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
13d50 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
13d60 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
13d70 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
13d80 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
13d90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13da0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13db0 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67  String8, 0, targ
13dc0 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  et, 0, pExpr->u.
13dd0 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20  zToken, 0);.    
13de0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13df0 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
13e00 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
13e10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13e20 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
13e30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13e40 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
13e50 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
13e60 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
13e70 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
13e80 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
13e90 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
13ea0 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a     char *zBlob;.
13eb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
13ec0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
13ed0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
13ee0 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
13ef0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
13f00 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  ken[0]=='x' || p
13f10 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
13f20 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
13f30 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
13f40 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27  .zToken[1]=='\''
13f50 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70   );.      z = &p
13f60 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32  Expr->u.zToken[2
13f70 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ];.      n = sql
13f80 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
13f90 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
13fa0 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b  t( z[n]=='\'' );
13fb0 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73  .      zBlob = s
13fc0 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
13fd0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
13fe0 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
13ff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14000 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32  (v, OP_Blob, n/2
14010 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c  , target, 0, zBl
14020 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ob, P4_DYNAMIC);
14030 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14040 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
14050 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
14060 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
14070 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
14080 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
14090 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
140a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
140b0 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20  zToken!=0 );.   
140c0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
140d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30  ->u.zToken[0]!=0
140e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
140f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14100 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
14110 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  r->iColumn, targ
14120 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
14130 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
14140 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
14150 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
14160 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20  .zToken[0]=='?' 
14170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
14180 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
14190 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d  .zToken, pParse-
141a0 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43  >azVar[pExpr->iC
141b0 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a  olumn-1])==0 );.
141c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
141d0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
141e0 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  1, pParse->azVar
141f0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  [pExpr->iColumn-
14200 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  1], P4_STATIC);.
14210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
14220 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14230 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
14240 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
14250 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
14260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14270 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
14280 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  S: {.      inReg
14290 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
142a0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
142b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
142c0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
142d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
142e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
142f0 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
14300 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
14310 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
14320 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
14330 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
14340 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
14350 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20  f, to_op;.      
14360 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
14370 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
14380 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14390 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
143a0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
143b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
143c0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
143d0 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73  );.      aff = s
143e0 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
143f0 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
14400 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70  en);.      to_op
14410 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f   = aff - SQLITE_
14420 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f  AFF_TEXT + OP_To
14430 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Text;.      asse
14440 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
14450 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d  Text    || aff!=
14460 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
14470 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
14480 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
14490 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d  Blob    || aff!=
144a0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
144b0 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
144c0 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
144d0 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d  Numeric || aff!=
144e0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
144f0 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  IC );.      asse
14500 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
14510 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d  Int     || aff!=
14520 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
14530 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ER );.      asse
14540 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
14550 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d  Real    || aff!=
14560 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
14570 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74     );.      test
14580 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
14590 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20 20  ToText );.      
145a0 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
145b0 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20  =OP_ToBlob );.  
145c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
145d0 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69  _op==OP_ToNumeri
145e0 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  c );.      testc
145f0 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
14600 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65  oInt );.      te
14610 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
14620 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20  P_ToReal );.    
14630 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
14640 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  get ){.        s
14650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14660 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  (v, OP_SCopy, in
14670 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
14680 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
14690 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
146a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
146b0 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20  ddOp1(v, to_op, 
146c0 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74 65  inReg);.      te
146d0 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f  stcase( usedAsCo
146e0 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
146f0 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20  , inReg, inReg) 
14700 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14710 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
14720 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
14730 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20  inReg, 1);.     
14740 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
14750 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
14760 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
14770 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
14780 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
14790 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
147a0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
147b0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
147c0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
147d0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
147e0 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
147f0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
14800 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
14810 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
14820 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
14830 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
14840 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
14850 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
14860 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14870 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
14880 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14890 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
148a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
148b0 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
148c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
148d0 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
148e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
148f0 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
14900 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
14910 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14920 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
14930 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
14940 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
14950 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14960 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
14970 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
14980 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14990 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
149a0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
149b0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
149c0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
149d0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
149e0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
14a10 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
14a20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14a30 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
14a40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14a50 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
14a60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14a70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
14a80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
14a90 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
14aa0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20  case( op==TK_IS 
14ab0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14ac0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  e( op==TK_ISNOT 
14ad0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
14ae0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
14af0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
14b00 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
14b10 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
14b20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
14b30 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
14b40 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
14b50 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  ee2);.      op =
14b60 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
14b70 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
14b80 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
14b90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14ba0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
14bb0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
14bc0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
14bd0 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45  2, inReg, SQLITE
14be0 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c 49 54  _STOREP2 | SQLIT
14bf0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
14c00 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14c10 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
14c20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
14c30 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
14c40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14c50 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
14c60 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
14c70 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
14c80 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
14c90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
14ca0 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
14cb0 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
14cc0 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
14cd0 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
14ce0 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
14cf0 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
14d00 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
14d10 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
14d20 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
14d30 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41      assert( TK_A
14d40 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20  ND==OP_And );.  
14d50 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
14d60 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20  R==OP_Or );.    
14d70 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
14d80 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20  S==OP_Add );.   
14d90 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49     assert( TK_MI
14da0 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74  NUS==OP_Subtract
14db0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14dc0 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
14dd0 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20  ainder );.      
14de0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e  assert( TK_BITAN
14df0 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a  D==OP_BitAnd );.
14e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14e10 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72  _BITOR==OP_BitOr
14e20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14e30 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44  ( TK_SLASH==OP_D
14e40 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61  ivide );.      a
14e50 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54  ssert( TK_LSHIFT
14e60 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29  ==OP_ShiftLeft )
14e70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14e80 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
14e90 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20  iftRight );.    
14ea0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e    assert( TK_CON
14eb0 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29  CAT==OP_Concat )
14ec0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14ed0 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ( op==TK_AND );.
14ee0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14ef0 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20  op==TK_OR );.   
14f00 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14f10 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
14f20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14f30 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20  TK_MINUS );.    
14f40 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14f50 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20  TK_REM );.      
14f60 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14f70 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20  _BITAND );.     
14f80 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14f90 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20  K_BITOR );.     
14fa0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14fb0 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20  K_SLASH );.     
14fc0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14fd0 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_LSHIFT );.    
14fe0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14ff0 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
15000 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15010 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20  =TK_CONCAT );.  
15020 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
15030 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15040 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15050 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
15060 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
15070 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
15080 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
15090 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
150a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
150b0 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
150c0 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
150d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
150e0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
150f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15100 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
15110 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15120 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
15130 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
15140 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
15150 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
15160 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
15170 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
15180 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
15190 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
151a0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
151b0 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74  pLeft, 1, target
151c0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
151d0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
151e0 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73  POINT.      }els
151f0 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d  e if( pLeft->op=
15200 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
15210 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
15220 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
15230 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
15240 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) );.        cod
15250 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e  eReal(v, pLeft->
15260 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72  u.zToken, 1, tar
15270 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  get);.#endif.   
15280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15290 20 20 72 65 67 46 72 65 65 31 20 3d 20 72 31 20    regFree1 = r1 
152a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
152b0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
152c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
152d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
152e0 65 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20  eger, 0, r1);.  
152f0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
15300 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
15310 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
15320 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  eft, &regFree2);
15330 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15340 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15350 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72  _Subtract, r2, r
15360 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
15370 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15380 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
15390 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
153a0 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
153b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
153c0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
153d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
153e0 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
153f0 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50  t( TK_BITNOT==OP
15400 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20  _BitNot );.     
15410 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d   assert( TK_NOT=
15420 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20  =OP_Not );.     
15430 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15440 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20  K_BITNOT );.    
15450 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15460 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_NOT );.      
15470 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
15480 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
15490 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
154a0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
154b0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
154c0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
154d0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
154e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
154f0 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
15500 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  1, inReg);.     
15510 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15520 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
15530 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
15540 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
15550 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
15560 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
15570 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
15580 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15590 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
155a0 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ull );.      tes
155b0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
155c0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
155d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
155e0 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
155f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15600 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
15610 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
15620 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
15630 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15640 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15650 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
15660 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15670 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
15680 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
15690 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
156a0 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  p, r1);.      sq
156b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
156c0 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61  v, OP_AddImm, ta
156d0 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20  rget, -1);.     
156e0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
156f0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
15700 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15710 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
15720 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
15730 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
15740 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
15750 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
15760 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
15770 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
15780 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
15790 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
157a0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
157b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
157c0 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
157d0 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c  ggregate: %s()",
157e0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
157f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
15800 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
15810 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
15820 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
15830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
15840 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15850 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  ase TK_CONST_FUN
15860 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  C:.    case TK_F
15870 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
15880 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67   ExprList *pFarg
15890 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
158a0 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
158b0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
158c0 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20  nt nFarg;       
158d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
158e0 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
158f0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46  ments */.      F
15900 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
15910 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
15920 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
15930 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20   object */.     
15940 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20   int nId;       
15950 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
15960 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  h of the functio
15970 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  n name in bytes 
15980 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
15990 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
159a0 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
159b0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  name */.      in
159c0 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  t constMask = 0;
159d0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
159e0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
159f0 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
15a00 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
15a10 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
15a20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15a30 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38  nter */.      u8
15a40 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20   enc = ENC(db); 
15a50 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
15a60 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62   encoding used b
15a70 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
15a80 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
15a90 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20   *pColl = 0;    
15aa0 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73  /* A collating s
15ab0 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20  equence */..    
15ac0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
15ad0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
15ae0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
15af0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15b00 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f  e( op==TK_CONST_
15b10 46 55 4e 43 20 29 3b 0a 20 20 20 20 20 20 74 65  FUNC );.      te
15b20 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46  stcase( op==TK_F
15b30 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
15b40 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50   if( ExprHasAnyP
15b50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
15b60 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
15b70 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
15b80 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
15b90 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
15ba0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
15bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
15bc0 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46  arg = pFarg ? pF
15bd0 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  arg->nExpr : 0;.
15be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
15bf0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
15c00 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
15c10 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20  e) );.      zId 
15c20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
15c30 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73  n;.      nId = s
15c40 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
15c50 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20  Id);.      pDef 
15c60 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
15c70 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e  ction(db, zId, n
15c80 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  Id, nFarg, enc, 
15c90 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
15ca0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
15cb0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15cc0 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
15cd0 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73  n function: %.*s
15ce0 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  ()", nId, zId);.
15cf0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15d00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
15d10 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63   Attempt a direc
15d20 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
15d30 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   of the built-in
15d40 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a   COALESCE() and.
15d50 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28        ** IFNULL(
15d60 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  ) functions.  Th
15d70 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65  is avoids unnece
15d80 73 73 61 72 79 20 65 76 61 6c 61 74 69 6f 6e 20  ssary evalation 
15d90 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  of.      ** argu
15da0 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66  ments past the f
15db0 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72  irst non-NULL ar
15dc0 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
15dd0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
15de0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
15df0 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b  FUNC_COALESCE ){
15e00 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64  .        int end
15e10 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74  Coalesce = sqlit
15e20 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
15e30 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  v);.        asse
15e40 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a  rt( nFarg>=2 );.
15e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15e60 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
15e70 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
15e80 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
15e90 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
15ea0 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
15eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15ec0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f  eAddOp2(v, OP_No
15ed0 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65  tNull, target, e
15ee0 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
15ef0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15f00 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
15f10 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29  arse, target, 1)
15f20 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15f30 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
15f40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
15f50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
15f60 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
15f70 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74  g->a[i].pExpr, t
15f80 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
15f90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
15fa0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
15fb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15fc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15fd0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
15fe0 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
15ff0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16000 20 20 7d 0a 0a 0a 20 20 20 20 20 20 69 66 28 20    }...      if( 
16010 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  pFarg ){.       
16020 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
16030 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
16040 2c 20 6e 46 61 72 67 29 3b 0a 0a 20 20 20 20 20  , nFarg);..     
16050 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68     /* For length
16060 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20  () and typeof() 
16070 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61  functions with a
16080 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74   column argument
16090 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  ,.        ** set
160a0 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65   the P5 paramete
160b0 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75  r to the OP_Colu
160c0 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46  mn opcode to OPF
160d0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20  LAG_LENGTHARG.  
160e0 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c        ** or OPFL
160f0 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73  AG_TYPEOFARG res
16100 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76  pectively, to av
16110 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
16120 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  data.        ** 
16130 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20  loading..       
16140 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
16150 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 28  (pDef->flags & (
16160 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
16170 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  TH|SQLITE_FUNC_T
16180 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20  YPEOF))!=0 ){.  
16190 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f          u8 exprO
161a0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
161b0 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
161c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
161d0 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  t( pFarg->a[0].p
161e0 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
161f0 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46       exprOp = pF
16200 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
16210 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  >op;.          i
16220 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f  f( exprOp==TK_CO
16230 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d  LUMN || exprOp==
16240 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
16250 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
16260 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
16270 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f  _LENGTH==OPFLAG_
16280 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
16290 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
162a0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
162b0 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45  EOF==OPFLAG_TYPE
162c0 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  OFARG );.       
162d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
162e0 44 65 66 2d 3e 66 6c 61 67 73 3d 3d 53 51 4c 49  Def->flags==SQLI
162f0 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 20 29  TE_FUNC_LENGTH )
16300 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ;.            pF
16310 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
16320 3e 6f 70 32 20 3d 20 70 44 65 66 2d 3e 66 6c 61  >op2 = pDef->fla
16330 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  gs;.          }.
16340 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
16350 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
16360 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
16370 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
16380 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
16390 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
163a0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
163b0 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31  Parse, pFarg, r1
163c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
163d0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
163e0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 20 20 20  p(pParse, 1);   
163f0 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32  /* Ticket 2ea242
16400 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20  5d34be */.      
16410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
16420 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  1 = 0;.      }.#
16430 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16440 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
16450 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
16460 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
16470 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
16480 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
16490 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
164a0 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
164b0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
164c0 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
164d0 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
164e0 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
164f0 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
16500 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
16510 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
16520 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
16530 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
16540 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
16550 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
16560 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
16570 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
16580 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
16590 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
165a0 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
165b0 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
165c0 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
165d0 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
165e0 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
165f0 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
16600 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
16610 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
16620 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
16630 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
16640 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
16650 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
16660 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
16670 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
16680 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
16690 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
166a0 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
166b0 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
166c0 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
166d0 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
166e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
166f0 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20  if( nFarg>=2 && 
16700 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
16710 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
16720 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
16730 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
16740 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
16750 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
16760 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  rg->a[1].pExpr);
16770 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
16780 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20   nFarg>0 ){.    
16790 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
167a0 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
167b0 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
167c0 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
167d0 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
167e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
167f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72   for(i=0; i<nFar
16800 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
16810 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c   if( i<32 && sql
16820 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
16830 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  nt(pFarg->a[i].p
16840 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
16850 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
16860 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20  (1<<i);.        
16870 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
16880 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
16890 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
168a0 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20  L)!=0 && !pColl 
168b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
168c0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
168d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
168e0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
168f0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
16900 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16910 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
16920 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
16930 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  LL ){.        if
16940 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
16950 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
16960 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
16970 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16980 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
16990 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
169a0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
169b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
169c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
169d0 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c  (v, OP_Function,
169e0 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20   constMask, r1, 
169f0 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f  (char*)pDef, P4_
16a20 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
16a30 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
16a40 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67  eP5(v, (u8)nFarg
16a50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  );.      if( nFa
16a60 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rg ){.        sq
16a70 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16a80 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
16a90 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
16aa0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
16ab0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
16ac0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16ad0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
16ae0 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
16af0 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
16b00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16b10 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
16b20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
16b30 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
16b40 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
16b50 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
16b60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
16b70 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
16b80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16b90 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
16ba0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
16bb0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
16bc0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
16bd0 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
16be0 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
16bf0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
16c00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16c10 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
16c20 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
16c30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
16c40 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
16c50 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
16c60 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
16c70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16c80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
16c90 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
16ca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16cb0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
16cc0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
16cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16ce0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
16cf0 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29  dImm, target, 0)
16d00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16d10 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
16d20 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
16d30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16d40 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
16d50 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16d60 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20  Y */...    /*.  
16d70 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
16d80 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
16d90 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
16da0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
16db0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
16dc0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
16dd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
16de0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
16df0 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
16e00 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
16e10 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
16e20 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
16e30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
16e40 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
16e50 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
16e60 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
16e70 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
16e80 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
16e90 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74  >pLeft;.      st
16ea0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
16eb0 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78  em *pLItem = pEx
16ec0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a  pr->x.pList->a;.
16ed0 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
16ee0 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
16ef0 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d 20  pr;..      r1 = 
16f00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
16f10 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66  emp(pParse, pLef
16f20 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
16f30 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
16f40 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
16f50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72  arse, pRight, &r
16f60 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
16f70 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
16f80 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
16f90 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16fa0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 33  2==0 );.      r3
16fb0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16fc0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16fd0 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33      r4 = sqlite3
16fe0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
16ff0 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  e);.      codeCo
17000 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
17010 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
17020 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Ge,.            
17030 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33        r1, r2, r3
17040 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
17050 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b  );.      pLItem+
17060 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  +;.      pRight 
17070 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
17080 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
17090 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
170a0 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
170b0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
170c0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
170d0 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26  Parse, pRight, &
170e0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
170f0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
17100 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
17110 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
17120 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
17130 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32  t, OP_Le, r1, r2
17140 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f  , r4, SQLITE_STO
17150 52 45 50 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  REP2);.      sql
17160 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17170 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34  , OP_And, r3, r4
17180 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17190 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
171a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
171b0 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
171c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
171d0 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20  pParse, r4);.   
171e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
171f0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
17200 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
17210 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
17220 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
17230 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
17240 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
17250 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
17260 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17270 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  ..    case TK_TR
17280 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f  IGGER: {.      /
17290 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20  * If the opcode 
172a0 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74  is TK_TRIGGER, t
172b0 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
172c0 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  on is a referenc
172d0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20  e.      ** to a 
172e0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
172f0 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65  w.* or old.* pse
17300 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c  udo-tables avail
17310 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
17320 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
17330 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
17340 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73  Expr.iTable is s
17350 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a  et to 1 for the.
17360 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70        ** new.* p
17370 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20  seudo-table, or 
17380 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20  0 for the old.* 
17390 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78  pseudo-table. Ex
173a0 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  pr.iColumn.     
173b0 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68   ** is set to th
173c0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
173d0 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20  pseudo-table to 
173e0 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74  read, or to -1 t
173f0 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  o.      ** read 
17400 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e  the rowid field.
17410 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17420 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
17430 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
17440 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72   using an OP_Par
17450 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70  am opcode. The p
17460 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d  1.      ** param
17470 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30  eter is set to 0
17480 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69   for an old.rowi
17490 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20  d reference, or 
174a0 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a  to (i+1).      *
174b0 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61  * to reference a
174c0 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66  nother column of
174d0 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
174e0 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a  o-table, where .
174f0 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68        ** i is th
17500 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
17510 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77  olumn. For a new
17520 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
17530 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a  , p1 is.      **
17540 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77   set to (n+1), w
17550 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75  here n is the nu
17560 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
17570 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74  in each pseudo-t
17580 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46  able..      ** F
17590 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  or a reference t
175a0 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75  o any other colu
175b0 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
175c0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31  pseudo-table, p1
175d0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
175e0 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65   to (n+2+i), whe
175f0 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61  re n and i are a
17600 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f  s defined previo
17610 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20  usly. For.      
17620 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
17630 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63  he table on whic
17640 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62  h triggers are b
17650 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20  eing fired is.  
17660 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20      ** declared 
17670 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  as:.      **.   
17680 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
17690 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
176a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
176b0 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65   Then p1 is inte
176c0 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f  rpreted as follo
176d0 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
176e0 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20     **   p1==0   
176f0 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20  ->    old.rowid 
17700 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20      p1==3   ->  
17710 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20    new.rowid.    
17720 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d    **   p1==1   -
17730 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20  >    old.a      
17740 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20     p1==4   ->   
17750 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20   new.a.      ** 
17760 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20    p1==2   ->    
17770 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31  old.b         p1
17780 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==5   ->    new.
17790 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a  b       .      *
177a0 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
177b0 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
177c0 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20  b;.      int p1 
177d0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
177e0 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  * (pTab->nCol+1)
177f0 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43   + 1 + pExpr->iC
17800 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73  olumn;..      as
17810 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
17820 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
17830 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  >iTable==1 );.  
17840 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
17850 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26  r->iColumn>=-1 &
17860 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
17870 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
17880 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
17890 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45  b->iPKey<0 || pE
178a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54  xpr->iColumn!=pT
178b0 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20  ab->iPKey );.   
178c0 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30     assert( p1>=0
178d0 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43   && p1<(pTab->nC
178e0 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20  ol*2+2) );..    
178f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17900 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c  Op2(v, OP_Param,
17910 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   p1, target);.  
17920 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
17930 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25  (v, "%s.%s -> $%
17940 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  d",.        (pEx
17950 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65  pr->iTable ? "ne
17960 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20  w" : "old"),.   
17970 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f       (pExpr->iCo
17980 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22  lumn<0 ? "rowid"
17990 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e   : pExpr->pTab->
179a0 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
179b0 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20  umn].zName),.   
179c0 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20 20       target.    
179d0 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53    ));..#ifndef S
179e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
179f0 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
17a00 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
17a10 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69   has REAL affini
17a20 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65  ty, it may curre
17a30 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61  ntly be stored a
17a40 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  s an.      ** in
17a50 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65  teger. Use OP_Re
17a60 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61  alAffinity to ma
17a70 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72 65  ke sure it is re
17a80 61 6c 6c 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20  ally real.  */. 
17a90 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
17aa0 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20  iColumn>=0 .    
17ab0 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c     && pTab->aCol
17ac0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
17ad0 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
17ae0 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
17af0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17b00 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
17b10 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
17b20 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17b30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
17b40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
17b50 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     /*.    ** For
17b60 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m A:.    **   CA
17b70 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45  SE x WHEN e1 THE
17b80 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
17b90 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
17ba0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
17bb0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
17bc0 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a  * Form B:.    **
17bd0 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20     CASE WHEN e1 
17be0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
17bf0 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
17c00 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
17c10 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
17c20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63    ** Form A is c
17c30 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65  an be transforme
17c40 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76  d into the equiv
17c50 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20  alent form B as 
17c60 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20  follows:.    ** 
17c70 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31    CASE WHEN x=e1
17c80 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d   THEN r1 WHEN x=
17c90 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20  e2 THEN r2 .... 
17ca0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45     **        WHE
17cb0 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45  N x=eN THEN rN E
17cc0 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
17cd0 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74  .    ** X (if it
17ce0 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70   exists) is in p
17cf0 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
17d00 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45 78 70   ** Y is in pExp
17d10 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68 65 20  r->pRight.  The 
17d20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
17d30 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  al.  If there is
17d40 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20   no.    ** ELSE 
17d50 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74  clause and no ot
17d60 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68 65 73  her term matches
17d70 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
17d80 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
17d90 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c  exprssion is NUL
17da0 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20  L..    ** Ei is 
17db0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
17dc0 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69  >a[i*2] and Ri i
17dd0 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  s pExpr->pList->
17de0 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a  a[i*2+1]..    **
17df0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75  .    ** The resu
17e00 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  lt of the expres
17e10 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66  sion is the Ri f
17e20 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  or the first mat
17e30 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a  ching Ei,.    **
17e40 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
17e50 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20  no matching Ei, 
17e60 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c  the ELSE term Y,
17e70 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a   or if there is.
17e80 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74      ** no ELSE t
17e90 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  erm, NULL..    *
17ea0 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61  /.    default: a
17eb0 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41  ssert( op==TK_CA
17ec0 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  SE ); {.      in
17ed0 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20  t endLabel;     
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ef0 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
17f00 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74  r end of CASE st
17f10 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
17f20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20  nextCase;       
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17f40 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
17f50 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65  next WHEN clause
17f60 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
17f70 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
17f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
17f90 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e  x number of WHEN
17fa0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
17fb0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
17fe0 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  r */.      ExprL
17ff0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18010 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72  List of WHEN ter
18020 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  ms */.      stru
18030 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
18040 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a   *aListelem;  /*
18050 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74   Array of WHEN t
18060 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  erms */.      Ex
18070 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20  pr opCompare;   
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18090 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70  /* The X==Ei exp
180a0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
180b0 20 45 78 70 72 20 63 61 63 68 65 58 3b 20 20 20   Expr cacheX;   
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180d0 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70     /* Cached exp
180e0 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20  ression X */.   
180f0 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18110 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78       /* The X ex
18120 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
18130 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20    Expr *pTest = 
18140 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
18150 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f      /* X==Ei (fo
18160 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69  rm A) or just Ei
18170 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20   (form B) */.   
18180 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74     VVA_ONLY( int
18190 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70   iCacheLevel = p
181a0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
181b0 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73  el; )..      ass
181c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
181d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
181e0 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45  xIsSelect) && pE
181f0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a  xpr->x.pList );.
18200 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70 45        assert((pE
18210 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
18220 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a  xpr % 2) == 0);.
18230 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
18240 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
18250 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
18260 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
18270 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c  .pList;.      aL
18280 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74  istelem = pEList
18290 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  ->a;.      nExpr
182a0 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
182b0 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c  ;.      endLabel
182c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
182d0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
182e0 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70    if( (pX = pExp
182f0 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a  r->pLeft)!=0 ){.
18300 20 20 20 20 20 20 20 20 63 61 63 68 65 58 20 3d          cacheX =
18310 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65   *pX;.        te
18320 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
18330 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
18340 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18350 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  X->op==TK_REGIST
18360 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61  ER );.        ca
18370 63 68 65 58 2e 69 54 61 62 6c 65 20 3d 20 73 71  cheX.iTable = sq
18380 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
18390 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72  p(pParse, pX, &r
183a0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
183b0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
183c0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
183d0 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d 20 54     cacheX.op = T
183e0 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20  K_REGISTER;.    
183f0 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70      opCompare.op
18400 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   = TK_EQ;.      
18410 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66    opCompare.pLef
18420 74 20 3d 20 26 63 61 63 68 65 58 3b 0a 20 20 20  t = &cacheX;.   
18430 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
18440 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
18450 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
18460 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
18470 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
18480 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
18490 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
184a0 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
184b0 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
184c0 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
184d0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
184e0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
184f0 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
18500 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
18510 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
18520 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
18530 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
18540 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
18550 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
18560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18570 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
18580 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
18590 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
185a0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
185b0 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
185c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
185d0 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a  rt( pTest!=0 );.
185e0 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
185f0 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
18600 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
18610 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
18620 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
18630 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
18640 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
18650 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
18660 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18670 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
18680 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
18690 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
186a0 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
186b0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
186c0 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20  (pParse, pTest, 
186d0 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45  nextCase, SQLITE
186e0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
186f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18700 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
18710 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
18720 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74  UMN );.        t
18730 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
18740 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
18750 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
18760 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18770 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
18780 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
18790 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
187a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
187b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
187c0 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62  _Goto, 0, endLab
187d0 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
187e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
187f0 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
18800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18810 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
18820 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
18830 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
18840 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
18850 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18860 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
18870 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
18880 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
18890 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
188a0 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
188b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
188c0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
188d0 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
188e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
188f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18900 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
18910 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18920 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
18930 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
18940 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20  rse->nErr>0 .   
18950 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
18960 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d  e->iCacheLevel==
18970 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20  iCacheLevel );. 
18980 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18990 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
189a0 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
189b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
189c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
189d0 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
189e0 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
189f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
18a00 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
18a10 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20  _Rollback .     
18a20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
18a30 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
18a40 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  rt.           ||
18a50 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
18a60 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20  ==OE_Fail.      
18a70 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
18a80 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f  ffinity==OE_Igno
18a90 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  re.      );.    
18aa0 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70    if( !pParse->p
18ab0 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20  TriggerTab ){.  
18ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
18ad0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18af0 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61       "RAISE() ma
18b00 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
18b10 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d  ithin a trigger-
18b20 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
18b30 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
18b40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
18b50 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
18b60 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
18b70 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
18b80 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
18b90 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
18ba0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
18bb0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
18bc0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
18bd0 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
18be0 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20  nity==OE_Ignore 
18bf0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18c00 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
18c10 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f            v, OP_
18c20 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  Halt, SQLITE_OK,
18c30 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70   OE_Ignore, 0, p
18c40 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30  Expr->u.zToken,0
18c50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
18c70 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
18c80 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 61 66 66  arse, pExpr->aff
18c90 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e  inity, pExpr->u.
18ca0 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20  zToken, 0);.    
18cb0 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b    }..      break
18cc0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
18cd0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
18ce0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
18cf0 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
18d00 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18d10 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
18d20 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72  gFree2);.  retur
18d30 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n inReg;.}../*.*
18d40 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18d50 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
18d60 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
18d70 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
18d80 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
18d90 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
18da0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
18db0 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
18dc0 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
18dd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
18de0 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
18df0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
18e00 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
18e10 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
18e20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
18e30 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
18e40 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
18e50 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  ster is not.** a
18e60 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e   temporary, then
18e70 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65   set *pReg to ze
18e80 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
18e90 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50  e3ExprCodeTemp(P
18ea0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
18eb0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a  pr *pExpr, int *
18ec0 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20  pReg){.  int r1 
18ed0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
18ee0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
18ef0 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45  nt r2 = sqlite3E
18f00 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
18f10 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
18f20 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29  ;.  if( r2==r1 )
18f30 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31  {.    *pReg = r1
18f40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
18f50 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18f60 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
18f70 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b  ;.    *pReg = 0;
18f80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
18f90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
18fa0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
18fb0 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
18fc0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
18fd0 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
18fe0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
18ff0 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
19000 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
19010 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
19020 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
19030 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  arget..*/.int sq
19040 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
19050 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
19060 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
19070 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52  rget){.  int inR
19080 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  eg;..  assert( t
19090 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
190a0 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
190b0 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26  );.  if( pExpr &
190c0 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  & pExpr->op==TK_
190d0 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
190e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
190f0 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
19100 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d   OP_Copy, pExpr-
19110 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29  >iTable, target)
19120 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19130 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
19140 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
19150 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
19160 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  et);.    assert(
19170 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c   pParse->pVdbe |
19180 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
19190 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
191a0 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
191b0 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
191c0 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Vdbe ){.      sq
191d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
191e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
191f0 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
19200 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20  target);.    }. 
19210 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61 72 67   }.  return targ
19220 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  et;.}../*.** Gen
19230 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
19240 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69 76  evalutes the giv
19250 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
19260 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c  d puts the resul
19270 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  t.** in register
19280 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   target..**.** A
19290 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  lso make a copy 
192a0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
192b0 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  n results into a
192c0 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72  nother "cache" r
192d0 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d  egister.** and m
192e0 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73  odify the expres
192f0 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65  sion so that the
19300 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
19310 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74   evaluated,.** t
19320 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
19330 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65  opy of the cache
19340 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
19350 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
19360 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73   used for expres
19370 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  sions that are u
19380 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  sed multiple .**
19390 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72   times.  They ar
193a0 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  e evaluated once
193b0 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73   and the results
193c0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
193d0 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64  on.** are reused
193e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
193f0 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65  ExprCodeAndCache
19400 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19410 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
19420 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
19430 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
19440 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67  dbe;.  int inReg
19450 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  ;.  inReg = sqli
19460 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
19470 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
19480 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61  t);.  assert( ta
19490 72 67 65 74 3e 30 20 29 3b 0a 20 20 2f 2a 20 54  rget>0 );.  /* T
194a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
194b0 61 6c 6c 65 64 20 66 6f 72 20 74 65 72 6d 73 20  alled for terms 
194c0 74 6f 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44  to INSERT or UPD
194d0 41 54 45 2e 20 20 41 6e 64 20 74 68 65 20 6f 6e  ATE.  And the on
194e0 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 20 70 6c  ly.  ** other pl
194f0 61 63 65 20 77 68 65 72 65 20 65 78 70 72 65 73  ace where expres
19500 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 63 6f 6e  sions can be con
19510 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 52  verted into TK_R
19520 45 47 49 53 54 45 52 20 69 73 0a 20 20 2a 2a 20  EGISTER is.  ** 
19530 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  in WHERE clause 
19540 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 53 6f 20  processing.  So 
19550 61 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6d 70  as currently imp
19560 6c 65 6d 65 6e 74 65 64 2c 20 74 68 65 72 65 20  lemented, there 
19570 69 73 0a 20 20 2a 2a 20 6e 6f 20 77 61 79 20 66  is.  ** no way f
19580 6f 72 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  or a TK_REGISTER
19590 20 74 6f 20 65 78 69 73 74 20 68 65 72 65 2e 20   to exist here. 
195a0 20 42 75 74 20 69 74 20 73 65 65 6d 73 20 70 72   But it seems pr
195b0 75 64 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6b 65  udent to.  ** ke
195c0 65 70 20 74 68 65 20 41 4c 57 41 59 53 28 29 20  ep the ALWAYS() 
195d0 69 6e 20 63 61 73 65 20 74 68 65 20 63 6f 6e 64  in case the cond
195e0 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 63 68 61  itions above cha
195f0 6e 67 65 20 77 69 74 68 20 66 75 74 75 72 65 0a  nge with future.
19600 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
19610 6e 73 20 6f 72 20 65 6e 68 61 6e 63 65 6d 65 6e  ns or enhancemen
19620 74 73 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ts. */.  if( ALW
19630 41 59 53 28 70 45 78 70 72 2d 3e 6f 70 21 3d 54  AYS(pExpr->op!=T
19640 4b 5f 52 45 47 49 53 54 45 52 29 20 29 7b 20 20  K_REGISTER) ){  
19650 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20  .    int iMem;. 
19660 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72     iMem = ++pPar
19670 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
19680 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19690 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65  v, OP_Copy, inRe
196a0 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45  g, iMem);.    pE
196b0 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d  xpr->iTable = iM
196c0 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f  em;.    pExpr->o
196d0 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  p2 = pExpr->op;.
196e0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
196f0 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 7d  TK_REGISTER;.  }
19700 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b  .  return inReg;
19710 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
19720 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
19730 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a  EE_EXPLAIN)./*.*
19740 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d  * Generate a hum
19750 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c  an-readable expl
19760 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78  anation of an ex
19770 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
19780 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
19790 70 6c 61 69 6e 45 78 70 72 28 56 64 62 65 20 2a  plainExpr(Vdbe *
197a0 70 4f 75 74 2c 20 45 78 70 72 20 2a 70 45 78 70  pOut, Expr *pExp
197b0 72 29 7b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20  r){.  int op;   
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197d0 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65  /* The opcode be
197e0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 63  ing coded */.  c
197f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 69 6e 4f  onst char *zBinO
19800 70 20 3d 20 30 3b 20 20 20 2f 2a 20 42 69 6e 61  p = 0;   /* Bina
19810 72 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ry operator */. 
19820 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 6e   const char *zUn
19830 69 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 55 6e  iOp = 0;   /* Un
19840 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ary operator */.
19850 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
19860 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
19870 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
19880 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
19890 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
198a0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
198b0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
198c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
198d0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
198e0 22 41 47 47 7b 25 64 3a 25 64 7d 22 2c 0a 20 20  "AGG{%d:%d}",.  
198f0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
19900 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  >iTable, pExpr->
19910 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
19920 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19930 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
19940 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
19950 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
19960 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
19970 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
19980 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
19990 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
199a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
199b0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
199c0 20 22 43 4f 4c 55 4d 4e 28 25 64 29 22 2c 20 70   "COLUMN(%d)", p
199d0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
199e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
199f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
19a00 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
19a10 22 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20  "{%d:%d}",.     
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a30 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
19a40 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  Table, pExpr->iC
19a50 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
19a60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19a70 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
19a80 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
19a90 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
19aa0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
19ab0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19ac0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
19ad0 4f 75 74 2c 20 22 25 64 22 2c 20 70 45 78 70 72  Out, "%d", pExpr
19ae0 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20  ->u.iValue);.   
19af0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19b00 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
19b10 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73  Printf(pOut, "%s
19b20 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
19b30 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  en);.      }.   
19b40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19b50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19b60 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
19b70 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  NT.    case TK_F
19b80 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  LOAT: {.      sq
19b90 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
19ba0 74 66 28 70 4f 75 74 2c 22 25 73 22 2c 20 70 45  tf(pOut,"%s", pE
19bb0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
19bc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19bd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
19be0 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
19bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19c00 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
19c10 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
19c20 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
19c30 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
19c40 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
19c50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
19c60 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
19c70 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72  NULL");.      br
19c80 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
19c90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
19ca0 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
19cb0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
19cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19cd0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
19ce0 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%s", pExpr->u.z
19cf0 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
19d00 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
19d10 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
19d20 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
19d30 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
19d40 69 6e 74 66 28 70 4f 75 74 2c 22 56 41 52 49 41  intf(pOut,"VARIA
19d50 42 4c 45 28 25 73 2c 25 64 29 22 2c 0a 20 20 20  BLE(%s,%d)",.   
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d70 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75          pExpr->u
19d80 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78 70 72 2d 3e  .zToken, pExpr->
19d90 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
19da0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19db0 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
19dc0 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
19dd0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
19de0 70 4f 75 74 2c 22 52 45 47 49 53 54 45 52 28 25  pOut,"REGISTER(%
19df0 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  d)", pExpr->iTab
19e00 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
19e10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19e20 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20   TK_AS: {.      
19e30 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
19e40 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
19e50 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72  pLeft);.      br
19e60 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
19e70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
19e80 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
19e90 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
19ea0 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
19eb0 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
19ec0 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
19ed0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
19ee0 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 22 75 6e  char *zAff = "un
19ef0 6b 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  k";.      switch
19f00 28 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  ( sqlite3Affinit
19f10 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
19f20 54 6f 6b 65 6e 29 20 29 7b 0a 20 20 20 20 20 20  Token) ){.      
19f30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
19f40 46 5f 54 45 58 54 3a 20 20 20 20 7a 41 66 66 20  F_TEXT:    zAff 
19f50 3d 20 22 54 45 58 54 22 3b 20 20 20 20 20 62 72  = "TEXT";     br
19f60 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
19f70 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  e SQLITE_AFF_NON
19f80 45 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 4e 4f  E:    zAff = "NO
19f90 4e 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  NE";     break;.
19fa0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
19fb0 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a  ITE_AFF_NUMERIC:
19fc0 20 7a 41 66 66 20 3d 20 22 4e 55 4d 45 52 49 43   zAff = "NUMERIC
19fd0 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
19fe0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
19ff0 46 46 5f 49 4e 54 45 47 45 52 3a 20 7a 41 66 66  FF_INTEGER: zAff
1a000 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 20 20 62   = "INTEGER";  b
1a010 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1a020 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  se SQLITE_AFF_RE
1a030 41 4c 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 52  AL:    zAff = "R
1a040 45 41 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  EAL";     break;
1a050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1a060 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1a070 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53 54 2d  ntf(pOut, "CAST-
1a080 25 73 28 22 2c 20 7a 41 66 66 29 3b 0a 20 20 20  %s(", zAff);.   
1a090 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1a0a0 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1a0b0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
1a0c0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1a0d0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29  rintf(pOut, ")")
1a0e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a0f0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1a100 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
1a110 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
1a120 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  T:      zBinOp =
1a130 20 22 4c 54 22 3b 20 20 20 20 20 62 72 65 61 6b   "LT";     break
1a140 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
1a150 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
1a160 22 4c 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "LE";     break;
1a170 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
1a180 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1a190 47 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  GT";     break;.
1a1a0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
1a1b0 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47       zBinOp = "G
1a1c0 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
1a1d0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20     case TK_NE:  
1a1e0 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4e 45      zBinOp = "NE
1a1f0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1a200 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20    case TK_EQ:   
1a210 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 45 51 22     zBinOp = "EQ"
1a220 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1a230 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20   case TK_IS:    
1a240 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53 22 3b    zBinOp = "IS";
1a250 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a260 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20  case TK_ISNOT:  
1a270 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53 4e 4f 54   zBinOp = "ISNOT
1a280 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
1a290 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20  ase TK_AND:     
1a2a0 7a 42 69 6e 4f 70 20 3d 20 22 41 4e 44 22 3b 20  zBinOp = "AND"; 
1a2b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1a2c0 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a  se TK_OR:      z
1a2d0 42 69 6e 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20  BinOp = "OR";   
1a2e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a2f0 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 42  e TK_PLUS:    zB
1a300 69 6e 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20  inOp = "ADD";   
1a310 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a320 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 42 69   TK_STAR:    zBi
1a330 6e 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20  nOp = "MUL";    
1a340 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a350 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 42 69 6e  TK_MINUS:   zBin
1a360 4f 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20 62  Op = "SUB";    b
1a370 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a380 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 42 69 6e 4f  K_REM:     zBinO
1a390 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 62 72  p = "REM";    br
1a3a0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a3b0 5f 42 49 54 41 4e 44 3a 20 20 7a 42 69 6e 4f 70  _BITAND:  zBinOp
1a3c0 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 62 72 65   = "BITAND"; bre
1a3d0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a3e0 42 49 54 4f 52 3a 20 20 20 7a 42 69 6e 4f 70 20  BITOR:   zBinOp 
1a3f0 3d 20 22 42 49 54 4f 52 22 3b 20 20 62 72 65 61  = "BITOR";  brea
1a400 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
1a410 4c 41 53 48 3a 20 20 20 7a 42 69 6e 4f 70 20 3d  LASH:   zBinOp =
1a420 20 22 44 49 56 22 3b 20 20 20 20 62 72 65 61 6b   "DIV";    break
1a430 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  ;.    case TK_LS
1a440 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20  HIFT:  zBinOp = 
1a450 22 4c 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b  "LSHIFT"; break;
1a460 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
1a470 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22  IFT:  zBinOp = "
1a480 52 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a  RSHIFT"; break;.
1a490 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
1a4a0 41 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 43  AT:  zBinOp = "C
1a4b0 4f 4e 43 41 54 22 3b 20 62 72 65 61 6b 3b 0a 0a  ONCAT"; break;..
1a4c0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
1a4d0 55 53 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55  US:  zUniOp = "U
1a4e0 4d 49 4e 55 53 22 3b 20 62 72 65 61 6b 3b 0a 20  MINUS"; break;. 
1a4f0 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
1a500 3a 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 50  :   zUniOp = "UP
1a510 4c 55 53 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  LUS";  break;.  
1a520 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
1a530 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 42 49 54  :  zUniOp = "BIT
1a540 4e 4f 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  NOT"; break;.   
1a550 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20   case TK_NOT:   
1a560 20 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 22    zUniOp = "NOT"
1a570 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1a580 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20  case TK_ISNULL: 
1a590 20 7a 55 6e 69 4f 70 20 3d 20 22 49 53 4e 55 4c   zUniOp = "ISNUL
1a5a0 4c 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  L"; break;.    c
1a5b0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
1a5c0 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c  zUniOp = "NOTNUL
1a5d0 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  L"; break;..    
1a5e0 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a  case TK_COLLATE:
1a5f0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1a600 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1a610 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1a620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a630 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1a640 2c 22 2e 43 4f 4c 4c 41 54 45 28 25 73 29 22 2c  ,".COLLATE(%s)",
1a650 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1a660 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a670 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
1a680 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
1a690 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53      case TK_CONS
1a6a0 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65  T_FUNC:.    case
1a6b0 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
1a6c0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1a6d0 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20  pFarg;       /* 
1a6e0 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e  List of function
1a6f0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1a700 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 41      if( ExprHasA
1a710 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
1a720 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
1a730 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  ){.        pFarg
1a740 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1a750 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  e{.        pFarg
1a760 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1a770 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1a780 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f   if( op==TK_AGG_
1a790 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
1a7a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1a7b0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1a7c0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 25 64 3a 25  AGG_FUNCTION%d:%
1a7d0 73 28 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s(",.           
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7f0 20 20 70 45 78 70 72 2d 3e 6f 70 32 2c 20 70 45    pExpr->op2, pE
1a800 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1a810 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a820 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a830 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1a840 22 46 55 4e 43 54 49 4f 4e 3a 25 73 28 22 2c 20  "FUNCTION:%s(", 
1a850 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1a860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a870 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20  if( pFarg ){.   
1a880 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a890 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74  ainExprList(pOut
1a8a0 2c 20 70 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , pFarg);.      
1a8b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
1a8c0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1a8d0 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62  t, ")");.      b
1a8e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1a8f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a900 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
1a910 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 7b 0a 20  e TK_EXISTS: {. 
1a920 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a930 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1a940 22 45 58 49 53 54 53 28 22 29 3b 0a 20 20 20 20  "EXISTS(");.    
1a950 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a960 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78  Select(pOut, pEx
1a970 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a  pr->x.pSelect);.
1a980 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a990 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a9a0 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ")");.      brea
1a9b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1a9c0 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
1a9d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a9e0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1a9f0 22 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  "(");.      sqli
1aa00 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
1aa10 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e  (pOut, pExpr->x.
1aa20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
1aa30 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1aa40 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b  intf(pOut, ")");
1aa50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1aa60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1aa70 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  IN: {.      sqli
1aa80 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1aa90 28 70 4f 75 74 2c 20 22 49 4e 28 22 29 3b 0a 20  (pOut, "IN(");. 
1aaa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1aab0 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1aac0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1aad0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1aae0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c  nPrintf(pOut, ",
1aaf0 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  ");.      if( Ex
1ab00 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ab10 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1ab20 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  t) ){.        sq
1ab30 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65  lite3ExplainSele
1ab40 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  ct(pOut, pExpr->
1ab50 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
1ab60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ab70 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1ab80 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45  xprList(pOut, pE
1ab90 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
1aba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1abb0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1abc0 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20  f(pOut, ")");.  
1abd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1abe0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1abf0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
1ac00 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  */..    /*.    *
1ac10 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
1ac20 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
1ac30 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
1ac40 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
1ac50 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
1ac60 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
1ac70 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
1ac80 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
1ac90 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
1aca0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
1acb0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
1acc0 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
1acd0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
1ace0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
1acf0 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
1ad00 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
1ad10 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1ad20 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  X = pExpr->pLeft
1ad30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 59  ;.      Expr *pY
1ad40 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1ad50 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1ad60 20 20 20 20 20 45 78 70 72 20 2a 70 5a 20 3d 20       Expr *pZ = 
1ad70 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1ad80 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
1ad90 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1ada0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 42 45  Printf(pOut, "BE
1adb0 54 57 45 45 4e 28 22 29 3b 0a 20 20 20 20 20 20  TWEEN(");.      
1adc0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1add0 70 72 28 70 4f 75 74 2c 20 70 58 29 3b 0a 20 20  pr(pOut, pX);.  
1ade0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1adf0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1ae00 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ,");.      sqlit
1ae10 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1ae20 75 74 2c 20 70 59 29 3b 0a 20 20 20 20 20 20 73  ut, pY);.      s
1ae30 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1ae40 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a  ntf(pOut, ",");.
1ae50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ae60 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1ae70 5a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Z);.      sqlite
1ae80 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1ae90 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20  Out, ")");.     
1aea0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1aeb0 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
1aec0 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
1aed0 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
1aee0 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
1aef0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1af00 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
1af10 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
1af20 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
1af30 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
1af40 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
1af50 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
1af60 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
1af70 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
1af80 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
1af90 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
1afa0 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
1afb0 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
1afc0 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
1afd0 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
1afe0 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
1aff0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
1b000 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
1b010 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
1b020 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
1b030 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
1b040 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
1b050 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1b060 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b070 28 70 4f 75 74 2c 20 22 25 73 28 25 64 29 22 2c  (pOut, "%s(%d)",
1b080 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70   .          pExp
1b090 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 4e 45 57  r->iTable ? "NEW
1b0a0 22 20 3a 20 22 4f 4c 44 22 2c 20 70 45 78 70 72  " : "OLD", pExpr
1b0b0 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1b0c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b0d0 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a     case TK_CASE:
1b0e0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1b0f0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b100 75 74 2c 20 22 43 41 53 45 28 22 29 3b 0a 20 20  ut, "CASE(");.  
1b110 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b120 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78  inExpr(pOut, pEx
1b130 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
1b140 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b150 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22  Printf(pOut, ","
1b160 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b170 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
1b180 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  pOut, pExpr->x.p
1b190 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  List);.      bre
1b1a0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1b1b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
1b1c0 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
1b1d0 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
1b1e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
1b1f0 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20  pe = "unk";.    
1b200 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1b210 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  >affinity ){.   
1b220 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c       case OE_Rol
1b230 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70 65 20 3d  lback:   zType =
1b240 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62 72   "rollback";  br
1b250 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
1b260 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20 20  e OE_Abort:     
1b270 20 7a 54 79 70 65 20 3d 20 22 61 62 6f 72 74 22   zType = "abort"
1b280 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1b290 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69       case OE_Fai
1b2a0 6c 3a 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  l:       zType =
1b2b0 20 22 66 61 69 6c 22 3b 20 20 20 20 20 20 62 72   "fail";      br
1b2c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
1b2d0 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 20  e OE_Ignore:    
1b2e0 20 7a 54 79 70 65 20 3d 20 22 69 67 6e 6f 72 65   zType = "ignore
1b2f0 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1b300 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1b310 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1b320 70 4f 75 74 2c 20 22 52 41 49 53 45 2d 25 73 28  pOut, "RAISE-%s(
1b330 25 73 29 22 2c 20 7a 54 79 70 65 2c 20 70 45 78  %s)", zType, pEx
1b340 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1b350 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b360 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  }.#endif.  }.  i
1b370 66 28 20 7a 42 69 6e 4f 70 20 29 7b 0a 20 20 20  f( zBinOp ){.   
1b380 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b390 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 28 22  rintf(pOut,"%s("
1b3a0 2c 20 7a 42 69 6e 4f 70 29 3b 0a 20 20 20 20 73  , zBinOp);.    s
1b3b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1b3c0 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
1b3d0 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
1b3e0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1b3f0 70 4f 75 74 2c 22 2c 22 29 3b 0a 20 20 20 20 73  pOut,",");.    s
1b400 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1b410 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
1b420 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c 69  Right);.    sqli
1b430 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b440 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 7d 65  (pOut,")");.  }e
1b450 6c 73 65 20 69 66 28 20 7a 55 6e 69 4f 70 20 29  lse if( zUniOp )
1b460 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1b470 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1b480 22 25 73 28 22 2c 20 7a 55 6e 69 4f 70 29 3b 0a  "%s(", zUniOp);.
1b490 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b4a0 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78  inExpr(pOut, pEx
1b4b0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
1b4c0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b4d0 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a  intf(pOut,")");.
1b4e0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
1b4f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1b500 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
1b510 49 4e 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  IN) */..#if defi
1b520 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1b530 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
1b540 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
1b550 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
1b560 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61  explanation of a
1b570 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
1b580 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1b590 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
1b5a0 74 28 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78  t(Vdbe *pOut, Ex
1b5b0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
1b5c0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1b5d0 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74  List==0 || pList
1b5e0 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ->nExpr==0 ){.  
1b5f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b600 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 28 65  Printf(pOut, "(e
1b610 6d 70 74 79 2d 6c 69 73 74 29 22 29 3b 0a 20 20  mpty-list)");.  
1b620 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
1b630 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78  e if( pList->nEx
1b640 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  pr==1 ){.    sql
1b650 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1b660 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 30  pOut, pList->a[0
1b670 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73  ].pExpr);.  }els
1b680 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1b690 70 6c 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b  plainPush(pOut);
1b6a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1b6b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1b6c0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1b6d0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b6e0 4f 75 74 2c 20 22 69 74 65 6d 5b 25 64 5d 20 3d  Out, "item[%d] =
1b6f0 20 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71   ", i);.      sq
1b700 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
1b710 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 73 71  (pOut);.      sq
1b720 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1b730 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  (pOut, pList->a[
1b740 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
1b750 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b760 6f 70 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20  op(pOut);.      
1b770 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
1b780 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
1b790 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b7a0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 20 41 53  rintf(pOut, " AS
1b7b0 20 25 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69   %s", pList->a[i
1b7c0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
1b7d0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  }.      if( pLis
1b7e0 74 2d 3e 61 5b 69 5d 2e 62 53 70 61 6e 49 73 54  t->a[i].bSpanIsT
1b7f0 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
1b800 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1b810 74 66 28 70 4f 75 74 2c 20 22 20 28 25 73 29 22  tf(pOut, " (%s)"
1b820 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53  , pList->a[i].zS
1b830 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pan);.      }.  
1b840 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d      if( i<pList-
1b850 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20  >nExpr-1 ){.    
1b860 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b870 69 6e 4e 4c 28 70 4f 75 74 29 3b 0a 20 20 20 20  inNL(pOut);.    
1b880 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1b890 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28  lite3ExplainPop(
1b8a0 70 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  pOut);.  }.}.#en
1b8b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
1b8c0 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  BUG */../*.** Re
1b8d0 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 45 78  turn TRUE if pEx
1b8e0 70 72 20 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e  pr is an constan
1b8f0 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  t expression tha
1b900 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
1b910 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72 69 6e  .** for factorin
1b920 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e  g out of a loop.
1b930 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 78    Appropriate ex
1b940 70 72 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a  pressions are:.*
1b950 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 65  *.**    *  Any e
1b960 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65  xpression that e
1b970 76 61 6c 75 61 74 65 73 20 74 6f 20 74 77 6f 20  valuates to two 
1b980 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e  or more opcodes.
1b990 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79  .**.**    *  Any
1b9a0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f   OP_Integer, OP_
1b9b0 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Real, OP_String,
1b9c0 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c   OP_Blob, OP_Nul
1b9d0 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20  l, .**       or 
1b9e0 4f 50 5f 56 61 72 69 61 62 6c 65 20 74 68 61 74  OP_Variable that
1b9f0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1ba00 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61  o be placed in a
1ba10 20 0a 2a 2a 20 20 20 20 20 20 20 73 70 65 63 69   .**       speci
1ba20 66 69 63 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  fic register..**
1ba30 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .** There is no 
1ba40 70 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f 72 69  point in factori
1ba50 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e  ng out single-in
1ba60 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61  struction consta
1ba70 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  nt.** expression
1ba80 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1ba90 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 70 61  e placed in a pa
1baa0 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
1bab0 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64  r.  .** We could
1bac0 20 66 61 63 74 6f 72 20 74 68 65 6d 20 6f 75 74   factor them out
1bad0 2c 20 62 75 74 20 74 68 65 6e 20 77 65 20 77 6f  , but then we wo
1bae0 75 6c 64 20 65 6e 64 20 75 70 20 61 64 64 69 6e  uld end up addin
1baf0 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79  g an.** OP_SCopy
1bb00 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
1bb10 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20 69  move the value i
1bb20 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20  nto the correct 
1bb30 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65  register.** late
1bb40 72 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73 20  r.  We might as 
1bb50 77 65 6c 6c 20 6a 75 73 74 20 75 73 65 20 74 68  well just use th
1bb60 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74 72  e original instr
1bb70 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76  uction and.** av
1bb80 6f 69 64 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  oid the OP_SCopy
1bb90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bba0 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72  isAppropriateFor
1bbb0 46 61 63 74 6f 72 69 6e 67 28 45 78 70 72 20 2a  Factoring(Expr *
1bbc0 70 29 7b 0a 20 20 69 66 28 20 21 73 71 6c 69 74  p){.  if( !sqlit
1bbd0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1bbe0 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20  NotJoin(p) ){.  
1bbf0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
1bc00 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65 78  Only constant ex
1bc10 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 61 70  pressions are ap
1bc20 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 66 61  propriate for fa
1bc30 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  ctoring */.  }. 
1bc40 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26   if( (p->flags &
1bc50 20 45 50 5f 46 69 78 65 64 44 65 73 74 29 3d 3d   EP_FixedDest)==
1bc60 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1bc70 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74  1;  /* Any const
1bc80 61 6e 74 20 77 69 74 68 6f 75 74 20 61 20 66 69  ant without a fi
1bc90 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  xed destination 
1bca0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a  is appropriate *
1bcb0 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  /.  }.  while( p
1bcc0 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29  ->op==TK_UPLUS )
1bcd0 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
1bce0 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
1bcf0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1bd00 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
1bd10 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
1bd20 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20  LOB:.#endif.    
1bd30 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
1bd40 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  :.    case TK_IN
1bd50 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20  TEGER:.    case 
1bd60 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61  TK_FLOAT:.    ca
1bd70 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20  se TK_NULL:.    
1bd80 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
1bd90 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1bda0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42  ( p->op==TK_BLOB
1bdb0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1bdc0 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  se( p->op==TK_VA
1bdd0 52 49 41 42 4c 45 20 29 3b 0a 20 20 20 20 20 20  RIABLE );.      
1bde0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
1bdf0 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  =TK_INTEGER );. 
1be00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1be10 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
1be20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1be30 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c  ( p->op==TK_NULL
1be40 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1be50 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  se( p->op==TK_ST
1be60 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a  RING );.      /*
1be70 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74   Single-instruct
1be80 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77 69  ion constants wi
1be90 74 68 20 61 20 66 69 78 65 64 20 64 65 73 74 69  th a fixed desti
1bea0 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20  nation are.     
1beb0 20 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e 65 20   ** better done 
1bec0 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65 20  in-line.  If we 
1bed0 66 61 63 74 6f 72 20 74 68 65 6d 2c 20 74 68 65  factor them, the
1bee0 79 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a  y will just end.
1bef0 20 20 20 20 20 20 2a 2a 20 75 70 20 67 65 6e 65        ** up gene
1bf00 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f  rating an OP_SCo
1bf10 70 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76  py to move the v
1bf20 61 6c 75 65 20 74 6f 20 74 68 65 20 64 65 73 74  alue to the dest
1bf30 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ination.      **
1bf40 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20   register. */.  
1bf50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1bf60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1bf70 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
1bf80 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70  if( p->pLeft->op
1bf90 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d  ==TK_FLOAT || p-
1bfa0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
1bfb0 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
1bfc0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1bfd0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1bfe0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
1bff0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61  lt: {.      brea
1c000 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
1c010 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
1c020 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
1c030 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
1c040 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72  ion that is appr
1c050 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66  opriate for.** f
1c060 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20  actoring out of 
1c070 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61  a loop, then eva
1c080 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
1c090 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  sion.** into a r
1c0a0 65 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e 76  egister and conv
1c0b0 65 72 74 20 74 68 65 20 65 78 70 72 65 73 73 69  ert the expressi
1c0c0 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47  on into a TK_REG
1c0d0 49 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73 73  ISTER.** express
1c0e0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1c0f0 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72  nt evalConstExpr
1c100 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
1c110 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
1c120 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
1c130 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
1c140 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  e;.  switch( pEx
1c150 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
1c160 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61  se TK_IN:.    ca
1c170 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
1c180 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
1c190 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
1c1a0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
1c1b0 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ATE: {.      ret
1c1c0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1c1d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c1e0 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
1c1f0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
1c200 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
1c210 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20   TK_CONST_FUNC: 
1c220 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  {.      /* The a
1c230 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 66 75  rguments to a fu
1c240 6e 63 74 69 6f 6e 20 68 61 76 65 20 61 20 66 69  nction have a fi
1c250 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  xed destination.
1c260 0a 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74  .      ** Mark t
1c270 68 65 6d 20 74 68 69 73 20 77 61 79 20 74 6f 20  hem this way to 
1c280 61 76 6f 69 64 20 67 65 6e 65 72 61 74 65 64 20  avoid generated 
1c290 75 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f 70  unneeded OP_SCop
1c2a0 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72  y.      ** instr
1c2b0 75 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20  uctions. .      
1c2c0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
1c2d0 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
1c2e0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
1c2f0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1c300 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1c310 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1c320 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
1c330 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
1c340 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   i = pList->nExp
1c350 72 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  r;.        struc
1c360 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1c370 2a 70 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e  *pItem = pList->
1c380 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  a;.        for(;
1c390 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1c3a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1c3b0 66 28 20 41 4c 57 41 59 53 28 70 49 74 65 6d 2d  f( ALWAYS(pItem-
1c3c0 3e 70 45 78 70 72 29 20 29 20 70 49 74 65 6d 2d  >pExpr) ) pItem-
1c3d0 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d  >pExpr->flags |=
1c3e0 20 45 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20   EP_FixedDest;. 
1c3f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c400 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c410 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73    }.  }.  if( is
1c420 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61  AppropriateForFa
1c430 63 74 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29  ctoring(pExpr) )
1c440 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b  {.    int r1 = +
1c450 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1c460 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
1c470 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1c480 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1c490 20 72 31 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20   r1);.    /* If 
1c4a0 72 32 21 3d 72 31 2c 20 69 74 20 6d 65 61 6e 73  r2!=r1, it means
1c4b0 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 72   that register r
1c4c0 31 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  1 is never used.
1c4d0 20 20 54 68 61 74 20 69 73 20 68 61 72 6d 6c 65    That is harmle
1c4e0 73 73 0a 20 20 20 20 2a 2a 20 62 75 74 20 73 75  ss.    ** but su
1c4f0 62 6f 70 74 69 6d 61 6c 2c 20 73 6f 20 77 65 20  boptimal, so we 
1c500 77 61 6e 74 20 74 6f 20 6b 6e 6f 77 20 61 62 6f  want to know abo
1c510 75 74 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  ut the situation
1c520 20 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20   to fix it..    
1c530 2a 2a 20 48 65 6e 63 65 20 74 68 65 20 66 6f 6c  ** Hence the fol
1c540 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 3a 20 2a  lowing assert: *
1c550 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 32  /.    assert( r2
1c560 3d 3d 72 31 20 29 3b 0a 20 20 20 20 70 45 78 70  ==r1 );.    pExp
1c570 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e  r->op2 = pExpr->
1c580 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f  op;.    pExpr->o
1c590 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
1c5a0 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
1c5b0 6c 65 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74  le = r2;.    ret
1c5c0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
1c5d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
1c5e0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
1c5f0 2a 2a 20 50 72 65 65 76 61 6c 75 61 74 65 20 63  ** Preevaluate c
1c600 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72 65  onstant subexpre
1c610 73 73 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45  ssions within pE
1c620 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
1c630 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
1c640 72 65 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69  registers.  Modi
1c650 66 79 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  fy pExpr so that
1c660 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75   the constant su
1c670 62 65 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61  bexpresions.** a
1c680 72 65 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f  re TK_REGISTER o
1c690 70 63 6f 64 65 73 20 74 68 61 74 20 72 65 66 65  pcodes that refe
1c6a0 72 20 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70  r to the precomp
1c6b0 75 74 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  uted values..**.
1c6c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c6d0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1c6e0 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 63 6f  e jump to the co
1c6f0 6f 6b 69 65 2d 63 68 65 63 6b 20 63 6f 64 65 20  okie-check code 
1c700 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  has.** already o
1c710 63 63 75 72 2e 20 20 53 69 6e 63 65 20 74 68 65  ccur.  Since the
1c720 20 63 6f 6f 6b 69 65 2d 63 68 65 63 6b 20 6a 75   cookie-check ju
1c730 6d 70 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  mp is generated 
1c740 70 72 69 6f 72 20 74 6f 0a 2a 2a 20 61 6e 79 20  prior to.** any 
1c750 6f 74 68 65 72 20 73 65 72 69 6f 75 73 20 70 72  other serious pr
1c760 6f 63 65 73 73 69 6e 67 2c 20 74 68 69 73 20 63  ocessing, this c
1c770 68 65 63 6b 20 65 6e 73 75 72 65 73 20 74 68 61  heck ensures tha
1c780 74 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a  t there is no.**
1c790 20 77 61 79 20 74 6f 20 61 63 63 69 64 65 6e 74   way to accident
1c7a0 6c 79 20 62 79 70 61 73 73 20 74 68 65 20 63 6f  ly bypass the co
1c7b0 6e 73 74 61 6e 74 20 69 6e 69 74 69 61 6c 69 7a  nstant initializ
1c7c0 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
1c7d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c  is routine is al
1c7e0 73 6f 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  so a no-op if th
1c7f0 65 20 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f  e SQLITE_FactorO
1c800 75 74 43 6f 6e 73 74 20 6f 70 74 69 6d 69 7a 61  utConst optimiza
1c810 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 69 73 61 62  tion.** is disab
1c820 6c 65 64 20 76 69 61 20 74 68 65 20 73 71 6c 69  led via the sqli
1c830 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1c840 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1c850 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 29 0a  _OPTIMIZATIONS).
1c860 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54  ** interface.  T
1c870 68 69 73 20 61 6c 6c 6f 77 73 20 74 65 73 74 20  his allows test 
1c880 6c 6f 67 69 63 20 74 6f 20 76 65 72 69 66 79 20  logic to verify 
1c890 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e  that the same an
1c8a0 73 77 65 72 20 69 73 0a 2a 2a 20 6f 62 74 61 69  swer is.** obtai
1c8b0 6e 65 64 20 66 6f 72 20 71 75 65 72 69 65 73 20  ned for queries 
1c8c0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
1c8d0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 63 6f 6e  ether or not con
1c8e0 73 74 61 6e 74 73 20 61 72 65 0a 2a 2a 20 70 72  stants are.** pr
1c8f0 65 63 6f 6d 70 75 74 65 64 20 69 6e 74 6f 20 72  ecomputed into r
1c900 65 67 69 73 74 65 72 73 20 6f 72 20 69 66 20 74  egisters or if t
1c910 68 65 79 20 61 72 65 20 69 6e 73 65 72 74 65 64  hey are inserted
1c920 20 69 6e 2d 6c 69 6e 65 2e 0a 2a 2f 0a 76 6f 69   in-line..*/.voi
1c930 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1c940 65 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65  eConstants(Parse
1c950 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1c960 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
1c970 20 77 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   w;.  if( pParse
1c980 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 29 20 72  ->cookieGoto ) r
1c990 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 4f 70 74  eturn;.  if( Opt
1c9a0 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
1c9b0 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
1c9c0 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
1c9d0 6e 73 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  nst) ) return;. 
1c9e0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
1c9f0 20 3d 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72   = evalConstExpr
1ca00 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
1ca10 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 70  lback = 0;.  w.p
1ca20 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
1ca30 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
1ca40 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
1ca50 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1ca60 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
1ca70 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
1ca80 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
1ca90 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
1caa0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
1cab0 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
1cac0 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
1cad0 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
1cae0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1caf0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1cb00 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f  ts evaluated..*/
1cb10 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1cb20 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
1cb30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1cb40 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1cb50 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
1cb60 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
1cb70 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1cb80 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
1cb90 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
1cba0 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
1cbb0 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
1cbc0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61  ts */.  int doHa
1cbd0 72 64 43 6f 70 79 20 20 20 20 20 2f 2a 20 4d 61  rdCopy     /* Ma
1cbe0 6b 65 20 61 20 68 61 72 64 20 63 6f 70 79 20 6f  ke a hard copy o
1cbf0 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
1cc00 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
1cc10 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1cc20 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  tem;.  int i, n;
1cc30 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1cc40 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1cc50 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61   target>0 );.  a
1cc60 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1cc70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e  Vdbe!=0 );  /* N
1cc80 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20 66  ever gets this f
1cc90 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a  ar otherwise */.
1cca0 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78    n = pList->nEx
1ccb0 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  pr;.  for(pItem=
1ccc0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1ccd0 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
1cce0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
1ccf0 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
1cd00 72 3b 0a 20 20 20 20 69 6e 74 20 69 6e 52 65 67  r;.    int inReg
1cd10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1cd20 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1cd30 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
1cd40 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67  );.    if( inReg
1cd50 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20  !=target+i ){.  
1cd60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cd70 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
1cd80 64 62 65 2c 20 64 6f 48 61 72 64 43 6f 70 79 20  dbe, doHardCopy 
1cd90 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53  ? OP_Copy : OP_S
1cda0 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1cdc0 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  Reg, target+i);.
1cdd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1cde0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
1cdf0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1ce00 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   a BETWEEN opera
1ce10 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20  tor..**.**    x 
1ce20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
1ce30 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
1ce40 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1ce50 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20   .**.**    x>=y 
1ce60 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43  AND x<=z.**.** C
1ce70 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
1ce80 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
1ce90 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
1cea0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c  expression.** el
1ceb0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e  ementation of x.
1cec0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ced0 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
1cee0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1cef0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
1cf00 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1cf10 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1cf20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
1cf30 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45     /* The BETWEE
1cf40 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
1cf50 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
1cf60 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1cf70 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20   if the jump is 
1cf80 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a  taken */.  int j
1cf90 75 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20  umpIfTrue,   /* 
1cfa0 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
1cfb0 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
1cfc0 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  true */.  int ju
1cfd0 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54  mpIfNull    /* T
1cfe0 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1cff0 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e  the BETWEEN is N
1d000 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ULL */.){.  Expr
1d010 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a   exprAnd;     /*
1d020 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   The AND operato
1d030 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78  r in  x>=y AND x
1d040 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63  <=z  */.  Expr c
1d050 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54  ompLeft;    /* T
1d060 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a  he  x>=y  term *
1d070 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67  /.  Expr compRig
1d080 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c  ht;   /* The  x<
1d090 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =z  term */.  Ex
1d0a0 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20  pr exprX;       
1d0b0 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78  /* The  x  subex
1d0c0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
1d0d0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
1d0e0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
1d0f0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20   register */..  
1d100 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1d110 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1d120 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1d130 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70  .  exprX = *pExp
1d140 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  r->pLeft;.  expr
1d150 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
1d160 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74  .  exprAnd.pLeft
1d170 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20   = &compLeft;.  
1d180 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d  exprAnd.pRight =
1d190 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63   &compRight;.  c
1d1a0 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
1d1b0 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  GE;.  compLeft.p
1d1c0 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
1d1d0 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74   compLeft.pRight
1d1e0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1d1f0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1d200 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20   compRight.op = 
1d210 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67  TK_LE;.  compRig
1d220 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ht.pLeft = &expr
1d230 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  X;.  compRight.p
1d240 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
1d250 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
1d260 70 72 3b 0a 20 20 65 78 70 72 58 2e 69 54 61 62  pr;.  exprX.iTab
1d270 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  le = sqlite3Expr
1d280 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1d290 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65   &exprX, &regFre
1d2a0 65 31 29 3b 0a 20 20 65 78 70 72 58 2e 6f 70 20  e1);.  exprX.op 
1d2b0 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
1d2c0 20 69 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20   if( jumpIfTrue 
1d2d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1d2e0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1d2f0 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
1d300 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1d310 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1d320 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1d330 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
1d340 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1d350 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1d360 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1d370 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
1d380 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61  ;..  /* Ensure a
1d390 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76  dequate test cov
1d3a0 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63  erage */.  testc
1d3b0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1d3c0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1d3d0 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
1d3e0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1d3f0 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1d400 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1d410 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
1d420 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1d430 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1d440 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1d450 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1d460 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1d470 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1d480 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1d490 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
1d4a0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1d4b0 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1d4c0 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1d4d0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
1d4e0 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1d4f0 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1d500 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1d510 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
1d520 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1d530 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1d540 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1d550 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1d560 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1d570 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1d580 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1d590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1d5a0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
1d5b0 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
1d5c0 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
1d5d0 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
1d5e0 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
1d5f0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1d600 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
1d610 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
1d620 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
1d630 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
1d640 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
1d650 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
1d660 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
1d670 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
1d680 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
1d690 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
1d6a0 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
1d6b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
1d6c0 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
1d6d0 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FNULL..**.** Thi
1d6e0 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
1d6f0 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
1d700 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
1d710 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
1d720 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
1d730 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
1d740 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
1d750 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
1d760 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1d770 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
1d780 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
1d790 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
1d7a0 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
1d7b0 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
1d7c0 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
1d7d0 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
1d7e0 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
1d7f0 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
1d800 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
1d810 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1d820 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
1d830 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
1d840 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1d850 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
1d860 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1d870 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
1d880 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
1d890 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1d8a0 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
1d8b0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1d8c0 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
1d8d0 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
1d8e0 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
1d8f0 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
1d900 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1d910 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
1d920 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
1d930 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65  R(v==0) )     re
1d940 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 61  turn;  /* Exista
1d950 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
1d960 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
1d970 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
1d980 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  pr==0) ) return;
1d990 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73    /* No way this
1d9a0 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20   can happen */. 
1d9b0 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
1d9c0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1d9d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1d9e0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
1d9f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1da00 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1da10 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1da20 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1da30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1da40 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1da50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1da60 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1da70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1da80 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  d2,jumpIfNull^SQ
1da90 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1daa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1dab0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1dac0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1dad0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1dae0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1daf0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1db00 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
1db10 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1db20 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
1db30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1db40 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
1db50 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  R: {.      testc
1db60 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1db70 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1db80 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1db90 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1dba0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1dbb0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1dbc0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1dbd0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1dbe0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1dbf0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1dc00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1dc10 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
1dc20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1dc30 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1dc40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1dc50 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1dc60 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1dc70 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1dc80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1dc90 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1dca0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
1dcb0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
1dcc0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
1dcd0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
1dce0 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
1dcf0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  _EQ: {.      ass
1dd00 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  ert( TK_LT==OP_L
1dd10 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
1dd20 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20  t( TK_LE==OP_Le 
1dd30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1dd40 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b   TK_GT==OP_Gt );
1dd50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1dd60 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  K_GE==OP_Ge );. 
1dd70 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1dd80 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  EQ==OP_Eq );.   
1dd90 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45     assert( TK_NE
1dda0 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
1ddb0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ddc0 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
1ddd0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
1dde0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
1ddf0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29  ase( op==TK_GT )
1de00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1de10 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ( op==TK_GE );. 
1de20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1de30 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
1de40 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1de50 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_NE );.      t
1de60 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1de70 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1de80 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1de90 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1dea0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1deb0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1dec0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1ded0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1dee0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1def0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1df00 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1df10 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1df20 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1df30 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1df40 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1df50 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1df60 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ll);.      testc
1df70 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1df80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1df90 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1dfa0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1dfb0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1dfc0 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1dfd0 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20  K_ISNOT: {.     
1dfe0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1dff0 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IS );.      te
1e000 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1e010 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  SNOT );.      r1
1e020 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e030 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e040 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1e050 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1e060 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1e070 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e080 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1e090 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1e0a0 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
1e0b0 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
1e0c0 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  E;.      codeCom
1e0d0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1e0e0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
1e0f0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51  r1, r2, dest, SQ
1e120 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
1e130 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1e140 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1e150 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1e160 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1e170 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e180 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
1e190 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
1e1a0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
1e1b0 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
1e1c0 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  L==OP_IsNull );.
1e1d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e1e0 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
1e1f0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65  Null );.      te
1e200 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1e210 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
1e220 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e230 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
1e240 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1e250 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e260 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1e270 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1e280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e290 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
1e2a0 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
1e2b0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1e2c0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1e2d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e2e0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
1e2f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1e300 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1e310 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
1e320 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
1e330 78 70 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75  xpr, dest, 1, ju
1e340 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1e350 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1e360 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e370 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
1e380 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
1e390 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
1e3a0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
1e3b0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1e3c0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
1e3d0 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  ll = jumpIfNull 
1e3e0 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46  ? dest : destIfF
1e3f0 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  alse;.      sqli
1e400 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
1e410 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1e420 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
1e430 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1e440 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e450 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
1e460 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
1e470 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1e480 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
1e490 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1e4a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1e4b0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
1e4c0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1e4d0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e4e0 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
1e4f0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
1e500 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1e510 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73  , OP_If, r1, des
1e520 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
1e530 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e540 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1e550 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e560 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1e570 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e580 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1e590 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1e5a0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1e5b0 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
1e5c0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1e5d0 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20  rse, regFree2); 
1e5e0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   .}../*.** Gener
1e5f0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
1e600 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
1e610 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
1e620 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
1e630 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
1e640 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
1e650 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
1e660 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
1e670 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
1e680 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
1e690 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
1e6a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
1e6b0 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
1e6c0 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
1e6d0 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
1e6e0 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
1e6f0 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
1e700 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
1e710 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f  ULL or fall thro
1e720 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ugh if jumpIfNul
1e730 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f  l.** is 0..*/.vo
1e740 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
1e750 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61  False(Parse *pPa
1e760 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1e770 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
1e780 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
1e790 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1e7a0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
1e7b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1e7c0 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
1e7d0 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
1e7e0 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
1e7f0 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
1e800 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
1e810 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
1e820 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
1e830 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
1e840 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 61 6e 63  urn; /* Existanc
1e850 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
1e860 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
1e870 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1e880 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a     return;..  /*
1e890 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45   The value of pE
1e8a0 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61  xpr->op and op a
1e8b0 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f  re related as fo
1e8c0 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
1e8d0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20              op. 
1e8f0 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d   **       ------
1e900 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  ---          ---
1e910 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20  -------.  **    
1e920 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20     TK_ISNULL    
1e930 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c        OP_NotNull
1e940 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
1e950 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f  OTNULL         O
1e960 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  P_IsNull.  **   
1e970 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20      TK_NE       
1e980 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a         OP_Eq.  *
1e990 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20  *       TK_EQ   
1e9a0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65             OP_Ne
1e9b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
1e9c0 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
1e9d0 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Le.  **       
1e9e0 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20  TK_LE           
1e9f0 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20     OP_Gt.  **   
1ea00 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20      TK_GE       
1ea10 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a         OP_Lt.  *
1ea20 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20  *       TK_LT   
1ea30 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65             OP_Ge
1ea40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f  .  **.  ** For o
1ea50 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70  ther values of p
1ea60 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20  Expr->op, op is 
1ea70 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e  undefined and un
1ea80 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76  used..  ** The v
1ea90 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20  alue of TK_ and 
1eaa0 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  OP_ constants ar
1eab0 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20  e arranged such 
1eac0 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e  that we.  ** can
1ead0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70   compute the map
1eae0 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67  ping above using
1eaf0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
1eb00 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20  xpression..  ** 
1eb10 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79  Assert()s verify
1eb20 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74   that the comput
1eb30 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74  ation is correct
1eb40 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28  ..  */.  op = ((
1eb50 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53  pExpr->op+(TK_IS
1eb60 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f  NULL&1))^1)-(TK_
1eb70 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a  ISNULL&1);..  /*
1eb80 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20   Verify correct 
1eb90 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f  alignment of TK_
1eba0 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
1ebb0 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
1ebc0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1ebd0 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  ISNULL || op==OP
1ebe0 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  _NotNull );.  as
1ebf0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1ec00 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f  =TK_NOTNULL || o
1ec10 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  p==OP_IsNull );.
1ec20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1ec30 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70  >op!=TK_NE || op
1ec40 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73  ==OP_Eq );.  ass
1ec50 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1ec60 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_EQ || op==OP_
1ec70 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ne );.  assert( 
1ec80 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54  pExpr->op!=TK_LT
1ec90 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b   || op==OP_Ge );
1eca0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1ecb0 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f  ->op!=TK_LE || o
1ecc0 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73  p==OP_Gt );.  as
1ecd0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1ece0 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GT || op==OP
1ecf0 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Le );.  assert(
1ed00 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
1ed10 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29  E || op==OP_Lt )
1ed20 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
1ed30 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
1ed40 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
1ed50 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1ed60 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1ed70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1ed80 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1ed90 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1eda0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1edb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1edc0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1edd0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1ede0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1edf0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ee00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1ee10 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
1ee20 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
1ee30 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1ee40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ee50 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1ee60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ee70 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1ee80 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1ee90 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1eea0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1eeb0 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c  t, d2, jumpIfNul
1eec0 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
1eed0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
1eee0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1eef0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1ef00 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1ef10 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1ef20 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1ef30 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
1ef40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ef50 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
1ef60 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
1ef70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ef80 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
1ef90 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1efa0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1efb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1efc0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1efd0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1efe0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1eff0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f000 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
1f010 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
1f020 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
1f030 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
1f040 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
1f050 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
1f060 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1f070 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
1f080 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f090 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
1f0a0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f0b0 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
1f0c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f0d0 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
1f0e0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
1f0f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f100 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
1f110 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f120 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f130 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1f140 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f150 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f160 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1f170 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1f180 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f190 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f1a0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1f1b0 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
1f1c0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1f1d0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1f1e0 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f200 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
1f210 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1f220 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f230 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1f240 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f250 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1f260 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f270 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1f280 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
1f290 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1f2a0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1f2b0 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
1f2c0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
1f2d0 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
1f2e0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f2f0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f300 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f310 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f320 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1f330 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f340 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1f350 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1f360 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70        op = (pExp
1f370 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  r->op==TK_IS) ? 
1f380 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20  TK_NE : TK_EQ;. 
1f390 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1f3a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f3b0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1f3c0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1f3e0 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45  r2, dest, SQLITE
1f3f0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
1f400 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f410 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1f420 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f430 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1f440 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f450 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1f460 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1f470 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  LL: {.      test
1f480 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1f490 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
1f4a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1f4b0 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
1f4c0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1f4d0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1f4e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1f4f0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1f500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f510 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
1f520 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1f530 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f540 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f550 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f560 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
1f570 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f580 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f590 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
1f5a0 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
1f5b0 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70  r, dest, 0, jump
1f5c0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1f5d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1f5e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f5f0 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
1f600 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
1f610 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   if( jumpIfNull 
1f620 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f630 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
1f640 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1f650 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
1f660 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1f670 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
1f680 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1f690 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
1f6a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1f6b0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
1f6c0 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c   dest, destIfNul
1f6d0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1f6e0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1f6f0 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
1f700 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1f710 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1f720 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
1f730 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  t: {.      r1 = 
1f740 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f750 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f760 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
1f770 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f780 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
1f790 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  ot, r1, dest, ju
1f7a0 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
1f7b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f7c0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1f7d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f7e0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f7f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f800 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1f810 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1f820 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1f830 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1f840 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1f850 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a  regFree2);.}../*
1f860 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
1f870 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
1f880 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
1f890 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
1f8a0 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
1f8b0 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65  sions are comple
1f8c0 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20  tely identical. 
1f8d0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
1f8e0 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a  y differ only.**
1f8f0 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70   by a COLLATE op
1f900 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f  erator at the to
1f910 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e  p level.  Return
1f920 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20   2 if there are 
1f930 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f  differences.** o
1f940 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f  ther than the to
1f950 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20  p-level COLLATE 
1f960 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
1f970 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72  Sometimes this r
1f980 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1f990 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65  rn 2 even if the
1f9a0 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
1f9b0 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65  .** really are e
1f9c0 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77  quivalent.  If w
1f9d0 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74  e cannot prove t
1f9e0 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
1f9f0 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74  ons are.** ident
1fa00 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20  ical, we return 
1fa10 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  2 just to be saf
1fa20 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
1fa30 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
1fa40 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f  s 2, then you do
1fa50 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77   not really know
1fa60 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20   for certain if 
1fa70 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65  the two.** expre
1fa80 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
1fa90 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75  ame.  But if you
1faa0 20 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65   get a 0 or 1 re
1fab0 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a  turn, then you.*
1fac0 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  * can be sure th
1fad0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
1fae0 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20  e the same.  In 
1faf0 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65  the places where
1fb00 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1fb10 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65   is used, it doe
1fb20 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65  s not hurt to ge
1fb30 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74  t an extra 2 - t
1fb40 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68  hat.** just migh
1fb50 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65  t result in some
1fb60 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72   slightly slower
1fb70 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75   code.  But retu
1fb80 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f  rning.** an inco
1fb90 72 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75  rrect 0 or 1 cou
1fba0 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c  ld lead to a mal
1fbb0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
1fbc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1fbd0 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78  are(Expr *pA, Ex
1fbe0 70 72 20 2a 70 42 29 7b 0a 20 20 69 66 28 20 70  pr *pB){.  if( p
1fbf0 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20  A==0||pB==0 ){. 
1fc00 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41     return pB==pA
1fc10 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20   ? 0 : 2;.  }.  
1fc20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1fc30 41 6e 79 50 72 6f 70 65 72 74 79 28 70 41 2c 20  AnyProperty(pA, 
1fc40 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
1fc50 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 61 73  Reduced) );.  as
1fc60 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e  sert( !ExprHasAn
1fc70 79 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50  yProperty(pB, EP
1fc80 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
1fc90 64 75 63 65 64 29 20 29 3b 0a 20 20 69 66 28 20  duced) );.  if( 
1fca0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1fcb0 70 41 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pA, EP_xIsSelect
1fcc0 29 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  ) || ExprHasProp
1fcd0 65 72 74 79 28 70 42 2c 20 45 50 5f 78 49 73 53  erty(pB, EP_xIsS
1fce0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
1fcf0 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
1fd00 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
1fd10 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
1fd20 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
1fd30 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
1fd40 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21  2;.  if( pA->op!
1fd50 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69  =pB->op ){.    i
1fd60 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
1fd70 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
1fd80 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
1fd90 70 4c 65 66 74 2c 20 70 42 29 3c 32 20 29 7b 0a  pLeft, pB)<2 ){.
1fda0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1fdb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
1fdc0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
1fdd0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
1fde0 6f 6d 70 61 72 65 28 70 41 2c 20 70 42 2d 3e 70  ompare(pA, pB->p
1fdf0 4c 65 66 74 29 3c 32 20 29 7b 0a 20 20 20 20 20  Left)<2 ){.     
1fe00 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1fe10 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
1fe20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1fe30 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
1fe40 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
1fe50 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
1fe60 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1fe70 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
1fe80 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29  t, pB->pRight) )
1fe90 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
1fea0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1feb0 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c  Compare(pA->x.pL
1fec0 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74  ist, pB->x.pList
1fed0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
1fee0 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
1fef0 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41  pB->iTable || pA
1ff00 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
1ff10 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
1ff20 32 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  2;.  if( ExprHas
1ff30 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f  Property(pA, EP_
1ff40 49 6e 74 56 61 6c 75 65 29 20 29 7b 0a 20 20 20  IntValue) ){.   
1ff50 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
1ff60 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e 74  perty(pB, EP_Int
1ff70 56 61 6c 75 65 29 20 7c 7c 20 70 41 2d 3e 75 2e  Value) || pA->u.
1ff80 69 56 61 6c 75 65 21 3d 70 42 2d 3e 75 2e 69 56  iValue!=pB->u.iV
1ff90 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alue ){.      re
1ffa0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
1ffb0 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70  }else if( pA->op
1ffc0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41  !=TK_COLUMN && A
1ffd0 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54 4b  LWAYS(pA->op!=TK
1ffe0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20  _AGG_COLUMN) && 
1fff0 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 7b 0a 20  pA->u.zToken){. 
20000 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
20010 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 49 6e  operty(pB, EP_In
20020 74 56 61 6c 75 65 29 20 7c 7c 20 4e 45 56 45 52  tValue) || NEVER
20030 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30  (pB->u.zToken==0
20040 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
20050 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d    if( strcmp(pA-
20060 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
20070 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
20080 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f      return pA->o
20090 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20  p==TK_COLLATE ? 
200a0 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  1 : 2;.    }.  }
200b0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
200c0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
200d0 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
200e0 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ts.  Return 0 if
200f0 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
20100 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d  cal and .** non-
20110 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66  zero if they dif
20120 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
20130 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
20140 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ne might return 
20150 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75  non-zero for equ
20160 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74  ivalent ExprList
20170 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20  s.  The.** only 
20180 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  consequence will
20190 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74   be disabled opt
201a0 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74  imizations.  But
201b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
201c0 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75   must never retu
201d0 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20  rn 0 if the two 
201e0 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
201f0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20   are different, 
20200 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74  or.** a malfunct
20210 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e  ion will result.
20220 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
20230 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e  pointers are con
20240 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68  sidered to be th
20250 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e  e same.  But a N
20260 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61  ULL pointer.** a
20270 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72  lways differs fr
20280 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f  om a non-NULL po
20290 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
202a0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
202b0 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70  pare(ExprList *p
202c0 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 29  A, ExprList *pB)
202d0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
202e0 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20   pA==0 && pB==0 
202f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
20300 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
20310 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
20320 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42  f( pA->nExpr!=pB
20330 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e  ->nExpr ) return
20340 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   1;.  for(i=0; i
20350 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  <pA->nExpr; i++)
20360 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
20370 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45  rA = pA->a[i].pE
20380 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
20390 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d  ExprB = pB->a[i]
203a0 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
203b0 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pA->a[i].sortOrd
203c0 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72  er!=pB->a[i].sor
203d0 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20  tOrder ) return 
203e0 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  1;.    if( sqlit
203f0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
20400 78 70 72 41 2c 20 70 45 78 70 72 42 29 20 29 20  xprA, pExprB) ) 
20410 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
20420 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
20430 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
20440 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
20450 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
20460 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61  d by the tree wa
20470 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74  lker.** to count
20480 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
20490 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  able columns in 
204a0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66  the arguments of
204b0 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74   an .** aggregat
204c0 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f  e function, in o
204d0 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
204e0 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  t the.** sqlite3
204f0 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28  FunctionThisSrc(
20500 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
20510 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a  ruct SrcCount {.
20520 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
20530 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63     /* One partic
20540 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ular FROM clause
20550 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65   in a nested que
20560 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69  ry */.  int nThi
20570 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
20580 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
20590 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70   to columns in p
205a0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  SrcList */.  int
205b0 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a   nOther;      /*
205c0 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
205d0 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
205e0 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63   in other FROM c
205f0 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lauses */.};../*
20600 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
20610 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
20620 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  es to columns..*
20630 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
20640 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72  rSrcCount(Walker
20650 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
20660 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68  *pExpr){.  /* Th
20670 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65  e NEVER() on the
20680 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20   second term is 
20690 62 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 46  because sqlite3F
206a0 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
206b0 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77  rc().  ** is alw
206c0 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72  ays called befor
206d0 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
206e0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
206f0 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a   and so the.  **
20700 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65   TK_COLUMNs have
20710 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
20720 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f  nverted into TK_
20730 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a  AGG_COLUMN.  If.
20740 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63    ** sqlite3Func
20750 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
20760 29 20 69 73 20 75 73 65 64 20 64 69 66 66 65 72  ) is used differ
20770 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74  ently in the fut
20780 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45  ure, the.  ** NE
20790 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20  VER() will need 
207a0 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a  to be removed. *
207b0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
207c0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
207d0 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d  NEVER(pExpr->op=
207e0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
207f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
20800 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
20810 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  t *p = pWalker->
20820 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20  u.pSrcCount;.   
20830 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
20840 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f   p->pSrc;.    fo
20850 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
20860 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
20870 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
20880 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  le==pSrc->a[i].i
20890 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
208a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
208b0 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  pSrc->nSrc ){.  
208c0 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a      p->nThis++;.
208d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
208e0 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20   p->nOther++;.  
208f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20900 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
20910 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
20920 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  e if any of the 
20930 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
20940 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20   pExpr Function 
20950 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72  reference.** pSr
20960 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74  cList.  Return t
20970 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20  rue if they do. 
20980 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75   Also return tru
20990 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e if the functio
209a0 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75  n.** has no argu
209b0 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c  ments or has onl
209c0 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  y constant argum
209d0 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61  ents.  Return fa
209e0 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20  lse if pExpr.** 
209f0 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d  references colum
20a00 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d  ns but not colum
20a10 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75  ns of tables fou
20a20 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a  nd in pSrcList..
20a30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75  */.int sqlite3Fu
20a40 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
20a50 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53  c(Expr *pExpr, S
20a60 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
20a70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
20a80 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74   struct SrcCount
20a90 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20   cnt;.  assert( 
20aa0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
20ab0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
20ac0 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
20ad0 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
20ae0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
20af0 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e  prSrcCount;.  w.
20b00 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63  u.pSrcCount = &c
20b10 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d  nt;.  cnt.pSrc =
20b20 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74   pSrcList;.  cnt
20b30 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e  .nThis = 0;.  cn
20b40 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20  t.nOther = 0;.  
20b50 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
20b60 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78  ist(&w, pExpr->x
20b70 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  .pList);.  retur
20b80 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c  n cnt.nThis>0 ||
20b90 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a   cnt.nOther==0;.
20ba0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
20bb0 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
20bc0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
20bd0 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
20be0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
20bf0 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
20c00 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
20c10 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
20c20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
20c30 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
20c40 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
20c50 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
20c60 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
20c70 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
20c80 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
20c90 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
20ca0 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
20cb0 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
20cc0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
20cd0 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  ol[0]),.       &
20ce0 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
20cf0 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
20d00 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
20d10 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
20d20 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
20d30 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
20d40 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
20d50 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
20d60 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
20d70 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
20d80 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
20d90 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
20da0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
20db0 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74  ggInfoFunc(sqlit
20dc0 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
20dd0 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
20de0 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  ;.  pInfo->aFunc
20df0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
20e00 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
20e10 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66  db, .       pInf
20e20 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->aFunc,.      
20e30 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
20e40 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20  Func[0]),.      
20e50 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
20e60 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
20e70 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
20e80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
20e90 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63  the xExprCallbac
20ea0 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c  k for a tree wal
20eb0 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64  ker.  It is used
20ec0 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
20ed0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
20ee0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
20ef0 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
20f00 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
20f10 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
20f20 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
20f30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20f40 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
20f50 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
20f60 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
20f70 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
20f80 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
20f90 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
20fa0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
20fb0 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
20fc0 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
20fd0 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
20fe0 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
20ff0 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67  gInfo = pNC->pAg
21000 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68  gInfo;..  switch
21010 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
21020 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
21030 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
21040 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
21050 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
21060 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
21070 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
21080 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
21090 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
210a0 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
210b0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f  to see if the co
210c0 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f  lumn is in one o
210d0 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  f the tables in 
210e0 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a  the FROM.      *
210f0 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
21100 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
21110 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
21120 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29  AYS(pSrcList!=0)
21130 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
21140 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21150 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73  *pItem = pSrcLis
21160 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f  t->a;.        fo
21170 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73  r(i=0; i<pSrcLis
21180 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
21190 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
211a0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
211b0 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  _col *pCol;.    
211c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
211d0 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
211e0 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
211f0 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
21200 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
21210 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
21220 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
21230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21240 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
21250 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
21260 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
21270 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
21280 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21290 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
212a0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
212b0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
212c0 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
212d0 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
212e0 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
212f0 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
21300 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
21310 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
21320 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
21330 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
21340 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
21350 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21360 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
21370 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
21380 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
21390 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
213a0 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
213b0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
213c0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
213d0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
213e0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
213f0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
21400 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
21410 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
21420 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
21430 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
21440 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
21450 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
21460 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
21470 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
21480 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
21490 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
214a0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
214b0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
214c0 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
214d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
214e0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
214f0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
21500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
21510 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
21520 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
21530 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
21540 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
21550 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
21560 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
21570 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
21580 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
21590 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b   pCol->iMem = ++
215a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
215b0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
215c0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
215d0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
215e0 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
215f0 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
21600 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
21610 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
21620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21630 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
21640 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
21650 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
21660 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
21680 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
21690 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
216a0 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
216b0 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
216c0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
216d0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
216e0 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
216f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21700 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
21710 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
21730 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
21740 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
21750 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
21760 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
21770 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
21780 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
21790 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
217b0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
217c0 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
217d0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
217e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
217f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21820 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
21830 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
21840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21850 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
21860 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
21870 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
21880 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
21890 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
218a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
218b0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
218c0 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
218d0 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
218e0 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
218f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
21900 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
21910 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
21920 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
21930 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
21940 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
21950 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
21960 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
21970 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
21980 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
21990 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
219a0 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
219b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
219c0 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64      ExprSetIrred
219d0 75 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 20  ucible(pExpr);. 
219e0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
219f0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
21a00 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  gInfo;.         
21a10 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
21a20 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20  K_AGG_COLUMN;.  
21a30 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
21a40 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a  >iAgg = (i16)k;.
21a50 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
21a60 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f  k;.          } /
21a70 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69  * endif pExpr->i
21a80 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
21a90 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  ursor */.       
21aa0 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f   } /* end loop o
21ab0 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a  ver pSrcList */.
21ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
21ad0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
21ae0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
21af0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
21b00 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43  {.      if( (pNC
21b10 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49  ->ncFlags & NC_I
21b20 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20  nAggFunc)==0.   
21b30 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e      && pWalker->
21b40 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78  walkerDepth==pEx
21b50 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b  pr->op2.      ){
21b60 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
21b70 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
21b80 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
21b90 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
21ba0 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
21bb0 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
21bc0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
21bd0 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
21be0 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
21bf0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
21c00 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
21c10 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
21c20 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
21c30 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
21c40 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
21c50 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
21c60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
21c70 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d  prCompare(pItem-
21c80 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29 3d 3d  >pExpr, pExpr)==
21c90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
21ca0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
21cb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
21cc0 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67        if( i>=pAg
21cd0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a  gInfo->nFunc ){.
21ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78            /* pEx
21cf0 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20  pr is original. 
21d00 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72   Make a new entr
21d10 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  y in pAggInfo->a
21d20 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20  Func[].         
21d30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38   */.          u8
21d40 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
21d50 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  e->db);.        
21d60 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f    i = addAggInfo
21d70 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  Func(pParse->db,
21d80 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20   pAggInfo);.    
21d90 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29        if( i>=0 )
21da0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
21db0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
21dc0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21dd0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
21de0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
21df0 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46   = &pAggInfo->aF
21e00 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  unc[i];.        
21e10 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
21e20 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
21e30 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65        pItem->iMe
21e40 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
21e50 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
21e60 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
21e70 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
21e80 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
21e90 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
21ea0 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  m->pFunc = sqlit
21eb0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
21ec0 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
21ee0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73  xpr->u.zToken, s
21ef0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
21f00 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c  Expr->u.zToken),
21f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21f20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69      pExpr->x.pLi
21f30 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st ? pExpr->x.pL
21f40 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
21f50 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
21f60 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
21f70 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
21f80 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nct ){.         
21f90 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
21fa0 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
21fb0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
21fc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21fd0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
21fe0 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
21ff0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22000 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22010 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
22020 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20  ake pExpr point 
22030 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
22040 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  te pAggInfo->aFu
22050 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20  nc[] entry.     
22060 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
22070 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e  sert( !ExprHasAn
22080 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  yProperty(pExpr,
22090 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
220a0 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
220b0 20 20 20 20 20 45 78 70 72 53 65 74 49 72 72 65       ExprSetIrre
220c0 64 75 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a  ducible(pExpr);.
220d0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
220e0 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20  Agg = (i16)i;.  
220f0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
22100 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
22110 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
22120 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
22130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22140 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
22150 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
22160 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22170 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
22180 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
22190 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
221a0 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57  elect(Walker *pW
221b0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
221c0 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45  Select){.  UNUSE
221d0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c  D_PARAMETER(pWal
221e0 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ker);.  UNUSED_P
221f0 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74  ARAMETER(pSelect
22200 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
22210 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
22220 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70  ** Analyze the p
22230 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20  Expr expression 
22240 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
22250 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
22260 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
22270 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
22280 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67  o be added to Ag
22290 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  gInfo object tha
222a0 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a  t pNC->pAggInfo.
222b0 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ** points to.  A
222c0 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
222d0 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68  s are made on th
222e0 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74  e AggInfo object
222f0 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79   as.** necessary
22300 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22310 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
22320 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
22330 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
22340 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
22350 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52  yzed by sqlite3R
22360 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
22370 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
22380 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
22390 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
223a0 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
223b0 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
223c0 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
223d0 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
223e0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
223f0 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
22400 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63  gate;.  w.xSelec
22410 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  tCallback = anal
22420 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
22430 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43  elect;.  w.u.pNC
22440 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74   = pNC;.  assert
22450 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
22460 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  =0 );.  sqlite3W
22470 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
22480 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  r);.}../*.** Cal
22490 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
224a0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
224b0 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
224c0 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
224d0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
224e0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
224f0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
22500 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
22510 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
22520 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
22530 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
22540 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
22550 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
22560 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
22570 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
22580 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
22590 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
225a0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
225b0 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
225c0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
225d0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
225e0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
225f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
22600 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
22610 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
22620 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
22630 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
22640 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65   a single new re
22650 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74  gister for use t
22660 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65  o hold some inte
22670 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e  rmediate result.
22680 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
22690 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
226a0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
226b0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
226c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
226d0 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
226e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
226f0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
22700 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  --pParse->nTempR
22710 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  eg];.}../*.** De
22720 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73  allocate a regis
22730 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69  ter, making avai
22740 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20  lable for reuse 
22750 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  for some other.*
22760 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a  * purpose..**.**
22770 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
22780 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  s currently bein
22790 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  g used by the co
227a0 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  lumn cache, then
227b0 0a 2a 2a 20 74 68 65 20 64 61 6c 6c 6f 63 61 74  .** the dallocat
227c0 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20  ion is deferred 
227d0 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e  until the column
227e0 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74   cache line that
227f0 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67   uses.** the reg
22800 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74  ister becomes st
22810 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ale..*/.void sql
22820 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
22830 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
22840 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
22850 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
22860 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
22870 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
22880 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69  empReg) ){.    i
22890 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
228a0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
228b0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50     for(i=0, p=pP
228c0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
228d0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
228e0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
228f0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52  .      if( p->iR
22900 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
22910 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
22920 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
22930 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
22940 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  }.    pParse->aT
22950 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
22960 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
22970 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
22980 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
22990 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
229a0 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
229b0 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a  ve registers.*/.
229c0 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
229d0 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
229e0 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29  Parse, int nReg)
229f0 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
22a00 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
22a10 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
22a20 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
22a30 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b    if( nReg<=n ){
22a40 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 75 73  .    assert( !us
22a50 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
22a60 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31  pParse, i, i+n-1
22a70 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ) );.    pParse-
22a80 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52  >iRangeReg += nR
22a90 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
22aa0 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65  nRangeReg -= nRe
22ab0 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
22ac0 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  i = pParse->nMem
22ad0 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
22ae0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
22af0 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
22b00 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
22b10 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72  aseTempRange(Par
22b20 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
22b30 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b  iReg, int nReg){
22b40 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
22b50 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
22b60 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20  , iReg, nReg);. 
22b70 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65   if( nReg>pParse
22b80 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20  ->nRangeReg ){. 
22b90 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
22ba0 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20  eReg = nReg;.   
22bb0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
22bc0 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  eg = iReg;.  }.}
22bd0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c  ../*.** Mark all
22be0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
22bf0 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e  ters as being un
22c00 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
22c10 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  use..*/.void sql
22c20 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
22c30 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
22c40 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
22c50 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  nTempReg = 0;.  
22c60 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
22c70 67 20 3d 20 30 3b 0a 7d 0a                       g = 0;.}.